Algorithm 最小乘法与集合覆盖问题

Algorithm 最小乘法与集合覆盖问题,algorithm,set,np-complete,linear-programming,set-cover,Algorithm,Set,Np Complete,Linear Programming,Set Cover,我有一个集合I={P1,P2,…,Pm},和I的n个有限子集,由R1,R2,…,Rn表示,如下所示: R1={P1,P2} R2={P2,P4} R3={P2,P3,P4} R4={P1,P2,P4} 其中Pi表示一个整数 对于每个Ri,我想计算它所有元素的乘积。 我的目标是通过在Ri(i=1,2,…,n)之间共享一些公共部分,尽可能少地使用多重化和分割 例如,如果我可以先计算P2*P4,那么这个结果可以用于计算R3和R4的所有元素的乘积 注意,除法也是允许的。例如,我可以先计算A=P1*P2

我有一个集合I={P1,P2,…,Pm},和I的n个有限子集,由R1,R2,…,Rn表示,如下所示:

R1={P1,P2}

R2={P2,P4}

R3={P2,P3,P4}

R4={P1,P2,P4}

其中Pi表示一个整数

对于每个Ri,我想计算它所有元素的乘积。 我的目标是通过在Ri(i=1,2,…,n)之间共享一些公共部分,尽可能少地使用多重化和分割

例如,如果我可以先计算P2*P4,那么这个结果可以用于计算R3和R4的所有元素的乘积

注意,除法也是允许的。例如,我可以先计算A=P1*P2*P3*P4,然后使用A/P1计算R3的所有元素的乘积,使用A/P3计算R4

如果我想使用最小乘法和除法来计算I的每个子集的所有乘积,这是一个集合覆盖问题吗?NP完全?顺便说一句,你能给出一个整数线性规划公式来描述它吗

如有任何建议,将不胜感激

社区编辑:添加假设:

  • 允许分割,与乘法的成本相同
  • 给定集合中没有重复的元素。e、 g.
    R5={P1,P1,P1,P2}
    是不允许的

  • 首先,你不需要除法

    这里不需要除法,它总是一个额外的计算

    如果需要分割,则表示您已经执行了多次操作,因此,如果分割,将撤消您已经完成的工作

    例如,如果您通过将Pi*Pj*Pk*Pn除以Pn来计算Pi*Pj*Pk,这意味着您之前计算了Pi*Pj*Pk*Pn,因此您之前计算了Pi*Pj*Pk

    (我假设你所有的数字都是素数)

    我的解决方案

    我有一个想法,没有考虑到分裂的可能性

    你可以开始用你的Ri建立一个

    那么乘法的数目就是树中的边的数目

    示例:

    使用您的示例,后缀树将是:

           P2
          / \
         P4 P1
        / \ 
       P3 P1
    
    得到4个乘法:

    M1=P1*P2
    
    M2=P2*P4
    
    M3=M2*P1
    
    M4=M2*P3
    
    求最小乘法数相当于用最小边数构建后缀树


    希望这能有所帮助。

    考虑一个元素Ri的图形,没有边。现在,我们可以按如下方式添加边:

    • 在Ra之间添加定向边→Rb,用商Rb/Ra注释
    例如,我们可以绘制一条边R1→R3,成本乘以R1/R3=P3*P4/P1

    对所有节点执行此操作,这样就有了| R | 2条边

    现在,如果只使用中间结果,可以使用最小生成树算法来解决这个问题。我相信MST算法在边的数量上非常接近线性(逆阿克曼的一个因子,增长速度比
    log(log(log(…log(n)))
    )慢);甚至可能在边的数量上存在随机线性时间算法,例如,因此此基本算法将花费| R | 2时间

    然而,如果你只使用中间结果,你就失去了真正的最佳答案,因为我们有可能使用“即兴”表达来获得更好的表现。例如,您可能会考虑这种情况:

    R1 = {P2, P3, P4, P5}
    R2 = {P1, P3, P4, P5}
    R3 = {P1, P2, P4, P5}
    R4 = {P1, P2, P3, P5}
    R5 = {P1, P2, P3, P4}
    
    最佳解决方案是计算
    P1*P2*P3*P4*P5
    ,然后除以Pi,得到9个运算。而上面的方法只会执行类似R1=P2*P3*P4*P5的操作,然后每次执行乘法和除法以转到R1→R2,R2→R3,R3→R4,R4→R5,导致11次操作。(如果我们没有除法,我们也会有9个运算:b=P1*P2 c=b*P3 r5=c*P4 r4=c*P5,d=P4*P5,r3=b*d,e=P3*d,r1=e*P2,r2=e*P1。虽然我认为可能会造成需要除法的情况,但似乎找不到除法;如果我找不到除法,这可能是一个简单的多项式时间问题。)

    我将这种方法称为“即兴表达”方法。如果我们选择计算一个即兴表达式(一开始是一个沉没成本),这将减少所有未来计算的成本,以便在我们选择使用它时遍历一条边(因为可能有选择使用多少个即兴表达式)

    这给我们带来了一个非常小的旁注:

    Theorem:
      You should have at least one intermediate expression of each 
      length up to the maximum size of any R.
    Proof (induction):
      To build up a product of size N, you will need to do 
      have a product of size N-1.
    
    注意到这个定理,我们发现上面有点错误。最佳解决方案是在计算
    P1*P2*P3*P5
    的过程中记住
    P1*P2*P3*P4
    。然后我们可以免费获得
    R5
    (和
    R4
    ,只需通过另一种方法进行一次乘法,不幸的是,成本与以前相同),将总成本从9降低到8。这让我们猜测,在很长一段时间后,使用任意边执行可能也会产生最优解

    无论如何,我们如何将这样一个系统整合到我们的解决方案中?我们不能添加一个节点,因为那样会弄乱MST算法。对于每个边,乘以或除以临时表达式E不会使某些P的幂P大于P(例如,对于P=2,我们允许使用中间临时表达式来创建产品,如
    P1*P4^2/P3
    ,但不允许类似
    P2^3
    ),我们在边上执行乘法和除法,并创建两条新边。(我们可能会不止一次这样做,或者在将来的某个日期)我们也会对边缘的所有子集这样做,我们会像上面那样回忆。如果使用MST算法,这种方法的代价是边的数量大幅增加,因此可能(| R |+#newedges)2=(|R | ^ | P |)2可能在更坏的情况下,显著增加了找到最佳答案所需的时间

    因此,作为猜测,更一般的问题似乎是NP难问题;如果不是这样,请有人插话。不过,您可能可以使用heuris