| |
Consulter les messages sans réponse | Consulter les sujets actifs
|
Page 1 sur 1
|
[ 11 message(s) ] |
|
| Auteur |
Message |
|
Jump
|
Publié: 15 Nov 2002, 08:42 |
|
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 |
|
 |
|
Auron
|
Publié: 15 Nov 2002, 11:45 |
|
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 |
|
 |
|
Jump
|
Publié: 15 Nov 2002, 12:41 |
|
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 |
|
 |
|
Auron
|
Publié: 15 Nov 2002, 13:06 |
|
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  ..., 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 |
|
 |
|
Jump
|
Publié: 15 Nov 2002, 13:52 |
|
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 |
|
 |
|
Auron
|
Publié: 15 Nov 2002, 14:07 |
|
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 |
|
 |
|
Jump
|
Publié: 15 Nov 2002, 16:37 |
|
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 |
|
 |
|
Jump
|
Publié: 15 Nov 2002, 21:48 |
|
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!!!  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 |
|
 |
|
Xaraknid
|
Publié: 16 Nov 2002, 01:12 |
|
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 )
_________________ 
|
|
| Haut |
|
 |
|
Auron
|
Publié: 16 Nov 2002, 12:26 |
|
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 |
|
 |
|
Jump
|
Publié: 16 Nov 2002, 12:48 |
|
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 |
|
 |
|
Page 1 sur 1
|
[ 11 message(s) ] |
|
Qui est en ligne ? |
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 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
|
|
|
|