从城市到另一个城市的最低成本

时间:2016-10-01 05:24:17

标签: algorithm

假设我们在数字行上有n个城市:1,2,...,n。定义一个函数c(i,j),它返回从城市i到城市j的成本,并假设它需要恒定的时间来计算。我们希望通过一组中间城市从1到n旅行,但只能前进。我们可以通过定义以下重现来计算这样做的最低成本:f(j)= min {1≤i

我认为这是旅行商问题的一个简单版本,但我觉得TSP的算法对于这个问题可能太难了......有人可以给出一些建议吗?

2 个答案:

答案 0 :(得分:0)

我们可以使用'动态编程'(基本上记忆递归)来有效地解决这个问题。

//min_cost[i] denotes min cost to go from city i to city n
set all min_cost[i] to INF

int solve(int i){
    // base case
    if(i==n)
        return 0;

    // if we have already calculated the ans from city i just return it
    if(min_cost[i] != INF)
        return min_cost[i] ;
    else{
        ans = INF;
        for(int j=i+1;j<=n;j++)
            ans = min(ans, c(i,j) + solve(j));
        min_cost[i] = ans;
        return ans;
    }
}

时间复杂度 - O(n ^ 2)

这种蛮力的方式就是试试所有可能的城市从当前城市出发。所以它看起来像这样,

int solve(int i){
    if(i==n)
        return 0;
    ans = INF;      
    for(int j=i+1;j<=n;j++)
        ans = min(ans, c(i,j) + solve(j));
    return ans;
}

其中如果你在城市我试图找到最小路径,通过所有可能的路径,看看哪个是最佳的。

但正如你可以看到,来自一个城市(例如j)的最低成本回答对于之前的所有城市(城市i&lt; j)都是有用的。因此,我们可以通过记忆解决方案来使用动态编程来优化解决方案。

如果您想在到达城市n后返回城市1,也可以轻松修改代码。

答案 1 :(得分:0)

这可以通过创建包含n个顶点(作为城市)的图表,并仅使用允许的方向从城市ij添加有向边来解决。

当我们创建图表时,我们可以通过运行Dijkstra算法获得最小路径,其中源是节点1,目标是节点n