Page 165 - 《软件学报》2025年第12期
P. 165

5546                                                      软件学报  2025  年第  36  卷第  12  期


                 略. 而传统的碰集算法在对不可分的子句集使用等价类策略时, 会额外增加对全集解集的极小化时间.
                    算法  2  是  HSDiag  算法结合等价类策略求解诊断, 初始时利用待诊断组件结构得到要分割子句的所有变量集
                 合  E. 根据系统描述对观测进行单元传播, 生成的子句集做一个整体存入                       CluseF  中, 此时大小为   1 (第  1  行).
                 CluseF  对选取的变量进行集合分裂, 生成子句集          F l , F r 存入临时变量  Temp_F  中, 继续集合分裂  (第  2–10 行). CluseF
                 中所有的子句集进行等价类分解存入              EC_Arr 中  (第  12, 13  行), 其中等价类分解采用文献     [15] 中  Distribution
                 算法. 接着对每一个等价类调用          HSDiag  算法, 并对等价类生成的解集笛卡尔乘积           (第  14, 15  行), 最后合并每一个
                 子句集中的解集      (第  16  行).
                 算法  2. HSDiag with equivalence class.

                 输入: 系统描述    SD, 系统观测   Obs, 组件  Comps, 变量集合  E={e 1 , e 2 ,…, e m };
                 输出: 诊断  D.
                        ← SD. 单元传播   (Obs);
                 1. CluseF
                 2. FOR (i=1; i  ⩽ m; ++i){
                             ⩽ CluseF.size; ++j){
                 3.  FOR (j=1; j
                 4.   IF ( ∃ e i    ∈ F j , F j   ∈ CluseF){ //如果子句集中含有该变量, 调用集合分裂规则
                 5.    F l    ← {S i −{–e i }|S i   ∈ F j    ∧ e i   < S i };
                 6.    F r   ← {S i −{e i }|S i   ∈ F j    ∧ −e i   < S i };
                 7.    Temp_F  ← Temp_F  ∪ F l   ∪ F r ; //Temp_F  是一个临时变量
                 8.   }
                 9.  }
                 10.  CluseF.clear; CluseF  ← Temp_F; Temp_F.clear;
                 11. }
                 12. FOR (  ∃ F j , F j   ∈ CluseF){
                 13.  EC_Arr  ← Distribution(F j ); //等价类分解
                 14.  FOR (  ∃ EC i , EC i   ∈ EC_Arr) //对等价类进行笛卡尔乘积
                 15.   D_Arr  ← D_Arr & HSDiag(EC i );
                 16.  D  ← D  ∪ D_Arr;
                 17. }

                    在分成等价类的过程中, 合理的分断点能够快速提升优化效率. 而在分割电路时, 若选取的传播变量较多, 那
                 么相当于枚举大部分的解集, 反而牺牲了碰集算法本身的启发式策略带来的优化. 对待诊断组件进行诊断编码是
                 已知组件内部结构, 先合理的离线分割等价类是可行的. 算法                  2  的第  14, 15  行时间复杂度分析如下.
                                                                              n
                    设  n  代表编码子句中集合的个数, 没有使用等价类策略时生成诊断解                    O(2 ). 等价类分解时需要选取       m  个变
                                  m
                 量, 最坏情况下生成      2 个子句集, 每个子句集分成        k 个等价类. 则通过等价类分解需要求出诊断解为               O(2  m+(n−m)/k ).
                            n
                 最坏情况下     2 /2  m+(n−m)/k   ⩽  1, 得出  (n–m)(1/k–1) ⩾  0, 当  k=1  时, 选取  m  个变量没有分割成等价类, 时间复杂度
                      n
                 T=O(2 ); 最好情况下  m=0, k=n, 子句集中所有子句都可以独立为等价类, T=O(n). 一些其他情况:
                                   n/2
                    m=2, k=2, T=O(2×2 );
                                 3
                                   n/4
                    m=4, k=4, T=O(2 ×2 );
                                   n/6
                                 5
                    m=6, k=6, T=O(2 ×2 );
                    …
                                               m
                                           n
                    由时间复杂度分析, 当解集         2   ≫ 2 时, 选取变量越少, 分成的等价类越多, 则优化越明显; 反之, 选取变量越
                 多, 分成的等价类越少, 则等价类带来的收益就越小.
   160   161   162   163   164   165   166   167   168   169   170