【问题标题】:color-coding algorithm for the longest path最长路径的颜色编码算法
【发布时间】:2017-01-23 10:33:20
【问题描述】:

在任何事情之前,我想明确的是,这是为了大学作业,我正在寻求帮助以了解能够实现它的算法。 所以我有这个可以在这里找到的任务: https://www.labri.fr/perso/dorbec/AA/projet-uno.pdf

基本上,我们有一组“卡片”,由 2 个 int 表示,一个代表卡片的颜色,另一个代表数字。要做的工作是找到最长的牌序列,例如 UNO 游戏,其中下一张牌是或相同颜色或相同数字。 为此,在诅咒期间已经实施了一系列算法,但我们必须实施的最后一个是“颜色编码”,现在我的时间不多了,仍然不清楚它是如何工作的。 我会把文字的图片放在这里以保持格式。

任何理解它的帮助将不胜感激。

谢谢

【问题讨论】:

    标签: algorithm dynamic-programming probability np-complete


    【解决方案1】:

    我想我可以帮助你。 您的问题可以很容易地转换为最长路径问题。找到一条长度为 k 的路径真的很难解决很长时间。即使 k 相对较小,例如 log (n),人们仍然认为这在多项式时间内是不可能的。

    基本思想:您多次为图着色,并希望您不小心为长度为 k 的路径着色。嗯,这个概率很小,但是如果你重复很多次,这个概率实际上会变得很大。

    但首先,让我们假设图中有一条彩色路径。 “有色”是什么意思?彩色表示长度为 k-1 的路径有 k 个节点,用 k 种不同的颜色着色。如果你从一个颜色为 1 的节点 v 开始,你会怎么做? 你会看看你的邻居,看看他们的颜色是否与你不同。如果有,则将它们添加到一个名为 P(1) 的集合中。 您将继续使用其中一个邻居,看看他们是否有颜色,该颜色尚未出现在颜色集中。只要您找到尚未见过的新颜色或达到 k-1 种颜色或您看到其中一个节点具有您已经看到的颜色,您就会这样做。在最后一种情况下,您中止任务并返回一切正常的地方。

    重要提示:我们为节点着色。一条长度为 i 的路径,有 i+1 个节点和 i 边。

    更正式: 让P i(v):= {S is element of ([k] choose i+1)| there exists a path, colored with the colors in S, which ends in v} P 不是路径。 P 包含一些我们称之为 S 的颜色集。 在这种情况下,S 不是数字。它是不同颜色的基数 i+1 的子集。 例如: P 3(v) 可能看起来像这样 = {{green, red, black, yellow}, {pink, orange, grey, yellow},{...}}。注意到“黄色”两次了吗?如果我继续使用更多的子集,“黄色”就会出现在每个集合中。为什么?因为它是我们端节点v的颜色! 所以P i(v) 至少包含一组S 的所有不同颜色,其中一条长度为i 的路径被着色。这条路径以v 结尾!

    这是什么意思? 如果我们可以计算P k-1(v),并且集合不为空。存在一条长度为 k 的路径。太棒了。

    但是我们如何计算P k-1(v)? 这并不难: 如果我们想计算P i(v)。我们需要什么? 我们需要P i-1(x). X?为什么? x 是v! ---> g ----> y ---> o -----> x ------> v 的邻居 假设{green, yellow, orange, color of x}P i-1(x) 的一个子集。我们称它为R。 记住? P i-1(x) 可以有许多不同的集合。它可能看起来像这样:{{green, red, black, yellow}, {pink, orange, gray, yellow},{...}}!
    好的,那么与 R 和 x 和 v 的关系到底是什么? R 是一组颜色,表示长度为 i-1 且通向 x 的彩色路径。如果顶点 v 是 x 的邻居,它的颜色还没有出现在 R 中,那么我们可以将它添加到 R。但是现在 R 已经获得了一种颜色。它的大小 |R| 现在是 i+2。 看来这一定是 P i(v) 的新子集之一!为什么是现在? 好吧,我们已经将路径扩展了一种颜色,因此最好将其保存在相应的集合中! 那么到目前为止我们看到了什么:

    • 你有一个集合 P i(v),它包含子集 S,它本身包含 i+1 多种颜色(别忘了 v)
    • 如果你有一个集合 P k-1(v),你有一条长度为 k 的路径,你可以喝一杯啤酒。
    • P i(v) 可以通过 P i-1(x) 计算,其中 x 是 v 的邻居!好的部分是,您唯一需要检查的是 v 的颜色是否出现在 P i-1(x) 的一个子集中,我们称之为 R。

    你如何从一开始就计算它? 你从 P 0(v) 开始,它就是 v 的颜色。 然后对于 v 的每个邻居 x,您计算 P 1(v)。如果你回想一下 i-1 的事情,P 1(v) 就是 P 1-1(x)。 P 0(x) 再次只是 x 的颜色。如果 x 和 v 的颜色不同,它们只是形成了 P 1(v) 的第一个子集! 然后通过计算 P 1(x) 来计算 P 2(v),P 1(x) 再次由 P 0(y) 计算,其中 y 是 x 的邻居。 只要我们还没有达到 P k-1(v),这种情况就会继续。

    至于复杂性:这在 O(2^k km) 内运行。其中 m 是边的数量,k 是路径的长度。 所以现在我们可以在多项式时间内使用这个算法来搜索 k = log n 长的路径。如果它比那个大,那么它就不再是多项式了,不幸的是。

    所以,现在我们有一个算法可以在多项式时间内找到一条“长”路径。可是等等。只有路径是彩色的,它才能这样做! 我不知道你住在哪里,但在我的世界里,图表默认不着色,尤其是不同颜色的路径。

    我们必须这样做。 我们用 k 种不同的颜色为 k 长度的路径着色的概率是多少?

    有k!用 k 种不同颜色为图形着色的多种方法。但是有 k^k 种不同的方法可以用 k 种不同的颜色为路径着色,它们可能会出现多次。示例:对于黄色 = y 和绿色 = g,您有 2!=2 个选项,其中颜色必须不同:(y,g) 或 (g,y)。当颜色不必不同时,您有 k^k = 2^2 = 4 个选项。 (y,y),(g,g) 和你已经看过的那些。 所以 Pr[Path 用 diff 着色。 colors]=k!/k^k,大于 e^-k,与 1/e^k 相同。 所以你同意概率很小,对吧? 获得第一次成功的预期尝试次数是多少? 这是一个几何分布,期望值 = 1/p = e^k。 所以我们认为,在 e^k 尝试之后,我们可以第一次希望我们有一条彩色的路径。有时它更少,有时它更多。 问题。一次尝试失败的概率是 1-e^-k,非常大。但是如果我们说执行这个 Te^k 次,那么概率。 Te^k 连续失败变得非常小: (1-e^-k)^Te^k

    算法现在看起来如何?

    1. 用 k 种不同的颜色随机给图形着色。
    2. 执行检查是否有彩色路径的算法 有的话就退货。如果不继续。
    3. 重复步骤 1 和 2 Te^k 次。 (这很有趣,相信我)。 实际上不是。让电脑来做吧。

    这种算法称为蒙特卡洛型随机算法。 它的运行时间在 O(Te^k2^kkm) 并且错误的“不,没有路径(但实际上有路径)”的概率是小于 e^-T(同样,非常小。)再次,对于 k = log n,这个随机算法实现多项式运行时间!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多