组合独立集/汉明距离的算法/近似

Posted

技术标签:

【中文标题】组合独立集/汉明距离的算法/近似【英文标题】:Algorithm/approximation for combined independent set/hamming distance 【发布时间】:2011-03-31 15:13:15 【问题描述】:

输入:图 G 输出:若干个独立集,使得一个节点对所有独立集的成员资格是唯一的。因此,一个节点与它自己集合中的任何节点都没有连接。这是一个示例路径。

由于此处需要澄清,因此需要重新改写:

将给定的图形分成多个集合,以便

    我可以通过集合中的成员身份将一个节点与所有其他节点区分开来,例如如果节点 i 仅存在于集合 A 中,则其他节点不应仅存在于集合 A 中

    如果节点 j 存在于集合 A 和 B 中,则其他节点不应仅存在于集合 A 和 B 中。如果节点的成员关系由位模式编码,那么这些位模式的汉明距离至少为 1

    如果两个节点在图中相邻,它们不应该出现在同一个集合中,因此是一个独立的集合

示例: B 没有相邻节点 D=>A, A=>D

解决方案:

    A B / /乙丁

A 的位模式为 10,且其集合中没有相邻节点。 B 有位模式 11 并且没有相邻节点,D 有 01 因此所有节点的汉明距离至少为 1 且没有相邻节点 => 正确

错了,因为D和A是相连的:

    A D B /D B

A 在其集合中有位模式 10 和 D,它们是相邻的。 B 有 11 位模式且没有相邻节点,D 和 B 一样有 11,所以这个解决方案有两个错误,因此不被接受。

当然,随着图中节点数量的增加,这应该扩展到更多的集合,因为您至少需要log(n) 集合。

我已经写了一个到 MAX-SAT 的转换,为此使用 sat-solver。但是子句的数量太大了。更直接的方法会很好。到目前为止,我有一个近似值,但我想要一个精确的解决方案,或者至少是一个更好的近似值。

我尝试了一种方法,我使用粒子群将任意解决方案优化为更好的解决方案。然而,运行时间非常糟糕,结果远非很好。我正在寻找动态算法或其他东西,但是我无法理解如何分而治之。

【问题讨论】:

不。这是我现在正在做的一个项目的抽象。以为我会从这里得到一些输入,因为它本质上是两个 np 完全问题合二为一。 将其减少到 sat,但子句的数量对于 sat-solver 来说太高了。关于如何分而治之的任何想法? 请查看您的示例。例如句子“错了,因为 D 和 A 是相连的:”...... A 和 B 也是如此,但是是双向的。此外“因此,一个节点与它自己集合中的任何节点都没有连接”(??) 你能试着更清楚地重新陈述这个问题吗?我不清楚“路径”中的逗号分组连接列表与输入图 G 的关系。例如,D=>A 出现两次……这是否意味着从 D 到 A 有两条路径图表? 您愿意为赏金投入 200 个代表,因此请考虑通过提供更多说明、图表和任何有助于我们理解问题的内容来使投资物有所值,以便我们更快地为您提供帮助。 【参考方案1】:

不是一个完整的答案,我不知道它对你有多大用处。但这里是:

汉明距离让我印象深刻。您的问题陈述说它必须至少是 1,但它可能是 1000。只要说每个节点的集合成员资格的位编码是唯一的就足够了。

您的问题陈述没有详细说明,但您上面的解决方案表明每个节点都必须是至少 1 个集合的成员。 IE。任何节点的集合成员资格都不允许使用全 0 的位编码。

暂时忽略连接的节点,不相交的节点很容易:只需使用未使用的位编码对它们进行顺序编号。把它们留到最后。

您上面的示例使用了有向边,但同样,这让我觉得这是一条红鲱鱼。如果因为A=>D,A不能和D在同一个集合中,那么无论D=>A,D都不能和A在同一个集合中。

您提到至少需要 log(N) 个集合。您还将拥有最多 N 组。全连接图(具有 (N^2-N)/2 条无向边)将需要 N 个集合,每个集合包含一个节点。

事实上,如果您的图包含 M 维(M in 1..N-1)的完全连接单纯形,具有 M+1 个顶点和 (M^2+M)/2 个无向边,则您至少需要M+1套。

在上面的示例中,您有一个具有 2 个顶点 A,D 和 1 个(无向)边 (A,D) 的单纯形 (M=1)。

看来您的问题归结为在图中找到最大的全连接单纯形。换句话说,你有一个路由问题:你需要多少维度来路由你的边缘,所以没有交叉?这听起来不是一个非常可扩展的问题。

找到第一个大单纯形很容易。每个顶点节点都有一个新的集合,有自己的位。

不相交的节点很容易。一旦处理了连接的节点,只需对不相交的节点进行编号,顺序跳过任何以前使用的位模式。从上面的示例中,由于 A 和 D 采用 01 和 10,因此 B 的下一个可用位模式是 11。

然后,棘手的部分变成了如何在使用新位创建任何新集合之前尽可能地将任何剩余的单纯形折叠到现有范围内。折叠时,每个节点必须使用2个或更多位(集),并且位(集)不能与任何相邻节点的位(集)相交。

考虑一下当向示例添加另一个节点 C 时,上面的示例会发生什么:

如果 C 直接连接到 A 和 D,那么最初的问题就是找到具有 3 个顶点 A,C,D 和 3 个边 (A,c),(A,D),(光盘)。一旦 A、C 和 D 采用位模式 001、010 和 100,不相交 B 的最低可用位模式就是 011。

另一方面,如果 C 直接连接 A 或 D 但不是同时连接两者,则该图有两个 1-单纯形。假设我们首先找到具有顶点 A,D 的 1-单纯形,给它们位模式 01 和 10,那么问题就变成了如何将 C 折叠到该范围内。唯一具有至少 2 位的位模式是 11,但它与 C 连接的任何节点相交,因此我们必须创建一个新集合并将 C 放入其中。至此,解决方法与上述类似。

如果 C 不相交,则 B 或 C 将获得位模式 11,而其余的将需要一个新集合并获得位模式 100。

假设 C 连接到 B 但不连接到 A 或 D。同样,图有两个 1-单纯形,但这次是不相交的。假设首先找到 A,D,如上给出 A 和 D 位模式 10 和 01。我们可以将 B 或 C 折叠到现有范围内。该范围内唯一可用的位模式是 11,B 或 C 都可以获得该模式,因为它们都不与 A 或 D 相邻。一旦使用 11,就不会保留设置了 2 位或更多位的位模式,我们将不得不创建为剩余节点设置一个新集合,为其提供位模式 100。

假设 C 连接到所有 3 个 A、B 和 D。在这种情况下,图有一个具有 3 个顶点 A,C,D 的 2-单纯形和一个具有 2 个顶点 B,C 的 1-单纯形。如上所述,处理最大的单形后,A、C 和 D 将具有位模式 001、010、100。为了将 B 折叠到此范围内,设置 2 位或更多位的可用位模式为:011、101、110 和111. 除了 101 之外,所有这些都与 C 相交,因此 B 将得到位模式 101。

那么问题就变成了:找到最大的全连接单纯形的效率如何?

如果找到最大的全连接单纯形过于昂贵,可以通过找到连接的最大最小值来为潜在的全连接单纯形设置一个近似上限:

    扫过边缘更新 具有计数的顶点 连接边。

    对于每个连接的节点,创建一个 Cn 计数最初为零的数组 其中 Cn 是边数 连接到节点n。

    再次扫过边缘,对于连接的节点 n1 和 n2, 增加 n1 中的计数 对应于 Cn2,反之亦然。 如果 Cn2 > Cn1,更新最后的计数 在 n1 数组中,反之亦然。

    再次扫描连接的节点,计算上界 每个节点可以的最大单纯形 成为其中的一部分。您可以使用顶点列表构建一个鸽洞数组 扫描节点时的每个上限。

    通过鸽洞阵列从最大到最小提取和 将节点折叠成唯一的集合。

如果您的节点在集合 N 中,而您的边在集合 E 中,则复杂性将是: O(|N|+|E|+O(步骤5))

如果上述近似值足够,那么问题就变成了:在给定要求的情况下,您将节点折叠到现有范围内的效率如何?

【讨论】:

是的,这正是我想要的。帮助我改写的要点。 +1。你能澄清一下你所说的单纯形是什么意思吗?我正在阅读en.wikipedia.org/wiki/Simplex_graph,但我认为您的意思不是一个图,该图对相应图中的每个集团都有一个节点。也许单纯形在这种情况下只是意味着“子图”? 单纯形是一种形状:多边形、多面体或多面体。它是最简单的封闭形状,包括给定数量维度的直边、侧面或表面。单纯形总是凸的。在二维中,单纯形是三角形。在 3 维中,单纯形是四面体。在一维中,单纯形是一条线段。对于任何给定的维数 n,n-单纯形具有 n+1 个顶点和 n+1 个“边”。见:en.wikipedia.org/wiki/Simplex 好的,因为问题将在明天结束,我不希望你错过你的赏金,我将关闭这个。您能否具体说明您在哪里找到了该主题的答案或进一步阅读,在实施过程中我是否应该提出更多问题?例如,我如何获得节点所属的最大单纯形的上限?我还需要对第 5 点进行更多解释。 也许我会在我得到代表回来后发布一个后续问题。谢谢你的努力。【参考方案2】:

这可能不是您期望的答案,但我找不到添加评论的地方。所以我直接在这里输入。我不能完全理解你的问题。还是需要特定的知识才能理解?这个独立集是什么?据我所知,来自有向图的独立集中的节点具有到该集中任何其他节点的双向路径。你的想法是一样的吗?

如果这个问题和我假设的一样,可以通过这个算法找到独立的集合: 1. 在有向图上进行深度优先搜索,记录以该节点为根的树的遍历时间。 2.然后反转该图中的所有边 3. 在修改后的图上再次进行深度优先搜索。 该算法在书"introduction to alogrithm"中精确解释了

【讨论】:

1.这个问题很抽象,这意味着底层机制并不重要。独立集使冲突的组件彼此远离,但是该项目将做什么在这里很难解释,我的雇主不会非常喜欢它(:2.对于在图中单独找到独立集的问题,有合适的可用的近似值。主要问题在于这两个问题的结合,即一个节点对集合的成员资格是唯一的,并且仍然与其集合中的其他节点没有联系

以上是关于组合独立集/汉明距离的算法/近似的主要内容,如果未能解决你的问题,请参考以下文章

Atitti knn实现的具体四个距离算法 欧氏距离余弦距离汉明距离曼哈顿距离

算法461. 汉明距离(多语言实现)

算法

leetcode每日一题汉明距离

快速计算具有最小汉明距离的对

LeetCode 461. 汉明距离