如果你是实时系统验证、博弈策略综合的入门者,UPPAAL-Stratego 里的Cat and Mouse示例,绝对是理解工具核心能力的最佳 “开胃菜”—— 它把 “追逃博弈”“策略合成” 这些抽象概念,装进了一个你从小就熟悉的场景里。
引言:UPPAAL-Stratego 是啥?
先快速铺垫:UPPAAL-Stratego 是一款针对实时系统、多玩家博弈系统的验证工具,能自动帮 “可控方” 找 “必胜策略”—— 简单说就是:给定一个有 “玩家”“对手” 的场景,工具能算出 “玩家怎么做才能达成目标”。
而「Cat and Mouse」就是这个工具的 “明星示例”:用 “猫追老鼠” 的迷宫场景,把工具的核心功能(策略合成、统计验证、符号查询)全展示了一遍。
场景:猫在带窄通道的迷宫里追老鼠
系统的 4 个核心进程
Cat 进程:负责追踪猫的当前位置、以及猫能移动的所有可能方向
Mouse 进程:负责追踪老鼠的位置和移动可能;老鼠有个 “专属福利”—— 有一条通往奶酪的窄通道,猫走不了
CatP 进程:模拟猫的移动(上下左右),但移动会有延迟
MouseP 进程:模拟老鼠的移动(上下左右),移动也有延迟




游戏规则
目标:老鼠要抵达奶酪位置,同时不能被猫抓到(猫和老鼠位置重合就算被抓)
控制权:老鼠的移动是可人为控制的;猫的移动是不可控的(属于环境 / 对手)
策略逻辑:通过限制老鼠的可控动作,来实现 “逃到奶酪 + 不被抓” 的目标
1、系统模块
1.1 cat
如上图所示,为cat的模型。
这种双重圆圈的代表的是起始状态,在UPPAAL中用“location”来表示状态,所以这表示的是cat的起始位置是L0。
![]()
s是 “位置标识变量”,每个节点(比如 L0、L1、L4)都对应一个唯一的s值(比如 L0 对应s=0,L1 对应s=1,L4 对应s=4);模型通过s的值,就能知道 “当前角色在哪个位置”(比如s=1就代表cat现在在 L1 节点)。
“cr?”是同步信号,是等待接收信号cr!,当接收信号cr!,该条线激活,在UPPAAL中,线叫做edge,就会到达下一个location即L1,即实现右移1位。
其他的edge都是同理,由此实现cat的迷宫控制。
1.2 CatP

这是控制Cat的自动机,它对应 “猫每攒够延迟时间,就随机选一个方向移动” 的循环逻辑。
在讲解之前,先看看一些参数声明:
x是时钟信号;
CP指的是猫的延迟时间,也就是猫等待两个时间单位后,才可以动;
MP是老鼠的延迟时间,等待1个时间单位后,才可以动;
cu,cl,cd,cr分别代表上下左右移动。
![]()

回看自动机图,起始位置是x<=CP,cat处于“攒延迟”的阶段;
当x>=CP后,进入下一个location(cat的过渡状态,短暂停留的节点),同时x置零,等待下一次延迟;
1/1指的是每个方向的选择概率(这里 4 个方向都是1/1,代表等概率随机选一个方向),所以接下来随机选一个方向控制cat移动。

这个图对应猫的 “延迟→移动→再延迟” 的循环:
- 攒延迟:猫处于左大节点,时钟
x从 0 开始涨(每点一次模拟器的 Step,x增加一点); - 够延迟了→选方向:当
x ≥ CP(比如x=2),猫从左大节点跳到中间小节点,随机选一个方向(cu!向上、cr!向右、cd!向下、cl!向左,四个方向概率一样); - 移动后重置延迟:选完方向后,猫跳到右大节点,同时触发
x=0(把时钟重置为 0); - 回到攒延迟状态:从右大节点跳回左大节点,时钟
x又开始从 0 涨,准备下一次移动。
1.3 mouse
mouse的模型和自动机和cat的类似:
不一样的是mouse的初始位置是在L13,同时图中有标注:"Narrow passage only mice can use",也就是说想L12到L9这种只有一个方向的edge,只能mouse通过,cat不能通过。
其他的逻辑和cat一致。

1.4 mouseP
如下图,和cat不一样的是,MP=1,mouse只用等一个时间单位。
然后还有mouse是由我们控制的,因此没有随机的概率选择动作。

2、模拟
在下面这个选项中,可以进行模拟。界面如下,再点击next。
![]()

然后出来下面,可以选择小老鼠的动作,我们双击ml,让它往左走。再点击next。

如图所示,就看到小老鼠的状态转移到了L12中。

模拟器中就是这么进行移动的,同理小猫也是这么动。等所有的动作结束后,还可以点击Replay动态德观察这个过程。
3、验证
如图 点击verifier 进入验证界面,包括四大板块:overview query comment status
第一个板块overview是所有的要验证的语句;
第二个板块query就是具体的单个语句;
第三个模块 comment就是对单个语句的解释;
第四个模块status就是显示验证的结果。

UPPAAL 中针对猫鼠模型的验证查询语句,简单说就是 “问模型问题的句子”,目的是分析 “老鼠能不能到奶酪”“猫抓到老鼠的概率多大”“不同策略下结果有啥区别” 等。按功能分成以下 5 类:
-
语句1:E<> Mouse.Cheese -
→ 问:“老鼠有没有可能跑到奶酪位置?”(结果是 “能” 或 “不能”)
-
如下图,点击了check以后,即可开始验证,在status部分现实了satisfied,说明老鼠可能跑到奶酪位置。

语句 2:E<> Cat.s == Mouse.s
- 语句含义:“是否存在路径,让猫和老鼠的位置重合(猫抓到老鼠)?”
- 这条语句check后 还会生成一个可以在模拟器运行的轨迹,如图所示,两个位置重合,说明猫抓住了老鼠。

语句 3:strategy Fast = minE(time) [<=100] { Mouse.location } -> {}...
- 语句含义:定义 “Fast 策略”—— 让老鼠在 100 个时间单位内,用最短时间到达奶酪。
- 这是 UPPAAL Stratego 的核心功能:自动合成‘最优策略’。我们不用手动给老鼠规划路线,工具会遍历所有路径,算出‘最快到奶酪的走法’。这个‘Fast 策略’就是老鼠的‘极速通关手册’。
- 如下图这个界面是Fast 策略(老鼠最快到奶酪)的 “学习过程统计结果”。
1.(9009 runs)
-
含义:为了找到 “老鼠最快到奶酪” 的最优策略,UPPAAL 工具模拟了 9009 次不同的移动场景(相当于试了 9009 种老鼠的走法)。
-
2.
Learning statistics for best strategy: - 含义:这是 “最终找到的最优策略” 对应的学习过程数据。
-
3.Number of resets: 0 - 含义:“重置学习过程” 的次数是 0。(重置通常是因为工具没找到可行路径、策略卡住等,需要重新开始学习)说明学习过程很顺利 —— 工具一开始就找对了方向,没走弯路,不需要重新试。
-
4.
Number of iterations in last reset: 1+Number of iterations in total: 1 - 含义:“迭代次数”(工具调整策略的轮次)总共只有 1 次。
-
迭代次数是 1,说明这个‘最快路径’很明确 —— 工具只调整了 1 轮策略,就找到了老鼠到奶酪的最短路线,模型的迷宫结构比较清晰(最快路径没有太多复杂分支)
语句 4:simulate [<=100; 20] { Mouse.s } under Fast - 在 Fast 策略下,模拟 100 个时间单位、采样 20 次,看老鼠的位置分布
- 时间 0~9 左右:
Mouse.s的数值从 “较高值”(比如 12、13,对应老鼠的起点位置)快速下降; - 时间 9 之后:
Mouse.s稳定在 2~6 之间(对应靠近奶酪的 L2、L5 等位置),红色区域变得非常密集。 - 这个图是 Fast 策略的效果可视化:20 次模拟中,老鼠从起点(高
s值)出发,只用了不到 10 个时间单位就冲到了奶酪附近(低s值),之后一直待在目标区域。红色密集的区域说明 —— 不管模拟多少次,Fast 策略都能让老鼠‘极速通关’,这就是‘最快策略’的直观体现 -
语句4 strategy Safe = control: A[] Cat.s != Mouse.s - 这条语句就是制定安全策略,保证小老鼠不被猫抓住。
- check后生成后,可以在模拟器中运行。
语句5 Pr[ Cat.s == Mouse.s) under Safe
这条语句用来测试在安全策略下,猫抓到老鼠的概率。
最后得到的结果如下图,可知抓到的概率极低。

语句 6:
是又快又安全的策略。
结语:
「Cat and Mouse」不是一个 “玩具示例”—— 它是你理解 “如何用工具帮系统找最优策略” 的钥匙。如果你上手跑一遍,会更直观地感受到 “模型验证” 不是枯燥的公式,而是能解决实际博弈问题的工具。

67

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



