apaachee | Voila mon Astar. Ce qui me chagrine dans cet algo c'est qu'il ne prend pas en compte la valeur des cases. si 6 cases sont gratuites en allant voir un peu plus haut il ne le verra pas, comment faire ?
Code :
- public int Astar(int idepart, int jdepart, int iarrivee, int jarrivee){
- int resultat;
- Stack LOI = new Stack();//ListeOuverteI
- Stack LOJ = new Stack();//ListeOuverteJ
- Stack LFI = new Stack();//ListeFermeeI
- Stack LFJ = new Stack();//ListeFermeeJ
- Stack tempEucl = new Stack();//Distances Euclidiennes avant tri
- Stack tempI = new Stack();//les i trouves avant tri
- Stack tempJ = new Stack();//les j trouves avant tri
- //On calcule les distances entre "point à proximité du point de départ" et "point d'arrivée"
- double te;
- if(this.caseADroite(idepart,jdepart)){
- te = distanceEuclidienne(idepart+1,jdepart,iarrivee,jarrivee);
- if(this.getcase(idepart+1,jdepart) == '0')//Malus si case vide
- te = te + 5;
- tempEucl.push(te);
- tempI.push(idepart+1);
- tempJ.push(jdepart);
- }
- if(this.caseAGauche(idepart,jdepart)){
- te = distanceEuclidienne(idepart-1,jdepart,iarrivee,jarrivee);
- if(this.getcase(idepart-1,jdepart) == '0')//Malus si case vide
- te = te + 5;
- tempEucl.push(te);
- tempI.push(idepart-1);
- tempJ.push(jdepart);
- }
- if(this.caseEnHaut(idepart,jdepart)){
- te = distanceEuclidienne(idepart,jdepart-1,iarrivee,jarrivee);
- if(this.getcase(idepart,jdepart-1) == '0')//Malus si case vide
- te = te + 5;
- tempEucl.push(te);
- tempI.push(idepart);
- tempJ.push(jdepart-1);
- }
- if(this.caseEnBas(idepart,jdepart)){
- te = distanceEuclidienne(idepart,jdepart+1,iarrivee,jarrivee);
- if(this.getcase(idepart,jdepart+1) == '0')//Malus si case vide
- te = te + 5;
- tempEucl.push(te);
- tempI.push(idepart);
- tempJ.push(jdepart+1);
- }
- //On trie les distances trouvées
- Stack tri = new Stack();
- tri = tri(tempEucl);
- //On ajoute à LOI et LOJ les différentes coordonnées trouvées en fonction de leur distance (plus grosse distance en BAS)
- Stack tempIsave = new Stack();
- Stack tempJsave = new Stack();
- while(!tri.empty()){
- Integer itri = (Integer)tri.pop();
- while(!tempI.empty()){
- if(itri == nbObj(tempI)){
- LOI.push(tempI.peek());
- LOJ.push(tempJ.peek());
- }
- tempIsave.push(tempI.pop());
- tempJsave.push(tempJ.pop());
- }
- while(!tempIsave.empty()){
- tempI.push(tempIsave.pop());
- tempJ.push(tempJsave.pop());
- }
- }
- boolean fin;
- while(fin == false){
- if(LOI.empty()){
- resultat = 1000;
- fin == true;
- }
- else{
- //Case Courante
- int i = LOI.pop();
- int j = LOI.pop();
- //On vide les piles de traitement
- while(!tempEucl.empty())
- tempEucl.pop();
- while(!tri.empty())
- tri.pop();
- while(!tempI.empty()){
- tempI.pop();
- tempJ.pop();
- }
- if((this.caseADroite(i,j)){
- if(!dejaPresent(LFI,LFJ,i+1,j)){
- te = distanceEuclidienne(i+1,j,iarrivee,jarrivee);
- if(this.getcase(i+1,j) == '0')//Malus si case vide
- te = te + 5;
- te += distanceEuclidienne(i,j,iarrivee,jarrivee);
- tempEucl.push(te);
- tempI.push(i+1);
- tempJ.push(j);
- }
- }
- if((this.caseAGauche(i,j)){
- if(!dejaPresent(LFI,LFJ,i-1,j)){
- te = distanceEuclidienne(i-1,j,iarrivee,jarrivee);
- if(this.getcase(i-1,j) == '0')//Malus si case vide
- te = te + 5;
- te += distanceEuclidienne(i,j,iarrivee,jarrivee);
- tempEucl.push(te);
- tempI.push(i-1);
- tempJ.push(j);
- }
- }
- if((this.caseEnHaut(i,j)){
- if(!dejaPresent(LFI,LFJ,i,j-1)){
- te = distanceEuclidienne(i,j-1,iarrivee,jarrivee);
- if(this.getcase(i,j-1) == '0')//Malus si case vide
- te = te + 5;
- te += distanceEuclidienne(i,j,iarrivee,jarrivee);
- tempEucl.push(te);
- tempI.push(i);
- tempJ.push(j-1);
- }
- }
- if((this.caseEnBas(i,j)){
- if(!dejaPresent(LFI,LFJ,i,j)){
- te = distanceEuclidienne(i,j+1,iarrivee,jarrivee);
- if(this.getcase(i,j+1) == '0')//Malus si case vide
- te = te + 5;
- te += distanceEuclidienne(i,j,iarrivee,jarrivee);
- tempEucl.push(te);
- tempI.push(i);
- tempJ.push(j+1);
- }
- }
- // Si la case objectif est atteinte alors aller à solution,
- if(){
- fin = true;
- resultat = solution();
- }
- // sinon :
- else{
- // empiler les nœuds voisins dans la liste ouverte du moins bon score au meilleur,
- tri = tri(tempEucl);
- while(!tri.empty()){
- Integer itri = (Integer)tri.pop();
- while(!tempI.empty()){
- if(itri == nbObj(tempI)){
- LOI.push(tempI.peek());
- LOJ.push(tempJ.peek());
- }
- tempIsave.push(tempI.pop());
- tempJsave.push(tempJ.pop());
- }
- while(!tempIsave.empty()){
- tempI.push(tempIsave.pop());
- tempJ.push(tempJsave.pop());
- }
- }
- // empiler le nœud courant dans la liste fermée.
- LFI.push(i);
- LFJ.push(j);
- }
- }
- }
- return resultat;
- }
|
|