2016-04-06 7 views
-2

Ich arbeite an einem Programm, das in der Lage sein soll, 2 clomuns von x und y Koordinaten aus 3 verschiedenen csv Dateien zu lesen und einen kurzen Weg zu berechnen, während man jeden Punkt nur einmal berührt (bekannt als Travelling Salesman) Problem)Code gibt das gleiche Ergebnis bei verschiedenen Werten

Ich habe 2 verschiedene Probleme: Erstens, II in der gleichen CSV-Datei 3 Mal, die Ausgabe (Liste der Punkte in der richtigen Reihenfolge) scheint die gleiche (was zu erwarten ist), aber Der berechnete Weg ist komplett anders?

Zweitens, wenn ich in 3 verschiedenen csv-Dateien setzen, ist das Problem, dass der erste Punkt auf jeder der drei Ausgabelisten der gleichen Stelle, aber dies sollte nicht der Fall, weil der Ausgangspunkt für jedes eine andere ist Datei ein.

//calls needed Methods 
     public static void main(String[] args) { 
     Main main = new Main(); 
     String csvFile1=main.getPath(); 
     String csvFile2=main.getPath(); 
     String csvFile3=main.getPath(); 
     double start = new Date().getTime(); 
     main.readData(csvFile1); 
     main.createPoints(); 
     main.calculateWay(); 
     main.cleanUp(); 
     main.readData(csvFile2); 
     main.createPoints(); 
     main.calculateWay(); 
     main.cleanUp(); 
     main.readData(csvFile3); 
     main.createPoints(); 
     main.calculateWay(); 
     main.cleanUp(); 
     double runningTime = new Date().getTime() - start; 
     main.time=runningTime/1000; 
     main.displayResult(); 
    } 

    //gets the path to the file 
    private String getPath() { 
     //... works fine 
    } 

    //reads x and y column and stores them in arraylists xlist and ylist 
    private void readData(String csvFile) { 
     //... works fine 
     } 
    } 

    //creates new point objects 
    private void createPoints() { 
     int i = 0; 
     while (i < listx.size()) { 
      setPoints(new Point(Integer.parseInt(listx.get(i)), Integer.parseInt(listy.get(i)))); 
      i++; 
     } 
     System.out.println(points.get(0).getX()+ " " +points.get(0).getY()); 
    } 

    //stores the point objects 
    private void setPoints(Point p) { 
     points.add(p); 
    } 

    //algorithm 
    private void calculateWay() { 
     Point local=null; 
     this.current=points.get(0); 
     double lastDistance; 
     int i=0; 

     while(i<points.size()) { 
      lastDistance=1000; 

      for (Point p: points) { 
       double distance=getDistance(p); 
       if (distance<lastDistance) { 
        lastDistance=distance; 
        local=p; 
       } 
      } 
      addWay(lastDistance); 
      createFinalList(local); 
      points.remove(local); 
      this.current=local; 
      i++; 
     } 
    } 

    //returns distance between 2 points 
    private double getDistance(Point p) { 
     double way=Math.sqrt((current.getX()-p.getX())*(current.getX()-p.getX())+(current.getY()-p.getY())*(current.getY()-p.getY())); 
     return way; 
    } 

    //adds the shortest found distance to the overall way 
    private void addWay(double x) { 
     switch (task) { 
     case 1: this.way1=way1+x; 
     case 2: this.way2=way2+x; 
     default: this.way3=way3+x; 
     } 
    } 

    //creates the list of points in correct order 
    private void createFinalList(Point p) { 
     switch (task) { 
     case 1: finalpoints1.add(p); 
     case 2: finalpoints2.add(p); 
     default: finalpoints3.add(p); 
     } 
    } 

    //sets up algorithm for new run 
    private void cleanUp() { 
     listx.clear(); 
     listy.clear(); 
     points.clear(); 
     this.current=null; 
     task++; 
    } 

    private void displayResult() { 
     //display informations on console 
    } 
} 
+0

Nutzen zu sein, sich ein Debugger und herauszufinden. Es ist genau das, was sie für – redFIVE

Antwort

0

Der Code ist ziemlich schwer zu lesen, aber die folgende Sache Sprung in Sicht:

  • Sie haben vergessen, den Bruch; Anweisungen in Ihren Switch-Fällen. Also wird jedes Case-Element ausgeführt, anstatt nur das gewünschte.
  • Wenn Sie den Abstand zwischen Ihrem Point p und Ihrem Point current berechnen, sollten Sie überprüfen, dass sie nicht gleich sind (wenn! P.equals (current) {. ..}). Dies wird derzeit in Abständen von Null resultieren, da 'Strom' und 'P' miteinander verglichen werden.
  • Haben Sie das nicht durchdacht, aber ich schätze, Sie berechnen die gleiche Entfernung viele Male
  • selbst wenn Ihre innere Schleife nicht einen geringeren Abstand finden, können Sie die vordefinierten 10000 auf Ihre Art und Weise hinzufügen
  • die ‚Aufgabe‘ Variable scheint nie
  • berührt es
+0

gemacht wurden, das sollte schön sein. aber ich habe das nicht bemerkt. Dies verursachte definitiv das Problem mit der unterschiedlichen Art und Weise, wie sich die gleiche Eingabe ergibt. Danke – Master1114

Verwandte Themen