Skip to content

Commit

Permalink
Merge pull request #43 from SacreeBandeDePote/BranchSaveTest
Browse files Browse the repository at this point in the history
Sauvegarde deliveries + Feuille de route + DELETE println
  • Loading branch information
P4py committed Dec 6, 2017
2 parents 871db0f + 9d4dca0 commit 7a4935e
Show file tree
Hide file tree
Showing 8 changed files with 118 additions and 70 deletions.
10 changes: 1 addition & 9 deletions agile/src/main/java/lsbdp/agile/algorithm/TemplateTSP.java
Expand Up @@ -18,6 +18,7 @@ public abstract class TemplateTSP implements TSP {

@Override
public void findSolution(DeliverySchedule schedule, StreetMap map, DeliveriesRequest req) {
schedule.setStartingTime(req.getStartingTime());
count = 0;
Intersection warehouse = req.getWarehouse();
List<Delivery> deliveries = req.getDeliveryList();
Expand Down Expand Up @@ -45,10 +46,6 @@ public void findSolution(DeliverySchedule schedule, StreetMap map, DeliveriesReq

branchAndBound(timeCost.length - 1, nonView, view, 0f, timeCost, duration, timeWindows);
if (solutionFound) {
System.out.println("Best Solution found : cost : " + bestSolutionCost);
System.out.println(Arrays.toString(bestSolution));
System.out.println(Arrays.toString(timeOfArrival));

for (int i = 0; i < bestSolution.length - 1; i++) {
Delivery d = deliveries.get(bestSolution[i + 1]);
Route r = graphTSP[bestSolution[i]][bestSolution[i + 1]];
Expand All @@ -62,11 +59,8 @@ public void findSolution(DeliverySchedule schedule, StreetMap map, DeliveriesReq
schedule.setEndingTime(delTime);
Route r = graphTSP[bestSolution[bestSolution.length - 1]][graphTSP.length - 1];
schedule.add(new Pair<>(r, null));
} else {
System.out.println("No Solution Found");
}

System.out.println("Number of call : " + count);
//TODO : What to do with the come back to the warehouse ??
}

Expand All @@ -88,8 +82,6 @@ private void branchAndBound(int crtNode, ArrayList<Integer> nonView, ArrayList<I
timeOfArrival = tempTimeOfArrival.clone();
timeOfArrival[timeOfArrival.length - 1] = bestSolutionCost;
solutionFound = true;
//System.out.println("New Best Solution found : cost : " + bestSolutionCost);
//System.out.println(Arrays.toString(bestSolution));
}
} else {
if (crtCost + bound(crtNode, nonView, timeCost, duration, timeWindows, crtCost) < bestSolutionCost) { //there are still nodes to visit
Expand Down
17 changes: 13 additions & 4 deletions agile/src/main/java/lsbdp/agile/controller/Controller.java
@@ -1,6 +1,7 @@
package lsbdp.agile.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.Date;

Expand All @@ -26,10 +27,14 @@ public Controller() {
}

//Gérer Map
public static void loadMap(File XML) throws ParseException {
map = SerializerXML.deserializeMapXML(XML);
public static void loadMap(File xml) throws ParseException {
map = SerializerXML.deserializeMapXML(xml);
WindowManager.drawMap(map);
}
public static void saveDeliveries(File xml) {
SerializerXML.serializeDeliveryXML(schedule, xml);
}

public static void drawMap(){
WindowManager.drawMap(map);
}
Expand All @@ -38,8 +43,8 @@ public static StreetMap getMap() {
}

//Gérer Schedule
public static DeliverySchedule loadDeliveryRequest(File XML) throws ParseException {
deliveries = SerializerXML.deserializeDeliveryXML(XML, map);
public static DeliverySchedule loadDeliveryRequest(File xml) throws ParseException {
deliveries = SerializerXML.deserializeDeliveryXML(xml, map);
algo.findSolution(schedule, map, deliveries);
WindowManager.colorDeliverySchedule(schedule);
WindowManager.loadListView(schedule);
Expand All @@ -50,6 +55,10 @@ public static DeliverySchedule getSchedule() {
return schedule;
}

public static void generateRoadmapActionHandler(File xml) {
SerializerXML.generateRoadMap(xml, schedule);
}

//Interaction avec Commandes
public static void cmdDelete(Delivery element) {
Command c = new CommandDelete(element);
Expand Down
70 changes: 39 additions & 31 deletions agile/src/main/java/lsbdp/agile/data/SerializerXML.java
Expand Up @@ -30,11 +30,12 @@
import lsbdp.agile.model.Delivery;
import lsbdp.agile.model.DeliverySchedule;
import lsbdp.agile.model.Intersection;
import lsbdp.agile.model.Route;
import lsbdp.agile.model.Street;
import lsbdp.agile.model.StreetMap;

/**
* Classe permettant de désérialiser un fichier XML(une map ou un fichier de livraisons) en objet JAVA
* Classe permettant de deserialiser un fichier XML(une map ou un fichier de livraisons) en objet JAVA
* @author Vincent
*
*/
Expand All @@ -43,28 +44,30 @@ public class SerializerXML {
static ArrayList<Long> idIdentifier;

/**
* Méthode permettant de sérialiser des objets Java en un document XML dans le but de faire une sauvegarde
* Methode permettant de serialiser des objets Java en un document XML dans le but de faire une sauvegarde
* @param deliveriesRequest
* @param file
*/
public static void serializeDeliveryXML(DeliveriesRequest deliveriesRequest, File file) {
SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
public static void serializeDeliveryXML(DeliverySchedule deliveriesSchedule, File file) {
SimpleDateFormat formater = new SimpleDateFormat("H:m:s");
try {
file.createNewFile();
FileWriter ffw=new FileWriter(file);
ffw.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");
ffw.write("<demandeDeLivraisons>\n");
ffw.write("<entrepot adresse=\"" + idIdentifier.get((int)(deliveriesRequest.getWarehouse().getId())) + "\" heureDepart=\"" + formater.format(deliveriesRequest.getStartingTime()) + "\"/>\n");
for(Delivery d: deliveriesRequest.getDeliveryList()) {
ffw.write("<livraison adresse=\"" + idIdentifier.get((int)d.getLocation().getId()));
if(d.getTimespanStart() != null) {
ffw.write("\" debutPlage=\"" + formater.format(d.getTimespanStart()));
}
ffw.write("\" duree=\"" + d.getDuration());
if(d.getTimespanStart() != null) {
ffw.write("\" finPlage=\"" + formater.format(d.getTimespanEnd()));
ffw.write("<entrepot adresse=\"" + idIdentifier.get((int)(deliveriesSchedule.get(0).getKey().getStartingPoint().getId())) + "\" heureDepart=\"" + formater.format(deliveriesSchedule.getStartingTime()) + "\"/>\n");
for(Pair<Route,Delivery> d: deliveriesSchedule) {
if(d.getValue()!=null) {
ffw.write("<livraison adresse=\"" + idIdentifier.get((int)d.getValue().getLocation().getId()));
if(d.getValue().getTimespanStart() != null) {
ffw.write("\" debutPlage=\"" + formater.format(d.getValue().getTimespanStart()));
}
ffw.write("\" duree=\"" + d.getValue().getDuration());
if(d.getValue().getTimespanStart() != null) {
ffw.write("\" finPlage=\"" + formater.format(d.getValue().getTimespanEnd()));
}
ffw.write("\"/>\n");
}
ffw.write("\"/>\n");
}
ffw.write("</demandeDeLivraisons>\n");
ffw.close();
Expand All @@ -75,7 +78,7 @@ public static void serializeDeliveryXML(DeliveriesRequest deliveriesRequest, Fil
}

/**
* Méthode permettant de désérialiser une map à partir d'un fichier XML
* Methode permettant de deserialiser une map a partir d'un fichier XML
* @param fileXML
* @return
*/
Expand All @@ -98,7 +101,7 @@ public static StreetMap deserializeMapXML(File fileXML) {
return streetMap;
}
/**
* Méthode permettant de lire et de créer toutes les intersections à partir d'un fichier XML
* Methode permettant de lire et de creer toutes les intersections a partir d'un fichier XML
* @param root
* @return
*/
Expand Down Expand Up @@ -137,7 +140,7 @@ public static StreetMap readIntersection (Element root) {
}

/**
* Méthode permettant de lire et de créer toutes les rues à partir d'un fichier XML
* Methode permettant de lire et de creer toutes les rues a partir d'un fichier XML
* @param root
* @param streetMap
*/
Expand All @@ -163,7 +166,7 @@ public static void readTroncon (Element root, StreetMap streetMap) {
}

/**
* Méthode permettant de lire un fichier de livraisons et de créer un parcours de livraisons à partir d'un fichier XML
* Methode permettant de lire un fichier de livraisons et de creer un parcours de livraisons a partir d'un fichier XML
* @param fileXML
* @param streetMap
* @return
Expand All @@ -189,7 +192,7 @@ public static DeliveriesRequest deserializeDeliveryXML(File fileXML, StreetMap s
}

/**
* Méthode permettant de lire un entrepôt et une heure de départ de livraison à partir d'un fichier XML
* Methode permettant de lire un entrepot et une heure de depart de livraison a partir d'un fichier XML
* @param root
* @param streetMap
* @return
Expand Down Expand Up @@ -219,7 +222,7 @@ public static Pair <Intersection, Date> readWarehouse (Element root, StreetMap s
}

/**
* Méthode permettant de lire et de créer un lieu de livraison à partir d'un fichier XML
* Methode permettant de lire et de creer un lieu de livraison a partir d'un fichier XML
* @param root
* @param streetMap
* @return
Expand Down Expand Up @@ -255,20 +258,25 @@ public static ArrayList<Delivery> readDelivery(Element root, StreetMap streetMap
}

/**
* Méthode permettant de générer une feuille de route
* Methode permettant de generer une feuille de route
* @param f
* @param d
* @throws FileNotFoundException
*/
public static void generateRoadMap(File f, DeliverySchedule d) throws FileNotFoundException {
PrintWriter out = new PrintWriter(f);
String timeStamp = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
String entete = "-------------------------------------------------\r\n\r\n";
entete += "| FEUILLE DE ROUTE\r\n";
entete += "|\r\n";
entete += "| Date/Heure de génération: " + timeStamp + "\r\n";
entete += "-------------------------------------------------\r\n\r\n";
out.print(entete + d.toString());
out.close();
public static void generateRoadMap(File f, DeliverySchedule d) {
try {
PrintWriter out = new PrintWriter(f);
String timeStamp = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime());
String entete = "-------------------------------------------------\r\n\r\n";
entete += "| FEUILLE DE ROUTE\r\n";
entete += "|\r\n";
entete += "| Date/Heure de génération: " + timeStamp + "\r\n";
entete += "-------------------------------------------------\r\n\r\n";
out.print(entete + d.toString());
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

}
}
4 changes: 2 additions & 2 deletions agile/src/main/java/lsbdp/agile/model/Delivery.java
Expand Up @@ -52,7 +52,7 @@ public Date getDeliveryTime() {
return deliveryTime;
}

public void setDeliveryTime(long deliveryTime) {
this.deliveryTime.setTime(deliveryTime);
public void setDeliveryTime(Date deliveryTime) {
this.deliveryTime = deliveryTime;
}
}
40 changes: 20 additions & 20 deletions agile/src/main/java/lsbdp/agile/model/DeliverySchedule.java
@@ -1,7 +1,7 @@
package lsbdp.agile.model;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javafx.util.Pair;

Expand All @@ -10,42 +10,42 @@ public class DeliverySchedule extends ArrayList<Pair<Route, Delivery>>{
private Date startingTime;
private Date endingTime;

public Intersection getWhareHouse() {
public Intersection getWarehouse() {
return this.get(0).getKey().getStartingPoint();
}

public String toString() {
Intersection entrepot = this.getWhareHouse();
SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");

Intersection entrepot = this.getWarehouse();
String s = "Entrepôt\r\n";
s += "Localisation" + entrepot.getX() + " " + entrepot.getY() + "\r\n";
s += this.startingTime + ": départ"; //TODO implement stratingTime
s += "Localisation : Coordonnées X " + entrepot.getX() + " | Y " + entrepot.getY() + "\r\n";
s += "Heure de départ : " + formater.format(this.startingTime) +"\r\n";

for(int i = 0; i < this.size() ; i++) {
Pair<Route, Delivery> pair = this.get(i);

if(i == 0) {
s += "------ Itinéraire Entrepôt -> Livraison 1 ------";
s += "--------- Itinéraire Entrepôt -> Livraison 1 ---------\r\n";
} else {
s += "------ Itinéraire Livraison " + i + " -> Livraison " + i + " ------";
s += "--------- Itinéraire Livraison " + i + " -> Livraison " + (i+1) + " ---------\r\n";
}

s += pair.getKey().toString();
s += "\r\n";

pair.getKey().toString(); //Call Route toString method

s += "--------------------------------------------------\r\n\r\n";

s += "------------------------------------------------------------------------------------------------\r\n";
s += "------------------------------------------------------------------------------------------------\r\n\r\n";

if(i == this.size()-1) {
s += "Entrepôt\r\n";
s += "Localisation" + entrepot.getX() + " " + entrepot.getY() + "\r\n";
s += this.endingTime + ": arrivée\r\n"; // TODO implement eta :)
s += "Localisation : Coordonnées X " + entrepot.getX() + " | Y " + entrepot.getY() + "\r\n";
s += "Heure d'arrivée estimée : " + formater.format(this.endingTime) + "\r\n";
} else {
s += "Livraison " + i;
s += "Localisation" + pair.getValue().getLocation().getX() + " | " + pair.getValue().getLocation().getY() + "\r\n";
s += pair.getValue().getTimespanStart() + ": arrivée\r\n";
s += " |\r\n";
s += pair.getValue().getTimespanStart() + ": départ";
s += "\r\n\r\n";
s += "LIVRAISON " + (i+1) + "\r\n";
s += "Localisation : Coordonnées X " + pair.getValue().getLocation().getX() + "| Y " + pair.getValue().getLocation().getY() + "\r\n";
s += "Heure d'arrivée sur place : " + formater.format(pair.getValue().getTimespanStart()) + "\r\n";
s += " |\r\n";
s += "Heure de départ : " + formater.format(pair.getValue().getTimespanEnd()) + "\r\n\r\n";
}
}
return s;
Expand Down
42 changes: 40 additions & 2 deletions agile/src/main/java/lsbdp/agile/model/Route.java
Expand Up @@ -42,14 +42,52 @@ public float getTotalLength() {
}

public String toString() {
String s = "Point de départ: " + startingPoint.getX() + " | " + startingPoint.getY() + "\r\n";
String s = "Point de départ : X " + startingPoint.getX() + " | Y " + startingPoint.getY() + "\r\n";
s+= "DEBUT DU TRAJET\r\n";
String previousStreet = null;
float length = 0;
for(Street street: streets) {
s += street.toString();
if(streets.indexOf(street)==0) {
previousStreet = street.getName();
length = street.getLength();
}else if(streets.indexOf(street)==streets.size()-1){
length += street.getLength();
s+= "Prendre la route " + street.getName() + " sur une longueur de " + ((int)(length/10)*10) + "m et vous êtes arrivé.";
s+= "\r\n";
s+="FIN DU TRAJET";
}else {
if(street.getName().compareTo(previousStreet)==0) {
length += street.getLength();
}else{
if(length==0) length = street.getLength();
s+= "Prendre la route " + previousStreet + " sur une longueur de " + ((int)(length/10)*10) + "m jusqu'à l'intersection avec " + street.getName();
s+= "\r\n";
previousStreet = street.getName();
length = 0;
// int index = streets.indexOf(street);
// if(index<2) CalculeAngle(startingPoint, streets.get(index-1).getEnd(), street.getEnd());
// else CalculeAngle(startingPoint, streets.get(index-1).getEnd(), street.getEnd());
}
}
}
return s;
}

public float getTotalTime() {
return getTotalLength()/MEAN_SPEED;
}

// public static String CalculeAngle(Intersection first, Intersection second, Intersection third) {
// //Calcule sens d'arrivée
// int deltaFromX = second.getX() - first.getX();
// int deltaFromY = second.getY() - first.getY();
// int deltaToX = third.getX() - second.getX();
// int deltaToY = third.getY() - third.getY();
// double angle = (-deltaFromX)*(deltaToX)+(-deltaFromY)*(deltaToY);
// angle /= Math.sqrt( Math.pow(deltaFromX, 2) + Math.pow(deltaFromY, 2));
// angle /= Math.sqrt( Math.pow(deltaToX , 2) + Math.pow(deltaToY , 2));
// angle = Math.acos(angle) * 180 / Math.PI;
// System.out.println(angle);
// return "calcul ANgle = " + angle;
// }
}
4 changes: 3 additions & 1 deletion agile/src/main/java/lsbdp/agile/view/EventHandlers.java
Expand Up @@ -56,6 +56,7 @@ private void saveDeliveries(ActionEvent event) {
new FileChooser.ExtensionFilter("XML File", "*.xml")
);
File f = MainWindow.openFileChooserRoadmap(fileChooser);
Controller.saveDeliveries(f);
} else {
MainWindow.openMessagePopup("Please load a delivery file");
}
Expand All @@ -70,6 +71,7 @@ private void generateRoadmapActionHandler(ActionEvent event) throws InterruptedE
new FileChooser.ExtensionFilter("txt File", "*.txt")
);
File f = MainWindow.openFileChooserRoadmap(fileChooser);
Controller.generateRoadmapActionHandler(f);
} else {
MainWindow.openMessagePopup("Please load a delivery file");
}
Expand All @@ -89,7 +91,7 @@ private void RedoAction(ActionEvent event) {
private void LoadDeliveriesActionHandler(ActionEvent event) throws InterruptedException, ParseException {
if(WindowManager.mapLoaded) {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Choose your deliverires file");
fileChooser.setTitle("Choose your deliveries file");
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("XML File", "*.xml")
);
Expand Down

0 comments on commit 7a4935e

Please sign in to comment.