文章目录
- 1、约束传播问题的数学表示
- 2、传播引擎
- 3、幂等(idempotent)
- 4、调用事件
- 5、已解决的传播器
- 6、引擎优化
- THE END
1、约束传播问题的数学表示
\qquad 给定 变量集合 { X i } \{X_i\} {Xi}和其对应的值域 D ( X i ) D(X_i) D(Xi);给定传播器集合 { f j } \{f_j\} {fj}
\qquad
计算最大的值域
D
′
(
X
i
)
⊆
D
(
X
i
)
D'(X_i) \subseteq D(X_i)
D′(Xi)⊆D(Xi)使得
D
′
=
f
(
D
′
)
D' = f(D')
D′=f(D′),即计算最大的值域范围,使得无论再怎样调用传播器,变量的值域都不会再继续变化,若调用某个传播器
f
f
f之后,所有变量的值域均不发生变化,则称传播器
f
f
f达到一个不动点状态
。
2、传播引擎
\qquad
传播引擎可以看做是一种传播的方式(一种算法),这种传播方式重复采用传播器
f
∈
F
f \in F
f∈F,直到所有的传播器均达到不动点状态
。令
F
0
F_0
F0表示已经达到不动点状态的传播器的集合,
F
n
F_n
Fn表示未达到不动点状态的传播器的集合。令
i
S
o
l
v
(
F
0
,
F
n
,
D
)
iSolv(F_0,F_n,D)
iSolv(F0,Fn,D)表示传播引擎算法,算法流程如下所示:
\qquad
上述算法流程中有两个比较重要的函数:
C
h
o
o
s
e
(
Q
)
Choose(Q)
Choose(Q)和
N
e
w
(
f
,
F
,
D
,
D
′
)
New(f,F,D,D')
New(f,F,D,D′),分别用于选择县一个用于更新变量值域的传播器和向
Q
Q
Q中载入新的传播器。
\qquad
其中
C
h
o
o
s
e
(
Q
)
Choose(Q)
Choose(Q)可以使用队列来进行管理,利用队列先进先出的特性,选取在队列中逗留时间最长的传播器。
\qquad
N
e
w
(
f
,
F
,
D
,
D
′
)
New(f,F,D,D')
New(f,F,D,D′)函数在
F
F
F中选取出可能出现
f
′
(
D
′
)
≠
D
′
f'(D')\neq D'
f′(D′)=D′的所有传播器
f
′
f'
f′添加到
Q
Q
Q中;最简单的
N
e
w
(
f
,
F
,
D
,
D
′
)
New(f,F,D,D')
New(f,F,D,D′)函数的规则是观察调用
f
f
f之后,改变了哪些变量的值域,之后将这些变量所在的传播器均添加到
Q
Q
Q中,注意不要向
Q
Q
Q中添加重复的传播器。
3、幂等(idempotent)
\qquad
如果一个传播器满足
f
(
D
)
=
f
(
f
(
D
)
)
f(D)=f(f(D))
f(D)=f(f(D)),则称这个传播器是幂等的,即幂等传播器在调用一次之后,后续再进行调用时不对对变量的值域产生新的缩减效果。
\qquad
一个幂等传播器在被调用之后,不需要马上放回队列里面;但因为实际操作中很多变得值域中存在空洞,很多传播器都不是幂等的。
\qquad
值域传播器和最强的边界传播器(如果值域没有空洞)是幂等的。
4、调用事件
\qquad
一些变量的值域的改变不会导致传播器改变其他变量的值域,只有在一些相关事件发生时才需要唤醒调用某些传播器:
5、已解决的传播器
\qquad
有时候可以判断对所有未来的值域都存在
f
(
D
)
=
D
f(D)=D
f(D)=D成立,则称传播器
f
f
f是一个已经解决的传播器,在后续传播过程中均不需要将传播器
f
f
f放入队列
Q
Q
Q中。
\qquad
通常情况下,当
D
D
D所有的解均是
c
c
c的解,则称获得
D
D
D的传播器是已经解决的传播器。
6、引擎优化
\qquad 传播引擎可以通过下述方式进行优化:
- 所有含非单元素值域的非等( ≠ \neq =)传播器都放到 F 0 F_0 F0中
- 只有当非等( ≠ \neq =)传播器中某个值域编程单元素值域时,非等( ≠ \neq =)传播器才会被调用
- 非等( ≠ \neq =)传播器在一个值域传播器 f f f被调用之后,由于它是幂等的,所以可以将 f f f从队列 Q Q Q中永久移除
- 一个已解决的传播器应该被永久移除:e.g., 当某个非等( ≠ \neq =)传播器被传播之后;当一个约束的所有变量的值域均包含一个值