Combinatoire

Olympiades mathématiques, énigmes et défis
Avatar de l’utilisateur
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.

Avatar de l’utilisateur
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.

 

Retourner vers ⚔ Défis et énigmes

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite