Page 126 - 《软件学报》2021年第9期
P. 126

2750                                 Journal of Software  软件学报 Vol.32, No.9,  September 2021

             11 RETURN {l 1 ∨l 2 ∨…∨l n }.             //返回的是一个初始的极大项
             算法 3 中,i 代表初始的极大项,通过遍历子句集得到 F 中的变量数 n,再根据每个变量所对应的文字统计其
         正、负文字出现的个数,n(l i )表示变量对应的文字总个数.第 5 行~第 10 行是一个循环.根据正负文字出现的个数
         与变量对应的文字总个数,计算对应极大项中该变量应该赋值的概率,即有指向性地调整了变量赋值的概率.逐
         一对变量赋值之后,当赋值变量的个数完成了第 n 个后,说明初始极大项已经产生,算法结束.有针对性地选择初
         始极大项,会使下一步的推理更加精准,提高了推理效率.
         2.4   PERACC算法
             结合了以上算法,基于 ERACC 算法,我们提出了基于精确格局检测的并行扩展规则算法,算法过程如下.
             算法 4.  基于精确格局检测的并行扩展规则算法 PERACC(parallel extension  rule based on  accurate
         configuration checking).
             输入:CNF 公式 F,MaxTries,选取变量个数α;
             输出:不可扩展极大项 T′或最长尝试次数 MaxTries.
             1   result←CPVI(α)                    //选择变量数组
                      α
             2   num←2 ;                           //解空间总数
             3   FOR (i=0; i<num; i++)
             4      startThread(i,F′,T);    //函数 startThread 启动解空间 i,F′为化简后的子句集,T 为当前极大项
             5   T←SIMT(F′)                        //调用 SIMT 计算各个解空间的初始极大项
             6   WHILE j<MaxTries DO
             7      IF CanBeExpend(⋅) THEN RETURN T    //判定当前极大项是否能被扩展
             8      Compute the Candidate Set(left,right)
             9      P={v|Score(v)>0 and conf[v]=1}
             10     IF P≠∅ THEN
             11        IF left≤rignt THEN
             12           S={v|Score(v)>0 and left≤0≤rignt and conf[v]=1}
             13           IF S≠0 THEN x←v∈S with largest Score
             14           ELSE x←v∈P with largest Score
             15        ELSE x←v∈P with largest Score
             16     ELSE x←SWT(F,T,W[⋅],time[⋅])
             17     T′←T/ref(T,x)∪¬ref(T,x)
             18     j++
             19 WHILE (1) DO
             20     FOR (i=0; i<num; i++)
             21        IF EndThread(i)             //函数 EndThread 判断解空间 i 是否计算完
             22        THEN RETURN resultThread(i).    //函数 resultThread 返回解空间 i 的结果
             算法 PERACC 的执行过程大致如下:第 1 行~第 4 行通过调用 CPVI 算法选择初始变量,通过变量选择的数
         量,得到分解解空间的数量,并对各个解空间进行化简,然后对各个解空间进行求解;第 5 行调用算法 SIMT 来计
         算各个解空间的初始极大项;第 6 行~第 18 行是调用 ERACC 算法对每个解空间的求解,其详细过程可参考文献
         [18,19];第 19 行~第 22 行是一个死循环,当各个解空间中,某一个解空间找到了扩展不出的极大项,那么跳出该
         循环.
         3    实验结果与分析

             本节对算法 PERACC 算法进行实现,并且将其与扩展规则领域主流的求解器 SER,ERACC 以及国际主流
   121   122   123   124   125   126   127   128   129   130   131