IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Conserver un chemin dans un backtracking


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut Conserver un chemin dans un backtracking
    Bonjour,

    J'essaye depuis toute la journée de conserver un chemin dans mon parcours en profondeur. En effet, je m'attaque au problème du "Coin Change" et je souhaite récupérer le nombre de pièce qu'il faut pour rendre un montant quelconque.

    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.concurrent.ArrayBlockingQueue;
     
    public class Illimite {
     
    	static double listePieces [] = {5, 2, 1};
    	//static double montant = 12.35;
    	static double montantTot = 10;
    	static int profondeur = 50;
     
    	// Pile FIFO qui contient la solution en cours
    	static ArrayBlockingQueue<Double> sommet;
    	static int[] sol = new int[3];
     
     
    	/**
             * Fonction principale
             * @param args
             */
    	public static void main (String[] args){
    		Illimite p = new Illimite();
    		sommet = new ArrayBlockingQueue<Double>(profondeur+1);
    		try {
    			sommet.put(montantTot);
    			p.calcultest(sol);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
     
    	public void calcultest(int[] sol) {
    		while(sommet.size()>0){
    			System.out.println("Solution="+Arrays.toString(sol));	
    			double montant = sommet.poll();
     
     
    			for(int j =0;j<listePieces.length;j++){
    				try {
    					double next = montant-(listePieces[j]);
    					System.out.println("Montant="+montant+"; NextMontant="+next);
    					if(next>=0) {
    						//On copie la sol precedente
    						sol[j]++;
    						if(next>0) {
    							sommet.put(next);
    							calcultest(sol);
    						}
    						if(next==0) {
    							System.out.print("SOLUTION =");
    							System.out.println(Arrays.toString(sol));
    							sol[j]--;
    							return;
    						}
     
     
     
    					}
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    }
    Mon problème se situe ici je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if(next>0) {
    							sommet.put(next);
    							calcultest(sol);
    						}
    						if(next==0) {
    							System.out.print("SOLUTION =");
    							System.out.println(Arrays.toString(sol));
    							sol[j]--;
    							return;
    						}
    Cela fonctionne au début mais dès que je change de branche sur mon arbre cela ne décrémente pas assez et je suis perdu. J'ai essayé de faire passer le dernier chemin en paramètre mais rien à faire...

    J'ai besoin d'un petit coup de pouce.

    PS: J'ai fouillé sur le forum mais impossible de trouver une réponse précise sur ma question après de multiple essai.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah après le calcul, il faudrait peut être penser à faire un Sinon ta liste contiendra tout ton parcours et non la branche en cours...

  3. #3
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Coucou sinok,

    Merci de regarder avec moi, c'est sympa de ta part. En fait, j'ai dans mon int[] sol la solution courante normalement. Donc pour un montant de 10 et des pièces de 5,2,1 je veux les solutions suivante :

    [1,0,0]
    [2,0,0] = 2 pièces de 5euro

    Matrice des états :
    Profondeur 0 :
    Profondeur 1 : [5,8,9]
    Profondeur 2 : [0,3,4,....]

    Mais je fais déjà un remove avec sommet.poll() non ? Et je fais déjà un sommet.put(next); mais seulement si l'état suivant est > à 0. J'ai pas besoin de faire de remove je crois...


    Merci d'avance.

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Le vrai problème se situe sur la copie de ton array, ce que tu ne fais pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    if(next>=0) {
    						//On copie la sol precedente
    						int[] newSol = Arrays.copyOf(sol,3);
    						newSol[j]++;
    						if(next>0) {
    							sommet.put(next);
    							calcultest(newSol);
    						}
    						if(next==0) {
    							System.out.print("SOLUTION =");
    							System.out.println(Arrays.toString(newSol));
    							return;
    						}
     					}

  5. #5
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Merci beaucoup Rei Ichido !

    A force de rester dessus je ne faisais plus attention ! Un grand merci.

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. Conserver une valeur dans un champs
    Par zakfa dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 08h48
  3. Passer en paramètre un chemin dans redirection
    Par croco83 dans le forum ASP
    Réponses: 5
    Dernier message: 07/05/2004, 08h30
  4. Ajouter des chemins dans la variable PATH
    Par Righetto Dominique dans le forum Linux
    Réponses: 7
    Dernier message: 21/03/2004, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo