Bonsoir,
j'ai bloqué toute la journée sur une boucle infini que je n'arrive pas à debug...peut-être aurez-vous plus de chance que moi avec un oeil extérieur au problème, là je commence à voir des petits camions partout
Pour résumer le problème, j'ai 4 classes.
Reader qui me sert à lire un fichier et initialiser une ArrayList<Client> pendant la lecture
Client
Camion
Strategie
Les camions livrent les clients et la classe stratégie me sert à implémenter le tout.
Voici à quoi ressemble mon fichier à lire
Je récupère ces infos pour construire des clients (les 3 premières lignes étant spéciales, on ne s'occupe que de la liste à partir de id=2). Bref pas de soucis là dessus. Je récupère bien mes données, c'était surtout pour l'intro.Cap 1000
Id X Y Quant. Tmin Tmax Dur.
1 40.00 50.00 0.00 0.00 960.00 0.00
2 25.00 85.00 20.00 673.00 793.00 10.00
3 22.00 75.00 30.00 152.00 272.00 10.00
4 22.00 85.00 10.00 471.00 591.00 10.00
La méthode dans laquelle je boucle sans fin est en fait une fonction de verif de la classe Camion.
Notez que les "heures" sont simplifiées par un calcul de float, donc à priori pas de soucis là dessus.
On regarde si l'heure d'arrivée du camion est inférieur à l'heure maximum de début de livraison d'un client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Cas sans contrainte temps de livraison et capacite public boolean verifValiditeLivraison(Client c){ float xC=c.x1; float yC=c.x2; float dateMax=c.timeMax; //heure arrivée inférieure à h livraison max return ((this.hCurrent+distance_euclidienne(this.xCurrent,this.yCurrent,xC,yC))<dateMax); }
Et la méthode exécutant le traitement principal est ici dans ma classe stratégie
En rouge la partie de génération avec une valeur aléatoire et le test de validité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public class Strategie { public static int capa; public ArrayList<Client> listeClients; public ArrayList<Camion> listeCamions; public String pathFile; public int nbCamions; public Client lineDep; //client spécial représentant le dépot
Ma fonction aleat au cas ou même si je ne vois pas le problème venir de là
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 public void strategieAleatoire(){ int nbCam=1; while(!this.allClientsVisited()){ //tant que tous les clients ne sont pas livrés //tant que le camion n'est pas de retour au dépot Camion c_k=this.listeCamions.get(nbCam-1); System.out.println("Camion "+(nbCam-1)+" livre "); while(!c_k.backToDepot){ if(nbCam>=this.nbCamions){ //On utilise un nouveau camion Camion c_new=new Camion(Strategie.capa,lineDep.x1,lineDep.x2,lineDep.timeMax); this.nbCamions++; listeCamions.add(c_new); } int numClient; Client cTemp; do{ numClient=0; if(listeClients.size()>0){ numClient=aleat(listeClients.size()-1); } cTemp=listeClients.get(numClient); }while(!c_k.verifValiditeLivraison(cTemp)); if(c_k.canToGoBackAfterLivraison(cTemp)){ //on effectue la livraison si on a le temps de back depot c_k.effectuerLivraison(cTemp); listeClients.remove(numClient); //listeClients.get(numClient).visited=true; System.out.println(" Client "+cTemp.ident+" puis "); }else{ //on rentre au dépot System.out.println(" rentre au dépot \n\n"); c_k.effectuerLivraison(lineDep); } } nbCam++; System.out.println("*******\n"); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public static int aleat(int n){ Random rand = new Random(); int i = rand.nextInt(n+1); return i; }
A l'exécution, j'ai bien mes valeurs aléatoire, mais il semblerait que je boucle indéfiniment sur le dernier client possible d'un Camion, sans raison apparente.
Voici une trace d'exe
Dans la 1ère ligne du fichier texte 960 représente l'heure max de retour de mes camions.Camion 0 livre
Client 93 puis
Client 27 puis
Client 37 puis
Client 101 puis
Client 4 puis
Client 56 puis
Client 80 puis
Client 90 puis
Client 81 puis
Client 82 puis
Client 69 puis
Client 97 puis
Client 35 puis
Client 33 puis
Client 2 puis
Client 25 puis
Client 78 puis
Client 71 puis
Client 94 puis
Et ici on entre dans la boucle infini du test
Hors si j'affiche les clients testés par ma fonction de verif validité pendant la boucle infini je trouve bien certaines valeurs qui devraient me permettre de sortir de la boucle !
Merci pour votre aide !
Partager