这个谜题是关于一个许多人都很喜欢的话题:神奇宝贝!
你家附近的公园里到处都是神奇宝贝站,你可以在那里重新储备神奇宝贝,当然,还可以抓更多的神奇宝贝!你现在在其中一家,想去拜访他们所有人。Pokéstops位于公园固定坐标系中(x,y)坐标为整数的点上。
对于公园中任何给定的一对波凯停车点,都可以沿着一条路径从一个波凯停车站走到另一个,该路径总是从一个波凯停车点到相邻的另一个波凯停车点
你是一位雄心勃勃、效率很高的神奇宝贝教练,也是一位有点居家气息的人:你希望在旅行最短的总距离时,参观每个神奇宝贝站并返回起点。在这个开放的公园里,你可以从任何一点直线走到其他任何一点——你不局限于坐标系的网格。事实证明,这是一个非常困难的问题,所以你可以寻求一个近似的解决方案。
如果总共有N个Pokéstops,找到最优行走总长度的上下限。(您的目标是找到比率尽可能接近1的边界。)
高级额外学分:对于喜欢使用此主题的数字问题的解算者,假设Pokéstops位于坐标(x,y)的每个点,其中x和y是相对小于或等于1000的素数正整数。找到最优行走长度的上下限,再次寻找比率尽可能接近1的边界。
访问一组地点同时最小化总行程的问题称为旅行推销员问题(TSP),这确实是计算机科学中一个著名且众所周知的难题。话虽如此,边界如果我们利用其结构,特定TSP实例的解决方案可能很容易。
以下是我对第一部分的解决方案:
[显示解决方案]
为了澄清,我们知道有$N$Pokéstops,但不知道它们是如何安排的。这个问题要求我们找出访问每个波凯站并返回起点的最小行程的最小和最大可能值。
上限
Pokéstops最坏的安排是让它们排成一行,这导致路径长度为$2(N-1)$。要证明这确实是最糟糕的停车安排,需要更多的考虑,所以如果你感兴趣,请继续阅读。
让$T$成为最小生成树为一组博凯停止。任何具有$N$节点的树都有$N-1$条边,因此$T$有$N-1'条边。根据Pokéstops的邻接属性,$T$的每个边的长度必须为$1$。访问所有节点的一种方法是使用深度优先树遍历:
- 假设$T$的所有边最初都是黑色的。
- 随机选择一个节点作为当前节点。
- 查找从当前节点发出的黑色边。将该边绘制为蓝色,然后跟随它到下一个节点,该节点将成为新的当前节点。如果没有更多的黑色边,请使用蓝色边,并将其涂成红色。
- 重复此操作,直到所有边缘都漆成红色。
该过程明确地访问了所有节点并访问了每个边缘两次,总巡更长度为$2(N-1)$。本工程为任何波凯车站的安排。当然,这只是一个上限;最佳路径可能更短。通过将$N$停止点排成一行,我们得到了$2(N-1)$的上界,因此它一定是一个紧界。
下限
由于波凯站位于整数坐标处,因此从一个站到下一个站的最短距离为$1$。因此,访问$N$Poké的路径将停止,然后返回到起点的长度至少为$N$。是否有达到这一最低要求的博凯站安排?如果$N$是偶数,答案是肯定的;在$2\倍N$网格中安排站点:
然而,如果站点数量是奇数,则不可能以创建长度为$N$的路线的方式安排站点。要了解原因,请想象站点位于棋盘上。每一个最小长度的移动都会将你从黑色方块带到白色方块,反之亦然。因此,在经历了奇数次移动之后,我们无法回到开始的位置。第二个最短移动的长度为$\sqrt{2}$,因此我们可以做的最好的事情是:
因此,最佳步行长度的下限由下式给出:
\[
\text{下限}=\begin{cases}
0&\text{if}N=1\\
N&\text{if}N\text{is偶数}\\
N-1+\sqrt{2}&\text{if}N\text{是奇数且}N\ge3
\结束{cases}
\]
把所有这些放在一起
因此,最后,假设至少有两个Pokéstop,那么最小可能的边界比由下式给出:
$\显示样式
\text{绑定比率}=\开始{事例}
2-\tfrac{2}{N}&\text{if}N\text{是偶数}\\
2-\tfrac{2\sqrt{2}}{N-1+\sqrt{2]}&\text{if}N\text{是奇数}
\结束{cases}
$
适用于所有$N$的最小绑定比率是$2$,因此,如果我们不知道有多少个Pokéstops,就应该使用这个比率。
下面是我对第二部分的解决方案:
[显示解决方案]
对于Riddle的第二部分,我们给出了Pokéstop的一个非常具体的排列:点集$1\le i,j\le M$使得$\mathrm{gcd}(i,j)=1$(最大公约数为$1$)。问题要求$M=1000$,但我们暂时将$M$作为参数。
上限
任何参观所有博凯站并返回起点的旅行都会给我们一个上限。有这么多节点,不可能检查每个巡更,所以我们将比较不同的启发式方法来选择允许的路径,并看看它们是如何比较的。
一般上限:到达所有站点的一个明显方法是简单地访问$M\次M$平方中的整数坐标的每个点。我们从问题的第一部分就知道如何以最佳方式做到这一点;如果$M$是偶数且$M^2+\sqrt,则最佳巡演的长度为$M^2{2}-1如果$M$是奇数,则为$。有关构造示例,请参见下图:
因此,对于感兴趣的情况,这个微不足道的界限是1000000。我们一定能做得更好!
希尔皮滑雪场:找到合理路线的一种方法是使用空间填充曲线,它将方形中的每个点映射到曲线上的一个点。这为我们提供了一种根据停车点在曲线上的位置来排序停车点的方法。然后,我们按顺序参观这些站点。这种启发式是由John Bartholdi III教授以及其他方面,在许多情况下都表现得很好。
这个西尔皮恩斯基曲线这里经常使用,这是我用来找到的上限。以下是一些不同$M$值的解决方案示例。
这些路径的长度分别为313.9和1828.8。使用这种方法,对于$M=1000$的情况,我们的上限提高到815234,并且这是在0.35秒内计算出来的。
按列绑定:Sierpiánski方法利用了点的伪均匀分布,但它没有利用点经常出现在直线上的事实。例如,素坐标对应的行和列总是满的。另一个启发,由Diarmuid早期在评论中,是以类似割草机的模式进行,但一次两列。因此,当我们向上或向下移动一对列时,我们在每一步从这对可用点中选择下一个最近的点。以下是相同网格大小的示例。
这些路径略短于Sierpiánski路径,长度分别为308.3和1721.8。使用这种方法,对于$M=1000$的情况,我们的上限提高到735394,并在2秒钟内计算出来。
关于上限的更多信息:其他值得注意的针对上限TSP问题的启发式方法包括最近邻算法和Christofides算法。这些方法在我们的实例中效果不佳,因为它们需要计算全部的两两距离,当我们有大约60万个波凯站时,这是一项成本高昂的任务。Sierpinski和列式算法有复杂性$\mathcal{O}(n)$,其中$n$是停止的次数,而计算成对距离是$\mathcal{O{(n^2)$。这是一个显著的区别,因为$n$太大了-如果$\mathcal{O}(n)$算法需要1秒,那么$\mathcal{O{(n^2)$大约需要7天!
下限
一般下限:一种可能性是计算总共有多少个站点,并假设我们可以找到一条完全由相邻站点组成的路径。当然,这是不可能的,但它会产生一个下限。编写计算机代码来计算这个数量相对比较容易,或者我们可以利用这样一个事实,即$M乘以M$平方中的停点密度接近$6/pi^2大约0.6079$,即$M\to-infty$(来源). 对于$M=1000$的情况,下限为608383。还有很大的改进空间!
平均界限:另一个观察,再次感谢Diarmuid早期,即每个Pokéstop都有两条从它发出的边。因此,如果我们假设每个stop都连接到它最近的两个stop,那么我们将得到最短路径上的另一个下限。在$M=1000$的情况下计算这个数量,我们得到了一个大大改进的643811。
Held-Karp放松:这个最终的边界方法要先进得多。查找产生有效巡视的一组边(即为每条边指定标签0或1)需要两件事:
- 每个节点正好有两个标记为1的入射边
- 没有不相交的循环(这是一条连接的路径)
使这个问题如此困难的是第二个限制。周期呈指数级增长,因此不可能排除每一个周期。如果我们放松通过删除不相交循环约束,并允许每条边上的标签为0到1之间的任意数字,问题变成了线性程序(LP),这可以非常有效地解决。然后可以通过排除特定循环来进行连续的细化以改进解决方案。这被称为Held-Karp LP松弛不幸的是,这仍然需要计算所有成对距离,我们已经决定这太昂贵了(见上文)。LP也有$\mathcal{O}(n^2)$变量,因为我们需要每个边都有一个变量。所以我做了两个简化假设:
- 每个节点只能连接到其$k$最近的邻居之一。这是对GTSP的放松(图上的旅行销售问题)。这意味着我们现在需要计算的变量、约束和距离的数量是$\mathcal{O}(kn)$。
- 最终路径将是对称的($x=y$)。这允许我们使用一半的变量和约束,并大大加快了计算速度。
为了找到合适的$k$,我用$k$值4、8、12、16、20求解了松弛LP。解决方案为695251694956694954694952694952。因此,添加更多的边似乎没有用。对于感兴趣的人,我在朱莉娅使用JuMP公司具有古罗比。在我的笔记本电脑上,LP需要30-90秒才能解决。
把所有东西放在一起
这是一个比较上述所有边界的图。
因此,最终,对于$M=1000$的情况,我们的最佳界限是
\[
694952\le L^\star\le 735394
\]
近似比率约为1.06$。