我遇到了这个问题并且不知道如何解决它。有人可以帮帮我吗?
有n个城镇连接n个城镇,任何2个城镇之间有一条公路。每条道路都有相关的正成本。国家的C市有2条连接的道路(城市也是其中一个城镇),而且每个城镇都有1到3条道路连接到它。
我们想要从C市开始旅行,访问不同的城镇(1< = m< = n),然后回到C.但是,我们可能需要回溯我们的旅行以访问m个城镇。给出一个算法来找到访问不同城镇的最短路径。
答案 0 :(得分:3)
此图表是带有根C的Binary Tree。
我想出了O(n^3)
算法,主要使用Dynamic Programming
dp[i][j]
存储i-th
城镇最短路径的值,访问其子树中的j
个不同城镇。我们可以很容易地找到
dp[i][j] = min (dp[sonl][k] + dp[sonr][j-k-1] + 2*wl + 2*wr | 1<=k<=j-1)
这意味着访问左子树中的k
城镇和右子树中的j-k-1
城镇。sonl
和sonr
是i-th
城镇的两个儿子,{ {1}}和wl
是wr
与i
和sonl
答案 1 :(得分:2)
阅读维基百科artice:https://en.wikipedia.org/wiki/Travelling_salesman_problem 这是一个难以解决的问题,这意味着您的解决方案将会很慢。它不是无法解决的,如果你有无限的时间,你可以很容易地解决它。最简单的算法是计算以起始城市开始和结束的每条可能路径,它们的权重和得到的最低路径。这是最愚蠢的方式,可能是计算上最昂贵的。
通常使用线性编程公式解决这些问题(不要与计算机编程/编码混淆),尽管我建议使用启发式方法。对“tsp遗传算法”进行谷歌搜索会给你各种文章,imho,解决这个问题的最佳方法。这是一个非常愚蠢和聪明的算法,同时它快速,非常快。唯一的问题是解决方案不是最佳的*。如果您想知道最佳解决方案,那么您需要检查问题的最优性条件(在您的情况下,任何可能路径的成本最低)。
如果你想满足最优性条件,那么快速解决就会变得更加困难,而不是NP-Hard分类。
(注意最简单的方法 - 计算每条路径 - 是由最优性条件推断出来的,尽管可以有一种更聪明的方法来确定你的计算路径是最优的。如果你找到一个更好的最优性条件来解决这个问题,打电话给记者,你会成为头条新闻。祝你好运。)
*如果你想要一个“好”的答案,比如一个非常低成本的路径,但不一定是最低的路径,那么遗传算法就是这样的方式。
答案 2 :(得分:0)
我认为如果连接图形,最好的机会是创建一个包含在图形中的生成树。你可以用Pirm算法做到这一点。这样您就可以轻松找到每个城市之间的最短路径。