旅行推销员(TSP)获得实际路径

时间:2017-03-26 10:51:04

标签: java algorithm brute-force traveling-salesman

我想知道是否有办法在我的解决方案中获得蛮力算法(TSP)选择的路径(不仅是距离),就像我只得到距离一样。

请注意,我从斯德哥尔摩市开始,在斯德哥尔摩结束。

  • 最短路径是city1 - > City2 - > City3 ----> .......然后---> City1?

我班级的一部分:

    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;
            }
        }
    }

1 个答案:

答案 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会保留所访问城镇的顺序,因此您也可以打印它。

由于我没有完整的代码,我没有机会进行测试,因此可能需要在这里和那里进行优化。