我被困在学校项目的这一部分,我必须在这两个坐标之间找到最短的路线(旅行推销员问题)。我在这里做了些小事,以获得最近邻居的坐标,但是有几个坐标相同的邻居,我不希望这样。
我想到了一些可以解决该问题的方法,但是它不起作用,我也不知道为什么。distance
是当前位置与彼此之间的当前距离。我认为shortestDistance
不言而喻。locations[20][3]
是一个2D数组,我在其中存储Xco-ord,Yco-ord和每个坐标的最近邻居。 X在[x] [0]中,Y在[x] [1]中,邻居在[x] [2]中
for(int i = 0; i < 20; i++){
int shortestDistance = 100;
int distance;
//Looking for nearest neighbour 20 times
for(int j = 0; j < 20; j++){
//Looking for the closest neighbour here
distanceX = locations[i][0] - locations[j][0];
distanceY = locations[i][1] - locations[j][1];
//To prevent a negative distance:
if(distanceX < 0){
distanceX = distanceX * -1;
}
if(distanceY < 0){
distanceY = distanceY * -1;
}
//Add distance
distance = distanceX + distanceY;
//If current distance is shorter then the shortestdistance, to prevent it does'nt see itself as 'neighbour' and to prevent another co-ord has the same neighbour, which happens in isOk();
if(distance < shortestDistance && distanceX + distanceY != 0 && isOk(j)){
shortestDistance = distance;
locations[i][2] = j;
}
}
}
函数isOk是:
private boolean isOk(int j){
boolean result = false;
for(int i = 0; i < 20; i++){
if(locations[i][2] == j){
result = false;
}
else{
result = true;
}
}
return result;
}
所以,我要问的是我做错了什么?我仍然得到一些物品(在20 * 10的存储空间中),该物品与其最近的邻居具有相同的物品。
最佳答案
您可能必须将邻居初始化为对于您的isOK
方法来说可以的事情。这样的值例如是-1。
for(int i = 0; i < 20; i++) locations[i][2] = -1;
isOk
还包含一个小错误。当发现j
是另一个位置的邻居时,应停止循环:private boolean isOk(int j){
for(int i = 0; i < 20; i++){
if (locations[i][2] == j) return false;
}
return true;
}