Algorithm 在非指数时间内解决灯泡切换难题?

Algorithm 在非指数时间内解决灯泡切换难题?,algorithm,Algorithm,灯泡通断故障: 给您的开关和灯泡很少,不一定相等,每个按钮可以连接到多个灯泡,当开关打开时,它会打开已经关闭的灯泡,关闭已经打开的灯泡。我们需要找出是否所有的灯泡都可以通过切换这些开关来点亮 我们可以在O(2^n.n.m.x)(n,开关数量;m,总灯泡数;x,任何开关打开的最大灯泡数)中强行解决这个问题。在这里,我们尝试开关O(2^n)的所有组合,并在从所选开关O(n.x)打开所有灯泡后检查是否所有灯泡都打开O(m) 这可以在非指数时间内完成,也许是一种启发式方法。 这在某种程度上与集合填充和集

灯泡通断故障:

给您的开关和灯泡很少,不一定相等,每个按钮可以连接到多个灯泡,当开关打开时,它会打开已经关闭的灯泡,关闭已经打开的灯泡。我们需要找出是否所有的灯泡都可以通过切换这些开关来点亮

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

这可以在非指数时间内完成,也许是一种启发式方法。 这在某种程度上与集合填充和集合覆盖问题有关,两者似乎都只有近似算法(NP难,IIRC)

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

你的问题可以看作是一个整数模2,其中乘法变成布尔“and”,加法变成布尔“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下的线性方程组,您可以使用适当修改的标准版本有效地解决此类问题

请注意,这种方法之所以有效,是因为翻转开关总是切换同一组灯泡。如果不是这样的话,那么方程就不是线性的,你也不能用这种方法求解。一般来说,如果在这类问题中有“或”与“和”混合在一起,你可能会有一些变化,这是NP完全的。

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

你的问题可以看作是一个整数模2,其中乘法变成布尔“and”,加法变成布尔“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下的线性方程组,您可以使用适当修改的标准版本有效地解决此类问题


请注意,这种方法之所以有效,是因为翻转开关总是切换同一组灯泡。如果不是这样的话,那么方程就不是线性的,你也不能用这种方法求解。一般来说,如果在这类问题中有“或”与“和”混合,则可能会有一些变化,这是NP完全问题。

简单情况下,X=1

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

非平凡情况,X>1

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

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

成本

最好的情况似乎是O(m2^n),使用等效的二进制计数,但使用开关而不是位,来检查每一个可能的开关组合,并测试是否所有的灯都亮起。请注意,对于此解决方案,可以影响多少灯光“x”并不起作用,因为尝试这样做实际上会增加计算的总体O()成本,并且实际上不会影响结果

解决这一问题的一些方法实际上会增加O(),例如解决一个线性方程组,它至少是O((xn)^(xn)),可能更多,因为它是一个概率关系。这是因为任何给定开关和任何给定灯光之间都没有线性关系,除了第一个简单的x=1示例,因此线性方程组中的每个“变量”都必须表示与灯光相互作用的每个可能组合

关于简化/优化的一些想法,但要付出代价

不过,在软件中实现它的一种可能更简单的方法是,由于表示更简单,在现代计算硬件上对某些n,m,x可能更快,但在O((m+n)!)下的估计最大成本更高,可以从开关和灯之间的关系中得出:任何给定的灯都将“打开”当且仅当影响该灯光的“开”开关数量为奇数时(第一个开关打开,第二个开关关闭,等等)。这需要为m个灯光中的每个灯光找到n个切换贴图(其中每个切换贴图表示灯光上开关的效果)上的排列,其中每个灯光都有2q+1个影响它的开关,因为q>=0


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

对于x=1的简单情况,每个开关只能控制一个灯泡,这是O(N),因为您只需切换所有开关并检查