私は、3つの異なるCSVファイルからxとy座標の2つのclomunsを読み込み、すべてのポイントに一度だけ触れている間に短い方法を計算できるプログラムに取り組んでいます(Traveling Salesman問題)コードは異なる値で同じ結果を返す
私は2つの異なる問題があります:まず、同じcsvファイルに3回置くと、出力(正しい順番の点の一覧)は同じように見えますが(期待どおりですが)計算された方法は完全に異なっていますか?
第3に、3つの異なるcsvファイルを配置すると、3つの出力リストのそれぞれの最初のポイントが同じポイントになりますが、各ファイルの開始点が異なるため1。
//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
}
}
に触れたことはありませんしているようで、デバッガを使用して自分でそれを把握。その彼らが – redFIVE