Ia04 bureau de vote E.Blanc et N.Redouin
lancement
commande à lancer : go get gitlab.utc.fr/blancedo/ia04 go install gitlab.utc.fr/blancedo/ia04/td3/agt/launch/launch_ballot
Si cela ne fonctionne pas, il faut lancer la fonction main du fichier go: td3/agt/launch/launch_ballot/launch_ballot.go Le programme vous demandera quelle méthode de vote vous voulez ainsi que le nombre d'alternatives et de votant.
les méthodes de votes
les méthodes de votes que nous avons implémenté sont :
- Borda
- Condorcet
- Copeland,
- STV
- Majority
Elles sont stockées dans le dossier td3/comsoc ainsi que les fonctions de TieBreak factory.
Côté serveur
Les fonctions sont stockées dans td3/agt/ballotagent/ballot.go, c'est dans ses focntions que les checks de sécurité et intégrité: timeout, len(liste de préférence) == nombre d' alternative, votant n'a pas déjà voté etc. sont faites.
initiier un ballot
http://127.0.0.1:8080/new_ballot permet de créer un ballot avec un JSON de ce type par méthode POST
{ "id": "ballot_1", "rule": "Borda", // Condorcet, Copeland, Approbation, STV ou Majority "deadline": "2023-12-31T00:00:00Z", "voters": ["voter1", "voter2"], "alts": 3, "tie_break": [1, 2, 3], "seuil": [10] }
http://127.0.0.1:8080/get_ballot permet de récupérer le ballot avec la méthode GET
initier un vote pour un agent
http://127.0.0.1:8080/vote permet de créer un vote pour un des votants d'un ballot avec la méthode POST
{ "voteur_id": "voter1", "ballot_id" : "ballot_1", "prefs" : [1,2,3], "options" : [0] } { "voteur_id": "voter2", "ballot_id" : "ballot_1", "prefs" : [3,2,1], "options" : [0] }
lancer un vote
http://127.0.0.1:8080/result va lancer la procédure de vote selon la méthode de vote choisie lors de l'initialisation du ballot. Pour cela nous avons juste besoint du ballot_id car le serveur garde les ballots.
type Result_request struct {
Ballot_id string json : "ballot_id"
}
Côté client
Les agents "clients" sont stocké dans le dossier td3/agt/agent. Nous avons créé trois types d'agents, pour les trois tâches différentes nécessaires. Les agents communiquent avec le serveur par protocole http à travers les fonctions doRequest() et treatResponse() et se lance avec la fonction start. On utilise les fonctions json: Marshal() et Unmarschal() pour encoder et décoder les requêtes des côtés clients et serveurs.
1 - Un agent permettant de créer un ballot (AgentCreantBallot.go)
Grâce à cette agent on peut envoyer une requête au serveur contenant toute les informations nécessaires afin de créer un nouveau ballot.
2 - Un agent permettant de voter
Plusieurs agents de ce type devront être initialisé , chacun d'eux permettra d'initialisé le vote d'un votant pour un ballot.
3 - Un agent permettant de lancer la procédure de vote
Cet agent permet de lancer le vote d'un ballot une fois que tout les votants ont voté. Le serveur retourne à l'agent le numéro du ballot, le vainqueur ainsi que les partcipants classés dans l'ordre décroissant.
Launch / programme main
launch_serv.go
Pour seulement lancer le serveur on peut lancer le main de ia04\td3\agt\launch\launch_serv\launch_serv.go, ensuite on peut lancer les requêtes à la main grâce à un gestionnaire de requêtes.
launch_ballot.go
Dans ce fichier on simule un vote du début à la fin. Tout d'abord on demande des informations au client:
- quel méthode de vote ?
- le nombre de votant ?
- le nombre d'alternative ?
- la deadline est automatiquement J+1
- l'ordre du tiebreak est généré aléatoirement par rapport au nombre d'alternatives
Le ballot est alors créé
Ensuite les votants sont créent dans une boucle par rapport au nombre de votant:
- Leur préférence est créé aléatoirement par rapport au nombre d'alternative
- le vote est ensuite enregistré au ballot et le booléen Has_voted du ballot est actualisé pour ce votant
Enfin l'agent "result" lance la procédure de vote et affiche le résultat grâce aux fonctions de vote stockés dans le dossier cosmoc.