Page 208 - 《软件学报》2021年第11期
P. 208

3534                                Journal of Software  软件学报 Vol.32, No.11, November 2021

                    9.               index[i]←index[limit]
                    10.              index[limit]←offset
                    11.              limit←limit−1
                    12. Method getWord(⋅):
                    13.     for i←limit down to 0 do
                    14.        offset←index[i]
                    15.        word[offset]←words[offset]
                    16.     return word
                    算法 2 介绍了 STRFDE    add  的伪代码,省略部分与 CT 算法相同.STRFDE       add 是基于 CT 算法的改进算法,由于
                 附加约束所涉及的最后一个变量为此约束所对应的因子变量 x,且因子变量的论域和约束的元组是一一对应
                 的,所以因子变量的论域大小|D(x)|等于当前约束的元组数量|rel(c)|,若对每一个 a∈D(x)都构造一个 support[x,a]
                 而 support[x,a]的长度与 RSparseBitSet 中 words 的长度相等,这样就可能造成内存溢出问题.为了解决这一问题,
                 我们使用 bitset 来存储因子变量的论域,当因子变量发生改变时,直接使用因子变量的论域来修改约束的元组.
                 同样地,当约束的元组发生改变时,直接使用 RSparseBitSet 中的 words 来修改因子变量的论域.如此,我们只需要
                 为每个平凡变量构造 support[x,a].因此,last,support 和 residues 的大小都为|scp|−1.在算法 2 中的第 4 行和第 21
                 行所使用的 getFactorVariable 方法是用来获取与当前附加约束所对应的因子变量.
                    算法 2. STRFDE add .
                    1.   Data: scp: array of variables
                    2.   currTable: RSparseBitSet
                    3.   Method updateTable(⋅):
                    4.      x←getFactorVariable(this)
                    5.      if x.change(⋅) then
                    6.         currTab.intersectWord(x.getBitDom(⋅))
                                   val
                    7.      foreach x∈S  do
                    8.         …
                    9.   Method filterDomains(⋅):
                    10.    …
                    11. Method enforceGAC(⋅):
                          val
                    12.     S ←{x∈scp:|D(x)|!=lastSize[x]}
                                   val
                    13.     foreach x∈S  do
                    14.        last[x]←|D(x)|
                          sup
                    15.     S ←{x∈scp:|D(x)|>1}
                    16.     updateTable(⋅)
                    17.     if currTable.isEmpty(⋅) then
                    18.        return Backtrack
                    19.     filterDomains(⋅)
                    20.     if currTable.change(⋅) then
                    21.        x←getFactorVariable(this)
                    22.        x.removeValues(currTab.getWord(⋅))
                    STRFDE add  由 3 种方法构成.
                    •   updateTable 方法利用约束所涉及的变量来更新当前的有效元组:首先,获取当前附加约束所对应的因
                        子变量;然后判断这个变量是否被其他约束修改过,如果被修改过,那么我们需要用它来更新当前的有
   203   204   205   206   207   208   209   210   211   212   213