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

自从这里要求澄清起来,另一个牧师:

将给定的图分为一组,以便

  1. 我可以通过所有其他节点在集合中的成员资格来告诉一个节点,例如节点i仅存在于集合中,一个不应在集合中存在的没有其他节点

    如果在集合A和B中存在节点J,则仅在a和b中不应存在其他节点。如果节点的成员资格通过一些位模式进行编码,则这些位模式至少具有锤击距离

  2. 如果图中有两个节点相邻,则不应在同一组中存在,因此是独立集

示例:b没有相邻节点d => a,a => d

解决方案:

  1. ab
  2. / bd

A具有位模式10,其集合中没有相邻节点。 b具有位模式11,没有相邻节点,d具有01,因此所有节点的锤距至少为1 n no相邻节点=>正确

错误,因为D和A已连接:

  1. ADB
  2. / D B

A集合中有位模式10和D,它们相邻。 b具有位模式11,没有相邻节点,d和b具有11个,因此该解决方案中有两个错误,因此不接受。

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

我已经将转换为Max-Sat,为此使用SAT-SAT。但是条款的数量只是很大。更直接的方法会很好。到目前为止,我有一个近似值,但是我想要一个精确的解决方案或至少一个更好的近似值。

我尝试了一种方法,我使用粒子群从任意溶液到更好的溶液来优化。但是,运行时间非常糟糕,结果远非如此。我正在寻找一种动态算法或其他东西,但是我无法理解如何分裂和征服这个问题。

有帮助吗?

解决方案

这不是一个完整的答案,我不知道它对您有多有用。但是来了:

锤子距离使我成为红鲱鱼。您的问题声明说它必须至少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套。

在上面的示例中,您有一个这样的单纯形(M = 1),带有2个顶点{a,d}和1(无向)edge {(a,d)}。

您的问题似乎归结为在图中找到最大的完全连接的单纯胶。陈述不同,您有一个路由问题:您需要几个维度路由边缘,所以没有跨越?这听起来不是一个非常可扩展的问题。

发现的第一个大型单纯形很容易。每个顶点节点都有自己的位。

分离节点很容易。一旦处理了连接的节点,只需编号不连接节点依次跳过任何先前使用的位模式。从上面的示例中,由于A和D为01和10,B的下一个可用位模式为11。

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

考虑上面的示例中的示例中,将另一个节点C添加到示例:

如果C直接连接到A和D,则最初的问题将变成3个顶点{a,c,d}和3个边缘和3个边缘{(a,c),(a,d),(c,d) )}。一旦A,C和D采用位模式001、010和100,Disscoint 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可以得到该模式,因为两次使用11,一旦使用了11个,就不会保留2个或更多位的位模式,我们将不得不创建其余节点的新集合使其成为位模式100。

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

然后,问题变成: 您如何有效地找到最大的完全连接的单纯形?

如果找到最大的完全连接的单纯形太贵了, ,通过在连接方面找到最大最小值,可以在电势完全连接的单纯连接上构成近似上限:

  1. 扫描边缘以连接边缘计数更新顶点的边缘。

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

  3. 对于连接的节点N1和N2,再次扫描边缘,将计数递增为对应于CN2的N1,反之亦然。如果CN2> CN1,请更新N1数组中的最后一个计数,反之亦然。

  4. 再次浏览连接的节点,计算最大单纯键的上限每个节点可能是一个。当您扫描节点时,您可以构建一个带有一个顶点的鸽子孔阵列。

  5. 通过鸽子孔阵列从最大的提取到最小的提取和折叠节点进行工作。

如果您的节点在集合中,并且您的边缘在集合E中,则复杂性将为:O(| n |+| e |+O(步骤5))

如果以上近似足够,问题就变为: 考虑到要求,您如何有效地将节点折叠到现有范围内?

其他提示

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

如果此问题就像我想象的那样,则可以通过此算法找到独立集:1。在有向图上进行深度优先搜索,记录了该节点扎根的树的时间。 2.然后反转此图中的所有边缘3.在修改后的图表上再次进行深度费用搜索。 algorihtm精确地解释了 “血液介绍”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top