public SolutionState solve(int TIME_LIMIT_MS) throws HorsPlageException {
        SolutionState state = this.tsp.solve(TIME_LIMIT_MS, this.graph.getNbVertices() * this.graph.getMaxArcCost() + 1);
        if (state == SolutionState.OPTIMAL_SOLUTION_FOUND || state == SolutionState.SOLUTION_FOUND) {
            this.getCheminsResultats().clear();
            int[] next = this.tsp.getNext();
            int indexEntrepot = this.graph.getIndexNoeudById(this.zone.getEntrepot().getId());
            List<LivraisonGraphVertex> vertices = this.graph.getNoeuds();
            List<LivraisonGraphVertex> orderedVertices = new ArrayList<LivraisonGraphVertex>();
            if(next.length > 0) {

                // On ajoute l'entrepôt
                orderedVertices.add(vertices.get(indexEntrepot));

                PlageHoraire currentPlage = null;
                Calendar currentTime = Calendar.getInstance();

                // Pour tous les points de livraison suivants, on ajoute à la liste ordonnée en mettant à jour l'horaire
                for (int i = next[indexEntrepot]; i != indexEntrepot; i = next[i]) {
                    LivraisonGraphVertex currentVertex = vertices.get(i);
                    Livraison currentLivraison = null;
                    try{
                    	currentLivraison = ((Livraison) zone.getNoeudById(currentVertex.getIdNoeud()));
                    } catch (Exception e) {
                    	System.err.println("JAJAGA");
                    }

                    // Recherche de la plage horaire d'une livraison
                    for (PlageHoraire plage : this.getPlagesHoraire()) {
                        if (plage.getLivraisons().contains(currentLivraison)) {

                            // Si c'est une nouvelle plage horaire, on remet le temps courant au départ
                            if (plage != currentPlage) {
                                currentPlage = plage;
                                currentTime.setTime(currentPlage.getHeureDebut());
                            }
                            break;
                        }
                    }

                    // Ajout de la Livraison à la liste ordonnée
                    orderedVertices.add(currentVertex);
                }

                this.buildCheminResultat(orderedVertices);
            }
        }
        return state;
    }