Nous sommes actuellement le 11 Juil 2026, 02:48

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 11 message(s) ] 
Auteur Message
 Sujet du message: Combinatoire
MessagePublié: 15 Nov 2002, 08:42 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Quelqu'un connais un algorithme très rapide pour générer une série combinatoire?

Disons que j'ai 1-2-3-4 bien comment générer

1-2-3-4
1-2-4-3
1-3-2-4
1-3-4-2
1-4-3-2
1-4-2-3
2-1-3-4
2-1-4-3
...
4-3-2-1

Ici j'ai un 4 élément, donc 4! combinaison, dans mon cas je vais avoir 12! combinaisons à explorer, donc faut que ça ce fasse assez rapidement.

Si quelqu'un a une référence mathématique sur le sujet qui pourrait être utile donnez là, je vais m'organiser pour sortir un algo

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 11:45 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Bon j'ai pas de livre d'algo ici pour te donner un bel algo complet qui fait ce que tu veux, mais je pense que l'idée si tu as un array de n valeur c'est que pour chaque combinaison a1 a2 a3 ... an-1 tu doit former n autres combinaisons en insérant an à chacune des place possible.

ex: an a1 a2 ... an-1, a1 an a2 ... an-1, ..., a1 a2 ... an-2 an an-1, a1 a2 ... an-1 an

comme ça tu peux y aller récursivement et trouver toutes les combinaisons possibles


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 12:41 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Auron a écrit:
Bon j'ai pas de livre d'algo ici pour te donner un bel algo complet qui fait ce que tu veux, mais je pense que l'idée si tu as un array de n valeur c'est que pour chaque combinaison a1 a2 a3 ... an-1 tu doit former n autres combinaisons en insérant an à chacune des place possible.

ex: an a1 a2 ... an-1, a1 an a2 ... an-1, ..., a1 a2 ... an-2 an an-1, a1 a2 ... an-1 an

comme ça tu peux y aller récursivement et trouver toutes les combinaisons possibles


J'ai bien peur que 12! demande trop d'espace de pile... ça fait au dessus de 400 millions de combinaisons... Mais je vais quand même m'essayer

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 13:06 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Jump a écrit:
Auron a écrit:
Bon j'ai pas de livre d'algo ici pour te donner un bel algo complet qui fait ce que tu veux, mais je pense que l'idée si tu as un array de n valeur c'est que pour chaque combinaison a1 a2 a3 ... an-1 tu doit former n autres combinaisons en insérant an à chacune des place possible.

ex: an a1 a2 ... an-1, a1 an a2 ... an-1, ..., a1 a2 ... an-2 an an-1, a1 a2 ... an-1 an

comme ça tu peux y aller récursivement et trouver toutes les combinaisons possibles


J'ai bien peur que 12! demande trop d'espace de pile... ça fait au dessus de 400 millions de combinaisons... Mais je vais quand même m'essayer


oui c'est vrai :oops: ..., mais tu sais c pas parce que j'ai fait l'algo récursivement que le code doit être récursif, ça peut se faire avec une boucle.

par exemple pour écrire Factoriel on peut écrire

Factoriel(n)=n*Factoriel(n-1)

ou bien

Factoriel(n)
fact=1
faire i = 1 a n
fact = i*fact
retourner fact

d'un autre coté je suis persuadé qu'il y a quelque part sur le net ou dans un livre un bout de code qui fait exactement ce que tu veux alors peut-être que ça ne vaut pas la peine de perdre du temps à tenter de coder mon algo itérativement


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 13:52 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
J'ai cherché un peu hiers soir et justement j'ai pas trouvé, en fait absolument rien qui s'en approchait! Je vais quand même continuer car ça me tentes pas vraiment de tout coder ça, surtout que je veux pas attendre 3 jours pour avoir un résultat si mon algo est pas optimal!

J'ai quand même fini par déduire le nombre de répétitions d'un élément:
Avec 1-2-3-4 (n=4), le 1 se répète (n-1)!= à la position 1 avant de changer pour le 2 qui se répétera autant de fois, pour la position 2 c'est (n-2)! et ainsi de suite jusqu'a l'élément n qui se répète (n-n)! =1 avant de changer... Je crois que je peux en sortir un algo, mais il risque d'être fixe pour un n déterminé...

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 14:07 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Jump a écrit:
J'ai cherché un peu hiers soir et justement j'ai pas trouvé, en fait absolument rien qui s'en approchait! Je vais quand même continuer car ça me tentes pas vraiment de tout coder ça, surtout que je veux pas attendre 3 jours pour avoir un résultat si mon algo est pas optimal!

J'ai quand même fini par déduire le nombre de répétitions d'un élément:
Avec 1-2-3-4 (n=4), le 1 se répète (n-1)!= à la position 1 avant de changer pour le 2 qui se répétera autant de fois, pour la position 2 c'est (n-2)! et ainsi de suite jusqu'a l'élément n qui se répète (n-n)! =1 avant de changer... Je crois que je peux en sortir un algo, mais il risque d'être fixe pour un n déterminé...


ok qqch genre

array = un array contenant les valeur a1 a2 ... an
sizearray = n
arrayPermutation = un super array de n! array de n valeur
positionPermutation = un index, 0 au début

Permutation(array, sizearray, arrayPermutation, positionPermutation)
si sizearray = 1
arrayPermutation[1][positionPermutation] = array[1]
sinon
faire de i = 1 a sizeArray
pivot = array[i]
unNouvelArray = array - pivot // un peut comme si array est un ensemble
faire de j = 1 a (n-1)!
arrayPermutation[j+i*(n-1)!][positionPermutation] = pivot
Permutation(unNouvelArray, sizeArray-1,&arrayPermutation[j+i*(n-1)!], positionPermutation+1)

tu ne va pas avoir plus de n niveau de récursion.

ex pour a0 a1 a1

a0 a1 a2

a0 a2 a1

a1 a0 a2

a1 a2 a0

a2 a0 a1

a2 a1 a0

je ne sais pas si ça fonctionne j'ai pas de class array qui se comporte un peu comme un ensemble alors je ne peux pas tester


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 16:37 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Je vais essayer ça, mais heureusement je n'aurai pas besoin du "superarray" qui risque anyway de trop prendre de place en mémoire.

J'ai juste besoin de passer toutes les combinaisons, calculer pour chacune et trouver la combinaison qui aura générée le meilleur résultat...

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 15 Nov 2002, 21:48 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Je viens d'allumer... permutation... moi qui cherchait des algo de combinaison depuis hiers! Y en a des tonnes de copies d'algo de permutation!!! :D Reste a en trouver un très rapide

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 16 Nov 2002, 01:12 
Hors-ligne
Occasionnel
Occasionnel
Avatar de l’utilisateur

Inscription : 06 Jan 2002, 23:19
Message(s) : 131
Code :
max = 4

for a1 := 1 to max do
   for a2 := 1 to max do
      for a2 := 1 to max do
        for a4 := 1 to max do
             write( a1,a2,a3,a4 )

_________________
Image


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 16 Nov 2002, 12:26 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

Inscription : 22 Fév 2002, 20:54
Message(s) : 738
Localisation : Montréal
Xaraknid a écrit:
Code :
max = 4

for a1 := 1 to max do
   for a2 := 1 to max do
      for a2 := 1 to max do
        for a4 := 1 to max do
             write( a1,a2,a3,a4 )


ben non, tu va réutiliser plusieurs fois la même valeur dans la même combinaison :?

ex pour 1 2 3 4 tu va écrire 1 1 1 1


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 16 Nov 2002, 12:48 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 00:24
Message(s) : 5834
Voici un exemple:

Code :
import java.math.BigInteger;

public class PermutationGenerator {
  private int[] a;
  private BigInteger numLeft;
  private BigInteger total;

  public PermutationGenerator (int n) {
    if (n < 1) {
      throw new IllegalArgumentException ("Min 1");
    }
    a = new int[n];
    total = getFactorial (n);
    reset ();
  }

  public void reset () {
    for (int i = 0; i < a.length; i++) {
      a[i] = i;
    }
    numLeft = new BigInteger (total.toString ());
  }

  public BigInteger getNumLeft () {
    return numLeft;
  }

  public BigInteger getTotal () {
    return total;
  }

  public boolean hasMore () {
    return numLeft.compareTo (BigInteger.ZERO) == 1;
  }

  private static BigInteger getFactorial (int n) {
    BigInteger fact = BigInteger.ONE;
    for (int i = n; i > 1; i--) {
      fact = fact.multiply (new BigInteger (Integer.toString (i)));
    }
    return fact;
  }

  public int[] getNext () {
    if (numLeft.equals (total)) {
      numLeft = numLeft.subtract (BigInteger.ONE);
      return a;
    }
    int temp;
    int j = a.length - 2;
    while (a[j] > a[j+1]) {
      j--;
    }
    int k = a.length - 1;
    while (a[j] > a[k]) {
      k--;
    }
    temp = a[k];
    a[k] = a[j];
    a[j] = temp;
    int r = a.length - 1;
    int s = j + 1;
    while (r > s) {
      temp = a[s];
      a[s] = a[r];
      a[r] = temp;
      r--;
      s++;
    }
    numLeft = numLeft.subtract (BigInteger.ONE);
    return a;
  }
}


Que l'on peut utiliser ainsi:
Code :
    int[] indices;
    String[] elements = {"a", "b", "c", "d"};
    PermutationGenerator x = new PermutationGenerator (elements.length);
    StringBuffer permutation;
    while (x.hasMore ()) {
      permutation = new StringBuffer ();
      indices = x.getNext ();
      for (int i = 0; i < indices.length; i++) {
        permutation.append (elements[indices[i]]);
      }
      System.out.println (permutation.toString ());
    }

_________________
This posting is provided "AS IS" with no warranties, and confers no rights!
©2006 - 2014 Jump


Haut
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 11 message(s) ] 

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site