Combinatoire
Olympiades mathématiques, énigmes et défis
-
fatal_error
- Modérateur
- Messages: 6610
- Enregistré le: 22 Nov 2007, 13:00
-
par fatal_error » 22 Aoû 2014, 17:47
bonjour Bramant,
je suis plus intéressé par l'algorithme!
de mon côté passer par les la matrice d'adjacence en stockant les blocks est beaucoup trop long.
la vie est une fête
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 22 Aoû 2014, 18:17
Bonne nouvelle!
J`ai trouve mieux.
Construire pour n+1 un ensemble de combinaisons partant de n
A partir de 10 j`obtiens pour 11 ces 11 combinaisons :
3-5-7-8-9
1-2-3-4-5
1-2-6-7-8
1-3-6-9-10
2-4-7-9-10
4-5-6-8-10
1-4-8-9-11
1-5-7-10-11
2-3-8-10-11
2-5-6-9-11
3-4-6-7-11
Donc a partir de 11 je peux obtenir les combinaisons pour 12.
J`ignore si c`est optimal cependant.
Hourrah!
Je posterai plus tard... et au fur et a mesure.
Je suis very happy!!!
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 22 Aoû 2014, 18:19
fatal_error a écrit:bonjour Bramant,
je suis plus intéressé par l'algorithme!
de mon côté passer par les la matrice d'adjacence en stockant les blocks est beaucoup trop long.
Sur que je le posterai une fois sur et certain que c`est optimal mais comme je l`ai dit dans l`autre post j`ai trouve mieux et plus facile encore.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 22 Aoû 2014, 18:21
Bramant52 a écrit:Salut Groucho,
Tu trouves quel maximum pour (18,5)?
Moi je trouve 66 combinaisons, je les ai postees.
Apres avoir fait des tests, je pense, comme dit precedemment, avoir trouve le principe de solution : le tri croise.
La je poste les maximums (a plus ou moins un pres) pour tout n=10 jusqu`a 30.
n max(+ou-1)
10 6
11 10
12 14
13 19
14 26
15 34
16 43
17 53
18 65
19 78
20 94
21 111
22 129
23 150
24 173
25 199
26 225
27 256
28 288
29 323
30 361
L`approximation a plus ou moins un pres depend de la divisibilite par 5.
J`essaie d`ameliorer ma formule.
Pour 18 j`avais trouve 66 et ma formule me donne 65.
Pour n=25 il faut compter un maximum de 199 voire 200 et non 135.
A plus tard
Jusqu`a present ma formule semble marcher a +1 ou -1 pres.
Pour (18,5) j`obtiens 66 au lieu de 65
Pour (11,5) j`obtiens 11 au lieu de 10.
Y a encore des trucs a regler pour avoir la formule exacte.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 22 Aoû 2014, 18:46
Bramant52 a écrit:Bonne nouvelle!
J`ai trouve mieux.
Construire pour n+1 un ensemble de combinaisons partant de n
A partir de 10 j`obtiens pour 11 ces 11 combinaisons :
3-5-7-8-9
1-2-3-4-5
1-2-6-7-8
1-3-6-9-10
2-4-7-9-10
4-5-6-8-10
1-4-8-9-11
1-5-7-10-11
2-3-8-10-11
2-5-6-9-11
3-4-6-7-11
Donc a partir de 11 je peux obtenir les combinaisons pour 12.
J`ignore si c`est optimal cependant.
Hourrah!
Je posterai plus tard... et au fur et a mesure.
Je suis very happy!!!
Decu!
Cela ne marche pas pour 12.
Je suis very sad.
Je retourne a mon algorithme precedent d`extraction de la sous-matrice carree et symetrique (optimal? je n`en sais rien).
Je continuerai plus tard.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 22 Aoû 2014, 23:38
L`extraction de la sous-matrice est probablement optimal sauf que je ne vois pas comment le prouver.
J`essaierai de mettre l`algorithme au propre des que possible.
A demain peut-etre.
-
fatal_error
- Modérateur
- Messages: 6610
- Enregistré le: 22 Nov 2007, 13:00
-
par fatal_error » 23 Aoû 2014, 12:12
je pense avoir un optimal, mais j'ai pas pu tester, pas le temps, je testerai lundi
voila un pseudo code.
l'idée est de parquer des 1 en haut à gauche.
Si la ligne à 5 1 consecutifs
pour la ligne suivante de choisir celle à placer qui a le plus de 1 sur les 5 premières colonnes (puisqu'on peut les permuter sans modifier la premiere ligne)
et ainsi de suite.
- Code: Tout sélectionner
function nb=consecutiveOnes(row)
for i=1:lengt(row)
if row(i)==0
return i-1
end
end
endfunction
function [index,count]=biggestRowIndex(M)
bestIndex=1;
bestCount=consecutiveOnes(M(bestIndex,:));
for i=1:length(M)
count=consecutiveOnes(M(i,:));
if count>bestCount
bestCount=count;
bestIndex=i;
end
end
return bestIndex;
endfunction
function M=permuteRow(i,j,M)
rowTemp=M(i,:);
M(i,:)=M(j,:);
M(j,:)=rowTemp;
endfunction
function [index, count]=biggestNumberOfOnes(minIndex, maxCol,M)
bestIndex=minIndex;
bestCount=sum(M(minIndex,1:maxCol));
for i=minIndex:length(M)
count=sum(M(i,1:maxCol));
if count>bestCount
bestCount=count;
bestIndex=i;
end
end
return [bestIndex, bestCount];
endfunction
function shiftOnesToLeft(index, maxCol, M)
for index=1:maxCol
if M(index, j)==0
done = false;
for other=maxCol:index+1
if M(index, other) == 1
permuteRow(index, other, M');
done = true;
end
end
if done == false
return;
end
end
end
return M;
endfunction
function main()
[index,count]=biggestRowIndex(M);
M=permute(1,index,M);
i=1
while count >= i
i++;
[index,count]=biggestNumberOfOnes(i, count,M);
permuteRow(index, i,M);
shiftOnesToLeft(i,count,M);
end
//plot M
endfunction
la vie est une fête
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 23 Aoû 2014, 13:43
Y a quelque chose qui cloche et que je n`arrive pas a comprendre.
Je tente mon algorithme d`extraction de la sous-matrice, il me sort 11 combinaisons pour (12,5) :
1-2-3-4-5
1-2-6-7-8
1-3-7-10-11
1-4-8-9-10
1-5-6-9-11
2-3-8-9-11
2-4-6-10-11
2-5-7-9-10
3-4-6-7-9
3-5-6-8-10
4-5-7-8-11
Il ne me sort pas le nombre 12. Bien sur, on peut placer le 12 a la place de 2 ou 3 nombre 11 ou 10 pour equilibrer les frequences.
Je continue a reflechir ou a produire manuellement plus de 11 pour (12,5).
Je devrai theoriquement atteindre 14 combinaisons au lieu de 11 pour le (12,5).
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 23 Aoû 2014, 13:50
fatal_error a écrit:je pense avoir un optimal, mais j'ai pas pu tester, pas le temps, je testerai lundi
voila un pseudo code.
l'idée est de parquer des 1 en haut à gauche.
Si la ligne à 5 1 consecutifs
pour la ligne suivante de choisir celle à placer qui a le plus de 1 sur les 5 premières colonnes (puisqu'on peut les permuter sans modifier la premiere ligne)
et ainsi de suite.
- Code: Tout sélectionner
function nb=consecutiveOnes(row)
for i=1:lengt(row)
if row(i)==0
return i-1
end
end
endfunction
function [index,count]=biggestRowIndex(M)
bestIndex=1;
bestCount=consecutiveOnes(M(bestIndex,:));
for i=1:length(M)
count=consecutiveOnes(M(i,:));
if count>bestCount
bestCount=count;
bestIndex=i;
end
end
return bestIndex;
endfunction
function M=permuteRow(i,j,M)
rowTemp=M(i,:);
M(i,:)=M(j,:);
M(j,:)=rowTemp;
endfunction
function [index, count]=biggestNumberOfOnes(minIndex, maxCol,M)
bestIndex=minIndex;
bestCount=sum(M(minIndex,1:maxCol));
for i=minIndex:length(M)
count=sum(M(i,1:maxCol));
if count>bestCount
bestCount=count;
bestIndex=i;
end
end
return [bestIndex, bestCount];
endfunction
function shiftOnesToLeft(index, maxCol, M)
for index=1:maxCol
if M(index, j)==0
done = false;
for other=maxCol:index+1
if M(index, other) == 1
permuteRow(index, other, M');
done = true;
end
end
if done == false
return;
end
end
end
return M;
endfunction
function main()
[index,count]=biggestRowIndex(M);
M=permute(1,index,M);
i=1
while count >= i
i++;
[index,count]=biggestNumberOfOnes(i, count,M);
permuteRow(index, i,M);
shiftOnesToLeft(i,count,M);
end
//plot M
endfunction
Salut,
Tu postes tes programmes sans aucun resultat.
Comment alors juger de tes programmes?
Poste tes resultats pour (18,5) ou (15,5) ou (12,5) juste pour voir.
Merci
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 23 Aoû 2014, 19:33
J`ai essaye, sans succes malheureusement, de trouver pour (12,5) plus de 11 combinaisons.
La recherche d`une sous-matrice (carree et symetrique) donne une solution de maniere tres rapide une fois le programme ameliore.
La solution n`est peut-etre pas optimale. Je n`en sais rien jusqu`a present.
Precision : j`utilise Excel.
Je pars d`une matrice d`intersection : en lignes on a nos combinaisons et en colonnes une image identique de ces memes combinaisons.
La diagonale (en haut a gauche vers le bas a droite) est composee de 5. Chaque combinaison a 5 en commun avec elle-meme.
Je transforme cette matrice carree et symetrique en 0 et 1.
Je remplace les valeurs d`intersection : 5,0,1,2 en 1 et les valeurs 3,4 en 0.
Cela me donne une matrice carree et symetrique composee de 1 et de 0.
Pour chaque ligne j`ai une fonction sommatoire de chaque ligne.
Cette fonction me sert de guide.
Au lieu de faire un tri croise qui suppose un programme, je classe mes colonnes au fur et a mesure les 1 d`abord suivis des zeros.
A chaque classement de colonnes je supprime les lignes zero, ce qui reduit ma matrice.
Je copie les combinaisons en lignes en les transposant en colonnes.
Je verifie ma fonction sommatoire et je classe en fonction. Donc prochaine colonne de tri : celle qui a le plus grand nombre de 1. Souvent il y en a plusieurs de meme valeur, j`en choisis une.
Je reclasse en fonction de la colonne choisie et je supprime les lignes zeros de la colonne concernee.
Je procede de cette facon par iteration jusqu`a n`avoir que des 1 dans une seule sous- matrice caree et symetrique.
C`est ma solution.
Pour (12,5) cela m`a pris 20 minutes (sans macros).
Un programme bien ficele ferait cela en un centiemme de seconde meme pour n=100.
Voila mon algorithme ou plutot ma recette de "cuisine"
Programmeurs, a vos claviers!
et publiez vos resultats svp comme je le fais.
Des questions?
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 24 Aoû 2014, 19:52
J`ai essaye l`algorithme d`extraction de la sous-matrice, il me sort 28 combinaisons pour (15,5)
1-2-3-4-5
1-2-6-7-8
3-4-6-7-9
1-3-8-9-10
2-5-6-9-10
4-5-7-8-10
1-4-6-10-11
1-5-7-9-11
2-3-7-10-11
2-4-8-9-11
3-5-6-8-11
1-2-9-12-13
3-4-8-12-13
5-6-7-12-13
1-3-6-12-14
1-3-7-13-15
2-4-6-12-15
2-4-7-13-14
3-5-10-12-15
1-5-10-13-14
1-8-11-12-15
2-5-11-12-14
7-9-10-12-14
4-5-11-13-15
2-8-10-13-15
6-7-11-14-15
3-9-11-13-14
1-4-9-14-15
Apparemment ce n`est pas optimal puisque tu as reussi a sortir 29 (voir plus haut).
Je ne les ai pas verifie.
Je donne mes resultats au fur et a mesure.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 24 Aoû 2014, 19:58
Je viens de verifier tes 29 combinaisons pour (15,5), c`est bon.
Ou bien j`ai fait une erreur vu que je travaille sur Excel de maniere manuelle ou bien alors l`algorithme d`extraction de la sous-matrice n`est pas optimal.
Bref, je laisse decanter tout cela un moment.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 25 Aoû 2014, 15:48
Salut,
Je viens de trouver un algorithme bien plus simple pour extraire une sous-matrice carree et symetrique.
Je teste pour l`instant.
Pour certaines valeurs de (n,5) on peut trouver les solutions de n+1 connaissant les combinaisons solutions de n. Je commence a comprendre pourquoi.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 25 Aoû 2014, 21:21
Merci pour les interventions.
Probleme resolu, je passe a autre chose.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 26 Aoû 2014, 13:53
Pour (12,5) j`obtiens 12 combinaisons avec le nouvel algorithme :
1-2-3-4-5
1-2-6-7-8
1-2-9-10-11
1-3-6-9-12
1-4-7-10-12
1-5-8-11-12
2-3-7-11-12
2-4-8-9-12
2-5-6-10-12
3-4-6-8-10
3-5-7-8-9
4-5-6-7-11
Je pense que le nouvel algorithme sort l`optimum.
Donc j`abandonne le piste extraction de sous-matrice.
Il est encore plus rapide et repose sur une base logique donc prouvable.
Autrement dit, il est possible de prouver que l`algorithme est optimal.
Je suis very happy en ce moment.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 28 Aoû 2014, 16:27
Nouveau record pour (18,5)
68 combinaisons!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1-2-3-7-9
1-2-4-10-12
1-2-5-11-16
1-2-8-14-15
1-2-13-17-18
1-3-4-6-16
1-3-5-10-15
1-3-8-11-13
1-3-12-14-18
1-4-5-8-17
1-4-7-11-14
1-4-9-13-15
1-5-6-9-14
1-5-7-12-13
1-6-7-8-10
1-6-11-12-15
1-7-15-16-18
1-8-9-12-16
1-9-10-11-18
1-10-13-14-16
2-3-4-5-13
2-3-6-11-14
2-3-8-10-17
2-3-12-15-16
2-4-6-7-18
2-4-8-9-11
2-4-14-16-17
2-5-6-8-12
2-5-7-10-14
2-5-9-15-17
2-6-9-10-16
2-7-8-13-16
2-7-11-12-17
2-9-12-13-14
2-10-11-13-15
3-4-7-8-12
3-4-9-10-14
3-4-11-15-17
3-5-6-7-17
3-5-8-14-16
3-5-9-11-12
3-6-8-9-15
3-6-10-12-13
3-7-10-11-16
3-7-13-14-15
3-9-13-16-18
4-5-6-10-11
4-5-7-9-16
4-5-12-14-15
4-6-9-12-17
4-7-10-13-17
4-8-10-15-16
4-11-12-13-16
5-6-13-15-16
5-7-8-11-15
5-8-9-10-13
5-10-12-16-17
5-11-13-14-17
6-7-9-11-13
6-7-12-14-16
6-8-11-16-17
6-10-14-15-17
7-8-9-14-17
7-9-10-12-15
8-10-11-12-14
8-12-13-15-17
9-11-14-15-16
4-8-13-14-18
Je vous defie de faire mieux!
C`est l`optimum!!!
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 28 Aoû 2014, 17:38
Le programme de Fatal_error donne 54 combinaisons pour (18,5).
Trop loin des 68 combinaisons que j`ai postees.
Comment savoir que l`on a atteint l`optimum?
On peut savoir la limite infranchissable de (18,5).
C`est C(18,3)/C(5,3)=81.6.
A partir de 82 combinaisons on subit l`effet du "pigeonhole". Forcement, une combinaison aura 3 en commun avec une autre.
-
nodjim
- Membre Complexe
- Messages: 3241
- Enregistré le: 24 Avr 2009, 17:35
-
par nodjim » 28 Aoû 2014, 20:15
En fait ce n'est pas tout a fait C(18,3)/C(5,3), il y a un facteur réducteur du dénominateur, je tâcherai de l'expliquer plus tard.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 28 Aoû 2014, 20:25
nodjim a écrit:En fait ce n'est pas tout a fait C(18,3)/C(5,3), il y a un facteur réducteur du dénominateur, je tâcherai de l'expliquer plus tard.
Salut,
Je n`ai jamais dit cela.
La preuve relis plus haut mes majorations en fonction de n.
Je dis tout simplement que c`est une premiere majoration (autrement dit elementaire).
Pour (18,5) je donne 65 or je trouve 68.
Ma formule est donc erronee. Je travaille actuellement a la corriger.
Merci pour le commentaire.
-
Bramant52
- Membre Relatif
- Messages: 125
- Enregistré le: 13 Aoû 2014, 18:06
-
par Bramant52 » 28 Aoû 2014, 20:26
Bramant52 a écrit:Salut Groucho,
Tu trouves quel maximum pour (18,5)?
Moi je trouve 66 combinaisons, je les ai postees.
Apres avoir fait des tests, je pense, comme dit precedemment, avoir trouve le principe de solution : le tri croise.
La je poste les maximums (a plus ou moins un pres) pour tout n=10 jusqu`a 30.
n max(+ou-1)
10 6
11 10
12 14
13 19
14 26
15 34
16 43
17 53
18 65
19 78
20 94
21 111
22 129
23 150
24 173
25 199
26 225
27 256
28 288
29 323
30 361
L`approximation a plus ou moins un pres depend de la divisibilite par 5.
J`essaie d`ameliorer ma formule.
Pour 18 j`avais trouve 66 et ma formule me donne 65.
Pour n=25 il faut compter un maximum de 199 voire 200 et non 135.
A plus tard
Une precision : ma formule est erronee, je travaille a la rectifier.
Merci.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités