En fait, c'est dans le cadre d'un stage de recherche en mathématiques, donc la question revêt une certaine importance. J'ai repris complètement mon programme et j'en ai écrit une nouvelle version; cela ne change strictement rien, je n'ai toujours pas les résultats demandés.
Dans un article de 1975, 4 candidats:
3 votants 1/9
5 0.13888
7 0.15003
9 0.15595
11 0.15963
13 0.16214
limite: 0.17458
Pour mon programme première version (toujours réalisé avec 10 000 itérations):
3 0.1748
5 0.2119
7 0.2220
9 0.2326
11 0.2370
deuxième version (10 000 itérations):
3 0.1699
5 0.2112
7 0.2209
9 0.2307
11 0.2486
Bref,on ne trouve pas les bons résultats.
Pour ceux que cela intéresse, voici les codes de la première version:
function s=votcond(m,n,p) %m alternatives, n votants p itérations
compteurgeneral=0;
for k=1:p
matrice=zeros(n,m);
for e=1:n*m
matrice(e)=floor((e-1)/n)+1;
end;
for f=1:n
for g=1:m
z=floor((m+1-g)*rand+g);
c=matrice(f,z);
matrice(f,z)=matrice(f,g);
matrice(f,g)=c;
end;
end;
A=zeros(m,m);
for e=1:m-1
for f=e+1:m
a=0;
for g=1:n
a=a+sign(matrice(g,f)-matrice(g,e));
end;
A(e,f)=-sign(a);
A(f,e)=sign(a);
end;
end;
y=1;
if (A(1,2)==A(2,3)&A(2,3)==A(3,4)&A(3,4)==A(4,1)),y=0;end;
if (A(1,2)==A(2,4)&A(2,4)==A(3,1)&A(3,1)==A(4,3)),y=0;end;
if (A(1,3)==A(2,4)&A(2,4)==A(3,2)&A(3,2)==A(4,1)),y=0;end;
if (A(1,3)==A(2,1)&A(2,1)==A(3,4)&A(3,4)==A(4,2)),y=0;end;
if (A(1,4)==A(2,3)&A(2,3)==A(3,1)&A(3,1)==A(4,2)),y=0;end;
if (A(1,4)==A(2,1)&A(2,1)==A(3,2)&A(3,2)==A(4,3)),y=0;end;
if (A(1,2)+A(1,3)==0&A(1,3)+A(2,3)==0),y=0;end;
if (A(1,2)+A(1,4)==0&A(1,4)+A(2,4)==0),y=0;end;
if (A(2,3)+A(2,4)==0&A(2,4)+A(3,4)==0),y=0;end;
if (A(1,3)+A(1,4)==0&A(1,4)+A(3,4)==0),y=0;end;
compteurgeneral=compteurgeneral+y;
end;
s=compteurgeneral;
deuxième version:
function s=votcond(m,n,p) %m alternatives, n votants p itérations
compteurgeneral=0;
for k=1:p
matrice=zeros(n,m);
for e=1:n*m
matrice(e)=floor((e-1)/n)+1;
end;
for f=1:n
for g=1:m
z=floor((m+1-g)*rand+g);
c=matrice(f,z);
matrice(f,z)=matrice(f,g);
matrice(f,g)=c;
end;
end;
A=zeros(m,m);
for e=1:m-1
for f=e+1:m
a=0;
for g=1:n
a=a+sign(matrice(g,f)-matrice(g,e));
end;
A(e,f)=-sign(a);
A(f,e)=sign(a);
end;
end;
y=1;
a=0;
c=0;
for u=1:m
b=0;
d=0;
for v=1:m
b=max(b,A(u,v));
d=max(d,A(v,u));
end;
a=[a b];
c=[c d];
end;
ggg=0;
vec=a+c;
for w=2:m+1
if vec(w)==2,ggg=ggg+1;end;
end;
if ggg>2,y=0;end;
compteurgeneral=compteurgeneral+y;
end;
s=compteurgeneral;
Les débuts des deux versions sont pareil: on simule la création d'une matrice n*m, avec dans chaque ligne, les chiffres de 1 à m dans le désordre. C'est le choix du votant de la ligne correspondante. Exemple s'il y a cinq électeurs et trois candidats:
3 1 2
1 2 3
2 1 3
3 2 1
1 3 2
Ainsi, le premier votant préfère le candidat numéro 1 (il lui a donné trois points), ensuite c'est le candidat numéro trois (qui a deux points) ensuite c'est le candidat numéro deux (un point seulement).
Ensuite, je créée une matrice de préférence, de taille m*m, pour regarder si tel candidat est préféré à tel autre.
Est-ce que le candidat un est préféré au candidat deux?
Le premier électeur préfère le candidat 1 au candidat 2, le deuxième électeur non, le troisième oui, le quatrième oui, le cinquième non. Bref, globalement, le premier candidat est préféré au deuxième. On met donc un 1 dans la première ligne deuxième colonne et un -1 dans la deuxième ligne première colonne. On trouve finalement comme matrice (e mettant arbitrairement des zéros sur la diagonale):
0 1 -1
-1 0 -1
1 1 0
Iln'y pas de cycle de condorcet. En effet, un cycle de condorcet implique au moins trois personnes, et le deuxième candidat n'est préféré à personne (-1 dans la deuxième ligne).
Donc pour trois candidats, c'est simple, il suffit de rajouter un compteur, et c'est bon. Pour quatre candidats, la grande question est: comment identifier un cycle de condorcet (ou montrer qu'il n'en existe pas) à partir de la matrice de préférence de taille 4*4?
Et c'est là que cela coince.
pour la première version, je me suis embêté à écrire tous les cycles possibles, à voir ce que cela donnait comme condition, et à les écrire mathématiquement. Il y a 9 conditions possibles, 9 cas possibles, six cycles de quatre, quatre conditions sur les cycles de trois (en fait il y a huit cycles possibles mais je les ai regroupés deux par deux).
Pour la deuxième version, (mais c'est peut être faux), je me suis aperçu qu'en écrivant les conditions détaillées, cela revenait à prendre le vecteur du maximum de chaque ligne, prendre le vecteur du maximum de chaque colonne, additionner les deux, et on avait cycle de Condorcet si et seulement si il y avait au moins 3 fois le chiffre 2 dans le vecteur somme (attention, ce n'est plus vrai avec cinq candidats). Ce qui est rassurant c'est que les résultats coïncident grosso modo. Donc c'est pour cela que je me suis dit qu'en 1975 ils ne devaient pas avoir de machines perfectionnées et que c'était cet article qui était faux. Alors, c'est vrai, il y a peut être une erreur dans ces programmes (d'ailleurs, en rédigeant, j'en ai repéré une, cela ne m'a pas permis de trouver des résultats collant à l'article, mais au moins grâce à la correction de l'erreur, mes résultats concordent à peu près entre eux).