Page 427 - 《软件学报》2024年第6期
P. 427

徐兰天 等: 面向超图数据的最大独立集算法                                                           3003



                 6.   for   u ∈ N v   do //标记  ∼ IS  超点
                 7.    if   State[v] = INITIAL  then
                 8.        State[v] =∼ IS
                 9.  return 所有状态为  IS  的超点
                    首先遍历图     G  的所有超点    v, 为所有的超点赋予一个状态值            State[v]. 初始时, 所有的超点的状态都为
                 INITIAL. 然后遍历超图   G  中的所有超点, 若当前访问的超点          u  的状态为  INITIAL, 则将当前被访问超点      u  的状态
                 置为  IS, 同时遍历超点    u  的所有的邻接超边中包含的所有超点, 如果这些点状态为                 INITIAL, 则将其置为~IS. 重复
                 本操作, 直到超图     G  中的所有超点的状态都不为         INITIAL, 此时输出所有状态为      IS  的超点, 即为算法搜索到的一
                 个近似的超图最大独立集.
                    算法完成后的所有的点的状态都为             IS  或~IS. 对于所有状态为   IS  的点, 每一轮循环中被置为      IS  的点都不会与
                 在他之前就已被置为        IS  的点有共同的超边. 因为如果存在这样的超点, 则该超点被枚举为                  IS  时, 他的邻接超点已
                 被置为   IS, 失去了再被置为    IS  的机会. 因此算法结束后所有的        IS  状态的点一定是一个超团独立集. 对于所有状态
                 的遍历顺序不同导致的, 一种好的遍历次序可以让算法
                 为~IS  的点, 每一个~IS  状态的点, 至少存在一个与他相邻的点已被置为                 IS, 否则这个点就不会被置为~IS. 则此
                 时~IS  状态的点都不能再加入当前所有          IS  状态的点组成的超图独立集.
                    然而, 这种贪心的搜索策略可能在一些情况下将非最优的超点加入独立集. 如图                          3  所示, 原图中共有    4  个点,
                 且  4  个点的度都为   3. 按照算法  1  枚举图中所有超点, 假如从超点         1  开始枚举, 则超点    1  的状态先被置为    IS, 此时
                 搜索超点   1  的所有邻居超点, 即     2, 3, 4  这  3  个超点. 将  3  个超点的状态都置为~IS, 此时图中所有点的状态已经都
                 不为  INITIAL, 则可输出本次超图最大独立集搜索结果, 即{1}.


                                                      1          2





                                                      3          4



                                                  图 3 基础算法的异常示例

                    可是, 如若改换算法      1  第  3  行的超点遍历顺序, 首先遍历超点       2. 则超点  2  的状态先被置为     IS, 此时搜索超点
                 2  的所有邻居超点, 即    1, 4  两个超点, 则将这两个超点的状态都置为~IS. 此时超点             3  的状态仍为   INITIAL, 则第  2
                 次循环遍历超点      3, 搜索超点   3  的所有邻居超点, 即     1, 4  两个超点. 但超点   1, 4  的状态在上一轮循环中都已被
                 置~IS, 则本轮不再有    INITIAL  状态的超点, 则循环直接结束. 此时可输出本次超图最大独立集搜索结果, 即{2, 3}.
                    显然第   2  次执行算法搜索到的独立集的大小大于第              1  次搜索到的独立集的大小. 这主要是因为算法             1  中超点
                                                           1  找到更接近于真实结果的超图最大独立集.
                  6   超图最大独立集的改进算法


                    本节中, 本文改进了      2-uniform  图上的剪枝方式   [37] , 提出了超图近似最大独立集的搜索框架, 3         种精确剪枝和
                 一种近似剪枝策略. 如算法        2  所示, 给出了超图近似最大独立集的搜索框架.

                 算法  2. 超图独立集剪枝框架.
                 输入: 超图 G 以及若干精确和近似剪枝;
                 输出: 超图 G 的最大独立集.
   422   423   424   425   426   427   428   429   430   431   432