最高效率

时间:2013-02-05 13:28:13

标签: performance algorithm traveling-salesman nonlinear-optimization

最高效率问题

有N个城市,有一个流浪者。

他从一个城镇到另一个城镇所需的时间是众所周知的 - Txy(从x镇到y镇)。

从任何城镇,他都可以去任何其他城镇,所以这是一个完整的图表。

在每个城镇都有一定数量的钱,这是流浪者想要收集的。

现在还没有足够的时间通过所有城市。

拥有总可用时间T和起点i,问题是找到最佳路线,以便他收集的钱最多。

输入数字范围:

  • N介于400和600之间
  • Mx(M1,M2,...)在100和500之间,x在1和N之间
  • Txy介于80和200之间,x和y介于1和N之间
  • Txy是最佳时间距离,因此Txy <1。 Txz + Tzy,对于1和N之间的任何x,y和z。
  • T介于3500和5000之间

4 个答案:

答案 0 :(得分:2)

似乎动态:

表示 a [x] - 从城市x收集的钱。

dp [x] [t] 表示他可以花费的最大金额 t 并在城市 x 结束。初始化和更新如下:

  1. for startpoint x0 dp [x0] [0]:= a [x0] 。对于其他城市x dp [x] [0]:= -1 (无效);
  2. 每次 t 1 T
    for 每个城市 x
    for 每个城市 y s.t. edge [y] [x]&lt; = t
    表示 p:= t - edge [y] [x] ;

    如果 dp [y] [p]&gt; = 0 //可以及时到达y 然后 dp [x] [t] = max(dp [x] [t],dp [y] [t - edge [x] [y]] + a [x])
  3. 在所有dp [x] [t]上返回最大值。
  4. 总复杂度 O(T * N ^ 2)

答案 1 :(得分:1)

我正在考虑基于回溯的解决方案。 您应该定义一个算法来找到最佳解决方案(获得更多收益的解决方案)。 当您前往所有城市或超出时间时,您可以结束算法。 要忽略无利润的候选人:你必须测试根据仍然剩余的最少城市数来获得的资金是否至少是目前的最佳解决方案;并检查从一个城市到剩余城市所需的最短时间。

要了解您将获得的最低金额,您必须将每个城市的最低金额乘以一个城市的最低金额。

这同样适用于您访问所有剩余城市所需的最短时间。

编辑:我忘了告诉你这个算法的成本是O(a ^ n),其中 a 是图的arists数(即N *(N ^ 1) ))和 n 顶点的数量(即N)。 如果您定义好的功能以了解您的实际候选人何时无法成为解决方案,以及当它不能比当前的最佳解决方案更好时(如果您很幸运能够在开始时找到解决方案),那么成本会更高迭代过程,这确实有助于减少操作时间。)

答案 2 :(得分:0)

每个城镇的金额都是未知的,所以最好的路线是从一个城镇到下一个城镇的最短路线。

如果我使用递归在Javascript中对此进行编程,我会怎么做:

http://jsfiddle.net/rd13/ShL9X/5/

c = ['london', 'manchester', 'liverpool']; //Cities

t = {
    'liverpool': {
        'manchester': 130,
        'london': 260
    },
    'london': {
        'manchester': 250,
        'liverpool': 260
    },
    'manchester': {
        'london': 250,
        'liverpool': 130
    }
} //Time between cities

cn = 'london'; //Current city

var shortestDistance = 500,
    allottedTime = 300,
    next_city,
    time = 0,
    totalTime = 0,
    path = [cn];

optimal = function (cn) {

    for (i in t[cn]) {
        //So as not to visit cities that we have already visited
        if(path.indexOf(i)===-1) {
            next_city = t[cn][i] < shortestDistance ? i : next_city;
            shortestDistance = t[cn][i];
            totalTime = Math.min(t[cn][i] , shortestDistance);
        }
    }
    time += totalTime;

    path.push(next_city);

    if(time > allottedTime){
        document.write("The most optimal route between cities is: " + path);
    } else {
        optimal(next_city);
    }

}

optimal(cn);

抱歉没有关于算法的帮助,这是从编程的角度来看,因为我认为这是一个有趣的挑战。以上不是最佳思路。

答案 3 :(得分:-1)

这是一个众所周知的问题的变种,通常被称为旅行商问题。 您可以在此处找到有关此问题和类似问题的详细说明以及维基百科上的更多链接: http://en.wikipedia.org/wiki/Travelling_salesman_problem