![](/img/trans.png)
[英]Given a set of points in 2d coordinates system, how to calculate the minimum distance and the path if we visit all the points only once?
[英]Minimum cost path to visit a set of points in a given order exactly once?
我们在2D平面上给出了一组N个点,我们必须找到一个路径,该路径以1-2-3 ...... N的顺序访问所有点并且返回到1以使得所花费的时间最小化。 我们可以向北,东,西或南移动一步,需要1个单位时间。 除了1之外我们不能多次访问N点中的一个,我们不能访问超过两次。
N <= 100
每个点的x和y轴<= 1000000
( 这是过去USACO比赛中出现的完整问题陈述)
点的x和y轴可以非常大但是只有<= 100点因此,我们改变点的x轴,以便当它们按x轴的升序排列时x轴的差值相邻点为1.我们对点的所有y轴都做同样的事情。
现在我们找到从点1到2,从2到3,......以及从N到1的最短路径,而不访问除源和目标之外的任何给定点。 我们不能使用简单的bfs来找到最短路径,因为从点x,y到点x + 1,y的距离不是1,而是x + 1的原始值减去x的原始值。 所以我使用Dijktra的算法和二进制堆来找到最短路径。
但是这个算法不适用于一半的测试用例 ,它输出的解决方案大于正确的解决方案。
为什么这个算法错了? 我们怎么解决这个问题呢?
点的x和y轴可以非常大但是只有<= 100点因此,我们改变点的x轴,以便当它们按x轴的升序排列时x轴的差值相邻点为1.我们对点的所有y轴都做同样的事情。
这实质上意味着您删除“未使用”的坐标。 但这将耗费你的操作空间。 请看以下示例:
4
1 1
3 3
3 2
1 2
这里最短的路径需要8个步骤。 假设正x为东,正y为北,则最佳路径为ennESwWS
,大写字母表示到达下一个农场。
/--2
| |
4--|--3
| |
1--/
现在,如果您执行压缩方案,那么您将删除y = 2列,并且实际上将保留没有任何列,您可以从农场1传递到农场2而不访问农场3或4.所以我看不到任何收益从这种压缩,但很麻烦。
所以我使用了Dijktra的算法
什么图表? 如果您只在农场使用Dijkstra,那么您将遇到麻烦,因为您必须考虑非农场位置。 如果你也采取这些措施,就我所见,事情应该有效。 除了前面的压缩。
如果你想保持这个想法,你可以做的是将空行或列的连续范围压缩成一个。 这样,您的图表将保持相当小(最多201行和每列),但是如果农场周围有空间,那么您的图表将代表这一事实。
我想我会为Dijkstra使用一个“绕道度量”:每一步让你更接近距离都是零成本,而每走一步都会让你失去成本。 最后,您可以考虑绕道费用,乘以2(因为您带走的每一步也是您必须朝着目标迈出的一步)并添加终点的曼哈顿距离(这是零迂回成本) )你回来了原来的费用。 这基本上是来自A *的想法,但是与Disjkstra的性能(和现有实现)有关。
如果你压缩这个
..2
...
3.4
...
1..
对此
.2
34
1.
然后你将路径的长度从1增加到2,因为34构成了一个虚假的障碍。 您可以将多个空行/列压缩为一个空行/列而不是无。
我的想法是:从点i
到点i + 1
的距离何时不是曼哈顿距离? 在我看来,唯一的情况是当存在完整的水平或垂直块(或两者)时,例如,
(i+1) X (i+1) (i+1)
X
XXX XXXX X XXXX
X X X
i i X i X
我还没有编码任何东西,但也许在计算到下一个点的路线时扫描任一块是有用的,如果块存在则计算最小绕道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.