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
}
}
Nutzen zu sein, sich ein Debugger und herauszufinden. Es ist genau das, was sie für – redFIVE