在非指数时间解决灯泡切换拼图?

时间:2016-03-15 17:01:33

标签: algorithm

灯泡开关问题:

  

您将获得少量开关和几个灯泡,不一定相同,每个按钮可以连接到多个灯泡,当开关打开时,它会打开已经关闭和关闭已经开启的灯泡。我们需要通过切换这些开关来找到是否可以点亮所有灯泡?

我们可以在O(2 ^ n.n.m.x)中强制解决这个问题(n,开关的数量; m,总灯泡; x,任何开关打开的灯泡的最大数量)。我们尝试所有开关O(2 ^ n)的组合,并在从所选开关O(n.x)开启所有灯泡后检查所有灯泡是否都在O(m)上

这可以在非取幂时间内完成,也许是启发式的。 这有点与集合打包和集合覆盖问题有关,而且两者似乎都只有近似算法(NP-hard,IIRC)

2 个答案:

答案 0 :(得分:3)

答案是“是”,你可以在O(min((m ^ 2)n,(n ^ 2)m))时间内解决这种难题。

您的问题可以被视为整数mod 2的matrix,其中乘法变为布尔“和”,并且加法是布尔“xor”。

为了使事情更具体:您可以将“原始”灯泡状态(关闭所有开关)表示为布尔列向量,将每个开关的状态表示为另一个布尔向量,并将每个开关切换为的灯泡组表示为布尔矩阵的对应列:

output     original         matrix      switches
  [v]        [u]        [m m m m m m]     [x]
  [v]   =    [u]   +    [m m m m m m]  *  [x]
  [v]        [u]        [m m m m m m]     [x]
                                          [x]
                                          [x]

这是整数mod 2下的一组线性方程式,您可以使用经过适当修改的标准linear equation solvers来有效地解决此类问题。

请注意,这样做的原因是翻转开关总是切换同一组灯泡。如果不是这种情况,那么等式是线性的,你无法用这种方式解决它。一般来说,如果你在这类问题中将“或”与“和”混合在一起,你可能会对"SAT" problem有一些变异,这是NP完全的。

答案 1 :(得分:1)

琐碎案例,X = 1

对于x = 1的简单情况,其中每个开关只能控制一个灯泡,这是O(N),因为您只需要切换所有开关并检查所有灯是否都亮(这两个是单独的O(N) )操作,或者更确切地说,O(n)和O(m))。

非平凡案例,X> 1

对于x> 1,这不能在线性或多项式时间内完成 - 它至少是指数的,但更可能更糟糕,因为任何给定开关的效果与任何其他给定开关的效果不直接相关。给定开关A,不要求开关B影响或不影响任何与开关A相同的灯。它可能,但也可能不会。因此,开关之间的关系不可能减少。

这是一个标准排列问题,可以直接映射到任何其他主要排列问题,因此相同的非多项式O()(非多项式=指数或更差)对此都是正确的。

<强>费用

最佳情况似乎是O(m 2 ^ n),使用相当于二进制计数但使用开关而不是位,检查每个可能的开关组合并测试是否所有灯都亮。请注意,有多少灯&#39; x&#39;可能会受到影响并不会对此解决方案发挥作用,因为尝试这样做实际上会增加计算的总体O()成本,并且实际上并不影响结果。

解决此问题的一些方法实际上会增加O(),例如求解线性方程组,至少为O((x n)^(x n)),可能更多,因为它是一种概率关系。这是因为在任何给定的开关和任何给定的光之间没有线性关系,除了在第一个平凡的x = 1的例子中,所以每个&#34;变量&#34;在线性方程组中,必须代表与灯光相互作用的每种可能组合。

关于通过成本简化/优化的一些想法

在软件中实现它的一种更简单的方法是,由于表示更简单,现代计算硬件上的某些n,m,x可能更快,但在O((m + n)!)处估计的最大成本更高,可以从开关和灯之间的关系中得出:任何给定的灯都将是&#34; on&#34;当且仅当开关数量为&#34; on&#34;这会影响光线是奇数(第一个打开它,第二个打开它,等等)。这需要在m个灯中找到跨越n个切换图(其中每个切换图表示开关对灯的影响)的置换,其中每个灯具有影响它的2q + 1个开关,对于q> = 0。

然而,对于非常大的n,m切换每个开关和测试解决方案的简单二进制计数方法可能是最快的,因为它只是2的幂。