Page 390 - 《软件学报》2024年第4期
P. 390

1968                                                       软件学报  2024  年第  35  卷第  4  期


                                                          1,2,3,4

                                                1,2,3  1,2,4   1,3,4   2,3,4



                                           1,2    1,3   1,4   2,3    2,4    3,4


                                                    1    2     3     4


                                                            ø
                                                       图 1 哈斯图

                    算法通过在哈斯图上执行相应的探索操作和剪枝操作来完成对                       MUS  的枚举过程. 探索操作对当前种子节点
                 执行向上或向下探索, 使其扩充为一个            MSS  或者收缩为一个      MUS; 剪枝操作则是根据公理        1  在哈斯图上进行相
                 应的剪枝, 剪去哈斯图中       MSS  对应节点的全部子集所在节点、MUS            对应节点的全部超集所在节点, 从而缩小算
                 法的搜索空间. 下面给出两种探索操作            (收缩操作和扩充操作) 以及两种剪枝操作              (向上剪枝和向下剪枝操作) 的
                 定义.
                    定义  10. 收缩操作   (Shrink) [21] . 给定一个子句集  C  和当前不可满足的种子    seed  , 对    ∀ 子句   l ∈ seed  , 将所有满
                                                                   l
                 足执行操作     seed = seed\{l} 后不改变  seed   不可满足性质的子句   从  seed  中删除, 从而将  seed  收缩成为一个  MUS
                 的过程称为对该种子的收缩操作. 对           seed  的收缩过程可以看作在哈斯图中从          seed  节点向下方路径探索的过程.
                    定义  11. 扩充操作   (Grow) [21] . 给定一个子句集  C  和当前可满足的种子     seed  , 对   ∀ 子句  l ∈ C\seed  , 将所有满
                 足执行操作     seed = seed ∪ {l} 后不改变  seed  可满足性质的子句  l 加入  seed  中, 从而将  seed  扩充成为一个  MSS  的
                 过程称为对该种子的扩充操作. 对          seed  的扩充过程可以看作在哈斯图中从          seed  节点向上方路径探索的过程.
                    定义  12. 向上剪枝操作     (BlockUp) [21] . 称对给定集合的全部超集从哈斯图上剪枝的操作为对该集合的向上剪
                 枝操作.
                    此操作是针对      MUS  的剪枝操作, 通过在     map  中加入以下子句实现. 对于一个        MUS U, 有:
                                                               ∨
                                                    BlockUp(U) =  ¬x i ,
                                                               i:C i ∈U
                 其中,   C i   为  U 中的一个子句,   x i   是  map  中代表子句   C i   的变量.
                    定义  13. 向下剪枝操作     (BlockDown) [21] . 称对给定集合的全部子集从哈斯图上剪枝的操作为对该集合的向下
                 剪枝操作.
                    此操作是针对      MSS  的剪枝操作, 通过在    map  中加入以下子句实现: 对于一个         MSS S, 有:
                                                                 ∨
                                                    BlockDown(S ) =  x i ,
                                                                i:C i <S
                 其中, 将公式的完整子句集命名为          F,   C i   为集合  F\S 中的一个子句,   x i  是  map  中代表子句  C i  的变量.
                  2   MUS  求解算法回顾

                    本节将回顾     MARCO  算法, 包括传统版本和优化版本, 即极大化模型的               MARCO   算法, 以及  MARCO-MAM
                 算法.
                  2.1   MARCO  算法
                    MARCO  算法是近年来最受欢迎的          MUS  枚举算法之一, 其框架简单、枚举快速. MARCO            算法的伪代码如算
                 法  1  所示, 其基本流程是不断地重复以下         3  个步骤.
                    (1) 当哈斯图中存在未探索节点时, 取一个未探索节点               seed .
   385   386   387   388   389   390   391   392   393   394   395