策略模型检查的优化与实践
在策略模型检查领域,为了提高效率和准确性,我们需要探索有效的方法。本文将介绍部分策略的生成、模型检查算法以及相关的优化策略,并通过实验验证其效果。
部分策略的生成
部分策略是指在模型的部分状态上定义的策略。给定一组状态 $S’ \subseteq S$,如果一个部分策略包含了 $S’$ 中所有状态的动作,并且包含了从这些动作可达的所有状态的动作,那么这个部分策略就是最大的。更正式地,一个部分策略 $f_{\Gamma}$ 是从 $S’$ 可达的最大部分策略,当且仅当:
$S’ \subseteq dom(f_{\Gamma}) \land \forall \langle s, a_{\Gamma} \rangle \in f_{\Gamma}, \forall a \in Act, a_{\Gamma} \sqsubseteq a \Rightarrow img(s, a) \subseteq dom(f_{\Gamma})$
这样的策略是一致的,当且仅当 $\forall s, s’ \in dom(f_{\Gamma}), s \sim_{\Gamma} s’ \Rightarrow f_{\Gamma}(s) = f_{\Gamma}(s’)$。
最大部分策略的主要优点是可以用于检查 $S’$ 中的状态是否存在获胜策略。下面是生成最大部分策略的算法:
Algorithm 3. ReachSplitΓ(fΓ)
Data: Γ a subset of agents, fΓ ⊆ S × ActΓ a partial strategy.
Result: The set of maximal strategies extending fΓ.
1 new = Post(dom(fΓ), strat) \ (dom(fΓ))
if new = ∅ then return {fΓ}
else
5 compatible = Compatible(new, fΓ)
newstrats = Split(compatible)
strats = {}
for f ′Γ ∈ newstrats do strats = strats ∪ ReachSplitΓ(fΓ ∪ f ′Γ)
return strats
该算法首先获取从 $f_{\Gamma}$ 一步可达但尚未包含在 $f_{\Gamma}$ 中的状态。如果没有这样的状态,$f_{\Gamma}$ 已经是最大的。否则,需要为新状态做出选择,通过移除与 $f_{\Gamma}$ 冲突的选择,并使用
Split
函数解决剩余的冲突。
相关函数定义如下:
- $Post(Z, f_{\Gamma})$:
$Post(Z, f_{\Gamma}) = { s | \exists \langle s’, a’
{\Gamma} \rangle \in f
{\Gamma}, a’ \in Act \text{ s.t. } s’ \in Z \land a’
{\Gamma} \sqsubseteq a’ \land s \in img(s’, a’) }$
它是考虑了 $f
{\Gamma}$ 中的动作和 $Z$ 中的状态的后像计算的变体,返回从 $Z$ 中的状态通过 $f_{\Gamma}$ 的动作可达的状态集合。
- $Compatible(Z, f_{\Gamma})$:
$Compatible(Z, f_{\Gamma}) = { \langle s, a_{\Gamma} \rangle | s \in Z \land a_{\Gamma} \in enabled(s, \Gamma) \land \not \exists \langle s’, a’
{\Gamma} \rangle \in f
{\Gamma} \text{ s.t. } s \sim_{\Gamma} s’ \land a_{\Gamma} \neq a’
{\Gamma} }$
它返回由 $Z$ 中的状态和这些状态中可用的动作组成的动作集合,这些动作与 $f
{\Gamma}$ 中的任何动作都不冲突。
使用部分策略进行 ATLKirF 模型检查
为了确定一组代理 $\Gamma$ 在状态子集 $S’$ 中是否有获胜策略,考虑的部分策略数量可能比模型的总体策略数量小得多。因此,可以通过使用部分策略来改进 ATLKirF 的模型检查算法。
算法的核心思想是只在重要的状态中获取公式的满足情况,而不是在系统的所有状态中获取。给定一组状态 $Z$ 和一个公式 $\varphi$,以下是返回 $Z$ 中满足 $\varphi$ 的状态的算法:
Algorithm 4. evalPartialirF(Z, ⟨Γ⟩ψ)
Data: Z ⊆ S a subset of states, ⟨Γ⟩ψ an ATLKirF formula.
Result: The set of states of Z that satisfy ⟨Γ⟩ψ.
sat = {}
2 for fΓ ∈ PartialStrats([Z]Γ) do
3 case ψ = Xφ′
Φ′ = evalPartialirF(Post([Z]Γ, fΓ), φ′)
5 win = Pre⟨Γ⟩(Φ′ ∪ NFair⟨Γ⟩(fΓ), fΓ)
case ψ = φ1Uφ2
Φ1 = evalPartialirF(dom(fΓ), φ1); Φ2 = evalPartialirF(dom(fΓ), φ2)
8 win = μX.(Φ1 ∪ Φ2 ∪ NFair⟨Γ⟩(fΓ)) ∩ [Φ2 ∪ ⋃fc∈FC Pre⟨Γ⟩[νY. (Φ1 ∪ Φ2 ∪ NFair⟨Γ⟩(fΓ)) ∩ (X ∪ fc) ∩ [Φ2 ∪ Pre⟨Γ⟩(Y, fΓ)], fΓ]]
case ψ = φ1Wφ2
Φ1 = evalPartialirF(dom(fΓ), φ1); Φ2 = evalPartialirF(dom(fΓ), φ2)
11 win = νX.(Φ1 ∪ Φ2 ∪ NFair⟨Γ⟩(fΓ)) ∩ [Φ2 ∪ Pre⟨Γ⟩(X, fΓ)]
sat = sat ∪ {s ∈ win ∩ Z | ∀s′ ∼Γ s, s′ ∈ win}
return sat
该算法递归地处理公式的结构,在每一步评估需要知道顶级子公式满足情况的状态集合。
进一步优化策略
为了使模型检查算法在常见情况下更高效,可以添加以下改进:
1.
提前终止以减少策略检查
:
-
完全提前终止
:当处理战略运算符 $\langle \Gamma \rangle \psi$ 时,
evalPartialirF
遍历从 $[Z]
{\Gamma}$ 生成的所有部分策略,并在
sat
中累积当前策略获胜的 $Z$ 的子集。当
sat = Z
时,可以终止循环,因为已经找到了所有 $Z$ 中的状态的获胜部分策略,无需检查剩余策略。
-
部分提前终止
:当
sat
增长时,可以重新考虑较小的策略。在检查由
PartialStrats([Z]_{\Gamma})
计算的策略时,当状态添加到
sat
中时,可以重新计算从 $[Z]
{\Gamma} \setminus sat$ 可达的较小策略,忽略考虑
sat
状态的部分。
-
基于阈值的提前终止
:当 $Z$ 中不在
sat
中的状态数量减少到某个阈值以下时,重新计算策略。
2.
使用缓存避免子公式的重新计算
:当模型检查算法处理战略运算符 $\langle \Gamma \rangle \psi$ 时,会枚举从 $[Z]
{\Gamma}$ 可达的所有部分策略,并为每个策略计算满足顶级子公式的状态集合。由于多个策略可能共享模型的相同子部分,会执行大量冗余工作。通过为 $\psi$ 的每个子公式累积遇到的状态的满足值,可以避免这种情况。
3.
预过滤失败动作
:一个动作如果不属于获胜策略,则为失败动作。实验表明,在完全可观察性下预过滤掉失败动作可以减少检查战略运算符所需的时间。可以在构建部分策略之前对从 $[Z]
{\Gamma}$ 可达的状态空间进行预过滤,只考虑剩余的子模型。
实验验证
为了验证上述算法和优化策略的效果,使用 PyNuSMV 实现了部分策略生成算法、模型检查算法和优化策略,并在两个不同的模型和多个 ATLKirF 公式上进行了测试。
实验模型
- 卡牌游戏模型 :由玩家和庄家两个玩家以及 $n$ 张卡牌组成。游戏分四个步骤进行,玩家可以选择保留或更换卡牌,获胜者是拥有获胜卡牌者。游戏可以无限重复,庄家是公平的。
- 田忌赛马模型 :由田忌和国王两个代理组成,每个代理有 $n$ 匹马。他们进行 $n$ 场比赛,马匹的胜负规则为 $h_i$ 战胜 $h_j$ 当且仅当 $i > j$,若 $i = j$ 则随机决定胜负。游戏可以无限重复,国王是公平的。
实验公式
| 卡牌游戏公式 | 田忌赛马公式 |
|---|---|
| $\langle player \rangle F playerWins$ | $\langle tianji \rangle F tianjiWins$ |
| $\langle player \rangle F (playerWins \land playerHasFirst)$ | $\langle tianji \rangle G \langle tianji \rangle F tianjiWins$ |
| $\langle player \rangle F \langle player \rangle [\neg dealerWins U playerWins]$ | $\langle tianji \rangle F \langle tianji \rangle [\neg kingWins U tianjiWins]$ |
| $AF \langle player \rangle X playerHasFirst$ | $\langle tianji \rangle X tianjiLostUpToNow$ |
| $AG(FirstStep \Rightarrow \neg \langle player \rangle X playerWins)$ | $\langle tianji \rangle G \langle tianji \rangle X tianjiWon < 2Races$ |
实验结果
-
部分策略的效果 :一些结果如表 2 所示,使用部分策略可以提高过程的效率。例如,对于 $\langle player \rangle F playerWins$ 和 $\langle tianji \rangle F tianjiWins$,验证所需的时间显著减少。这是因为在这些情况下,只关注初始状态中获胜策略的存在,需要考虑的策略数量较少。而对于 $AF \langle player \rangle X playerHasFirst$,需要知道所有可达状态中内部战略运算符的满足情况,验证速度没有加快。
| 公式 | 大小 # 状态 | 原始算法 | 基于部分策略的算法 |
| — | — | — | — |
| $\langle player \rangle F playerWins$ | 3 | 0m2.527s | 0m2.603s |
| $\langle player \rangle F playerWins$ | 4 | 0m8.035s | 0m8.205s |
| $\langle player \rangle F playerWins$ | 5 | 0m34.937s | 0m30.885s |
| $\langle player \rangle F playerWins$ | 6 | 2m14.461s | 1m39.931s |
| $\langle player \rangle F playerWins$ | 7 | > 15m | 9m46.126s |
| $\langle tianji \rangle F tianjiWins$ | 3 | 0m5.388s | 0m2.489s |
| $\langle tianji \rangle F tianjiWins$ | 4 | > 15m | 0m25.172s |
| $AF \langle player \rangle X playerHasFirst$ | 3 | 0m1.506s | 0m1.444s |
| $AF \langle player \rangle X playerHasFirst$ | 6 | 0m39.285s | 0m38.535s |
| $AF \langle player \rangle X playerHasFirst$ | 8 | 11m37.270s | 12m9.149s |
| $AF \langle player \rangle X playerHasFirst$ | 9 | > 15m | > 15m | -
优化策略的效果 :通过箱线图分析每个优化值对模型检查公式所需时间的影响。
- 提前终止 :在检查 $\langle tianji \rangle F tianjiWins$ 时,提前终止确实减少了所需时间,但不同类型的提前终止没有显著差异。
- 过滤 :在模型检查 $\langle tianji \rangle G \langle tianji \rangle X tianjiWon < 2Races$ 时,过滤可以显著减少验证所需的时间。
- 缓存 :在检查 $\langle player \rangle G \langle player \rangle F playerWins$ 且不使用提前终止时,缓存确实有帮助。
实验结论
- 预过滤 :在只有模型的一小部分在完全可观察性下满足公式时,激活预过滤可以大大提高过程效率,但在其他情况下可能会产生不必要的工作,尤其是在策略数量较少时。因此,预过滤在某些情况下有帮助,但在其他情况下会降低性能。
- 提前终止 :激活提前终止最坏情况下没有影响,当大多数策略都能获胜时,可以大大提高验证时间。但实验未显示哪种提前终止类型更好。
- 缓存 :在一些测试中,缓存可以提高性能,在其他测试中没有影响。因此,应该始终激活缓存。
综上所述,部分策略和相关优化策略在策略模型检查中具有重要作用,可以根据具体情况选择合适的优化方法来提高效率。
策略模型检查的优化与实践
实验结果深入分析
为了更清晰地展示实验结果,我们可以通过 mermaid 流程图来呈现不同优化策略在不同公式下的效果逻辑。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始实验]):::startend --> B{选择公式}:::decision
B -->|⟨tianji⟩F tianjiWins| C{提前终止效果}:::decision
C -->|有效果| D(提前终止减少时间):::process
C -->|无显著差异| E(不同类型提前终止效果相似):::process
B -->|⟨tianji⟩G ⟨tianji⟩X tianjiWon < 2Races| F{过滤效果}:::decision
F -->|有效果| G(过滤减少验证时间):::process
B -->|⟨player⟩G ⟨player⟩F playerWins| H{缓存效果}:::decision
H -->|有效果| I(缓存提高性能):::process
H -->|无效果| J(缓存无明显作用):::process
D --> K([结束实验]):::startend
E --> K
G --> K
I --> K
J --> K
从这个流程图可以看出,不同的公式对不同的优化策略有不同的响应。对于
⟨tianji⟩F tianjiWins
公式,提前终止能有效减少时间,但不同类型提前终止效果差异不大;对于
⟨tianji⟩G ⟨tianji⟩X tianjiWon < 2Races
公式,过滤策略能显著减少验证时间;而对于
⟨player⟩G ⟨player⟩F playerWins
公式,在不使用提前终止时,缓存能发挥作用。
我们还可以进一步分析不同模型大小下各优化策略的表现。以下是一个表格,展示了不同模型大小下部分公式使用不同优化策略的时间变化趋势。
| 公式 | 模型大小 | 原始时间 | 部分策略时间 | 提前终止时间 | 过滤时间 | 缓存时间 |
|---|---|---|---|---|---|---|
| ⟨player⟩F playerWins | 3 | 0m2.527s | 0m2.603s | - | - | - |
| ⟨player⟩F playerWins | 4 | 0m8.035s | 0m8.205s | - | - | - |
| ⟨player⟩F playerWins | 5 | 0m34.937s | 0m30.885s | - | - | - |
| ⟨tianji⟩F tianjiWins | 3 | 0m5.388s | 0m2.489s | - | - | - |
| ⟨tianji⟩F tianjiWins | 4 | > 15m | 0m25.172s | - | - | - |
| AF ⟨player⟩X playerHasFirst | 3 | 0m1.506s | 0m1.444s | - | - | - |
| AF ⟨player⟩X playerHasFirst | 6 | 0m39.285s | 0m38.535s | - | - | - |
注:表格中“ - ”表示该优化策略在此次实验中未单独统计时间。
从这个表格可以推测,随着模型大小的增加,部分策略在某些公式下能显著减少时间,如
⟨player⟩F playerWins
和
⟨tianji⟩F tianjiWins
。而对于
AF ⟨player⟩X playerHasFirst
公式,部分策略的效果相对不明显。
实际应用建议
根据上述实验结果和分析,我们可以为实际应用提供以下建议:
1.
公式特点与优化策略选择
- 当公式只关注初始状态的获胜策略时,如
⟨player⟩F playerWins
和
⟨tianji⟩F tianjiWins
,优先使用部分策略,能有效减少需要考虑的策略数量,从而提高效率。
- 如果公式的子公式只在小部分状态下为真,如
⟨tianji⟩G ⟨tianji⟩X tianjiWon < 2Races
,可以考虑使用过滤策略,在构建部分策略之前预过滤掉失败动作,减少验证时间。
- 当需要检查大量策略且可能存在冗余计算时,如
⟨player⟩G ⟨player⟩F playerWins
不使用提前终止的情况,激活缓存策略,避免重复计算子公式的满足情况。
2.
提前终止策略使用
- 无论何种公式,都建议激活提前终止策略。虽然实验未显示哪种提前终止类型更好,但它在大多数策略都能获胜的情况下,可以大大提高验证时间。可以根据实际情况选择完全提前终止、部分提前终止或基于阈值的提前终止。
- 例如,当状态集合 $Z$ 较小时,可以优先考虑完全提前终止;当状态集合较大且策略数量较多时,可以尝试部分提前终止或基于阈值的提前终止。
总结
通过对部分策略生成、ATLKirF 模型检查算法以及相关优化策略的研究和实验验证,我们发现这些方法在策略模型检查中具有重要的应用价值。部分策略可以减少需要考虑的策略数量,优化策略如提前终止、缓存和过滤可以进一步提高模型检查的效率。
在实际应用中,需要根据具体的公式特点和模型大小,灵活选择合适的优化策略。同时,不断探索和改进这些策略,以适应更复杂的模型和公式,将有助于提高策略模型检查的性能和准确性。未来,随着模型复杂度的增加和对策略分析需求的提高,这些优化方法将在更多领域发挥重要作用。
1057

被折叠的 条评论
为什么被折叠?



