我想知道是否有办法在我的解决方案中获得蛮力算法(TSP)选择的路径(不仅是距离),就像我只得到距离一样。
请注意,我从斯德哥尔摩市开始,在斯德哥尔摩结束。
我班级的一部分:
public void step(boolean[] wentTo, int currentCity, float distance)
{
int wentToCount = 0;
for (int i = 1; i <= cityCount; ++i)
{
if (wentTo[i - 1])
{
++wentToCount;
continue;
}
boolean[] copy = new boolean[cityCount];
System.arraycopy(wentTo, 0, copy, 0, cityCount);
copy[i - 1] = true;
float dist = distance + distances[distanceIndex(currentCity, i)];
step(copy, i, dist);
}
if (wentToCount == cityCount)
{
if (shortest > distance)
{
shortest = distance;
}
}
}
答案 0 :(得分:0)
简单的部分:只需在计算中注册变量即可。如果您的算法稍后决定使用其他路由,请重置。对于不了解您的代码的局外人而言,最困难的部分是尝试将其纳入最难以理解的代码中。尽管如此,这是一次尝试。为了记录路由,我使用了两个实例变量:
/** stack of numbers of towns on the route so far */
private Deque<Integer> route = new ArrayDeque<>();
/** shortest route found */
private List<Integer> solution;
要保持第一次更新,请在递归调用之前和之后执行此操作:
route.push(i);
step(copy, i, dist);
// after having tried town i, remove it from route again before trying next town
int j = route.pop();
assert j == i : "Got wrong town off stack, " + j + " instead of " + i;
这将确保一旦您将所有城镇添加到路线中,它们也将按照正确的顺序位于route
堆栈中。
要使solution
保持最新状态,请在找到较短路线时为其添加新值:
if (shortest > distance)
{
shortest = distance;
solution = new ArrayList<>(route);
}
现在,当您打印出最短距离时,solution
会保留所访问城镇的顺序,因此您也可以打印它。
由于我没有完整的代码,我没有机会进行测试,因此可能需要在这里和那里进行优化。