E.6900 – Une nouvelle gouvernance
Probl`eme propos´e par Jean-Louis Legrand :
Le conseil d’administration de la startup Math.com d´ecide de d´esigner les trois membres de son comit´e ex´ecutif parmi sept candidats ext´erieurs `a l’entreprise. Chaque membre du conseil d’administration doit d´esigner trois noms. Apr`es le vote, une synth`ese est faite par un programme informatique qui d´etermine une ou plusieurs listes de trois candidats de sorte que chaque membre, quel que soit son vote, y trouvera au moins l’un des candidats pour lesquels il a vot´e. Quel est le nombre maximum N de membres du conseil d’administration qui garantit que le programme informatique donnera au moins une liste de trois candidats ? Pour les plus courageux : avec un comit´e ex´ecutif de trois membres d´eterminer la valeur de N en fonction du nombre k de candidats (k≥3).
Solution, cod´ee en Python 3, propos´ee par Marc Foubert
On cherche `a concevoir un algorithme donnant le nombre de votants minimum n´ecessaire pour mettre cette d´emocratie avanc´ee en d´efaut.
On d´efinit :
— La liste des votes en constructionvotes;
— La liste des votes potentiels posVotes;
— La liste des r´esultats potentiels de l’´electionresults.
On raisonne ensuite it´erativement :
0. Initialement, votes est vide, posVotes et results sont les ensembles de trois entiers distincts dans{1, . . . , k}.
1. Pour chaque votevdansposVotes, on compte le nombre de r´esultats potentiels quevexcluerait.
2. On choisit le vote maximisant ce nombre, on l’ajoute `avotes, on l’enl`eve deposVoteset on met results`a jour.
3. Tant que results est non vide (i.e. tant qu’il reste au moins un r´esultat potentiel satisfaisant tous les votes dansvotes), on r´ep`ete les ´etapes 1 et 2.
4. On renvoievotes, ainsi que sa longueur, qui donne donc une borne sup´erieure du r´esultat.
Cette m´ethode s’est av´er´ee satisfaisante dans plusieurs cas, cependant on a obtenuN = 14 pour le cas avec 7 candidats, or on savait ce r´esultat strictement sup´erieur `a la bonne r´eponse. C’est pourquoi on a ´etoff´e l’algorithme de la mani`ere suivante :
Apr`es avoir obtenu une premi`ere liste votes par la m´ethode pr´ec´edente, l’algorithme essaie de la r´eduire, en faisant pour chaque paire(u,v)de votes propos´es :
4. On supprimeuet vde votes, on met r´einitialiseposVoteset resultsen rajoutant les r´esultats redevenus satisfaisants du fait de cette suppression.
5. On r´ep`ete les ´etapes 1 et 2 du proc´ed´e dans l’espoir de n’avoir `a rajouter qu’un seul ´el´ement.
On obtient ainsi un exemple avec 12 votants mettant en d´efaut la d´emocratie avanc´ee pour 7 candidats et trois ´elus :
[3,4,7], [2,5,7], [1,3,5], [2,3,4], [1,6,7], [1,3,4], [1,4,5], [4,5,6], [1,2,6], [1,2,7], [3,5,6], [2,6,7]
1
Figure1 – Extrait du code Python. La fonction completeVote(votes,posVotes,results)r´ealise les
´
etapes 1, 2 et 3 pour les arguments donn´es.
Les caract´eristiques des contre-exemples obtenus sont regroup´ees dans le tableau ci-dessous :
Figure 2 – Meilleurs contre-exemples obtenus par le programme
2