Java 有缺陷的2-opt搜索实现?
我试图在Java中为TSP设计一个2-opt局部搜索启发式算法,但我的算法似乎有缺陷。给定最近邻电路作为输入,它会使电路变得更糟。最近邻居:;经过10秒的2-opt:。我的代码如下。我的实现有什么问题?Location[]Location只是图中节点的列表,每个节点都有纬度和经度以及它和另一个节点之间的距离计算Java 有缺陷的2-opt搜索实现?,java,heuristics,traveling-salesman,Java,Heuristics,Traveling Salesman,我试图在Java中为TSP设计一个2-opt局部搜索启发式算法,但我的算法似乎有缺陷。给定最近邻电路作为输入,它会使电路变得更糟。最近邻居:;经过10秒的2-opt:。我的代码如下。我的实现有什么问题?Location[]Location只是图中节点的列表,每个节点都有纬度和经度以及它和另一个节点之间的距离计算 public HamiltonianCircuit execute(Location[] locations) { long startTime = System.cur
public HamiltonianCircuit execute(Location[] locations) {
long startTime = System.currentTimeMillis();
while (true) {
for (int i = 0; i < locations.length; i++) {
for (int k = 0; k < locations.length; k++) {
if (System.currentTimeMillis() - startTime >= 10000) {
return new HamiltonianCircuit(locations);
}
Location a = locations[i];
Location b = locations[(i + 1) % locations.length];
Location c = locations[k];
Location d = locations[(k + 1) % locations.length];
double distanceab = a.distanceBetween(b);
double distancecd = c.distanceBetween(d);
double distanceac = a.distanceBetween(c);
double distancebd = b.distanceBetween(d);
double change = (distanceab + distancecd) -
(distanceac + distancebd);
if (change > 0) {
locations[k] = a;
locations[i] = c;
}
}
}
}
}
2-opt用边AC和BD替换边AB和CD,这意味着如果我们有部分电路0abxyzcd1开始,我们完成后需要0aczyxbd1。 您的代码将生成0cbxyzad1
您想交换B和C,但也需要在中间反转所有的东西。 < P> java中可能的解决方案可能是:注意:VBOOSE < /P>
public HamiltonianCircuit execute(){
ArrayList<Vehicle> locations= new ArrayList<Locations>;
//populate array
for (int i = 1; i < locations.size()-3; i++) {
Location a = locations.get(i);
Location b = locations.get(i+1);
Location c = locations.get(i+2);
Location d = locations.get(i+3);
double distanceab = EuclidianDistance.pair(a, b);
double distancebd = EuclidianDistance.pair(b, d);
double distanceac = EuclidianDistance.pair(a, c);
double distancecd = EuclidianDistance.pair(c, d);
double abcd = distanceab+distancecd;
double acbd = distanceac+distancebd;
if(acbd<abcd){
Collections.swap(locations, i+1, i+2);
System.out.println("swapped"+vehicles);
}
}
Locations.setDistance(EuclidianDistance.Collection(locations));
return locations;
}