繁体   English   中英

以给定顺序访问一组点的最小成本路径一次?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM