禁止弧
How-to


相关页面

反库所Anti-places/限定库所limit places, 队列Queues/堆栈stacks

引言

CPN Tools 并不直接支持禁止弧. 但是它可以模拟禁止弧的行为.

至少有两种方法可以达到这个目的. 一种方法是使用列表lists. 这种方法有些麻烦, 但是可以用于所有情况. 禁止弧的模拟也可以使用反库所anti-places. 这种方法较为简单, 但是它只能用于跟禁止弧相连的库所的令牌数量是有限的情况下.

示例

image no-inhibitor.jpg

这个网络模型是一个简单的生产者/消费者系统.

生产者 (没有详细建模) 发送包到网络上.

如果消费者准备好, 那么它就能接收包, 并处理包,然后处于准备好状态 (蓝色环). 如果网络上没有包, 消费者就可以进入休眠状态, 然后被唤醒 (褐色环).

问题出现在“网络上没有包”的情况下. 这可以使用禁止弧 (加粗红色弧)来建模. 哎,CPN Tools 并不支持 ...

使用列表Lists

一种方法是使用列表lists来克服 CPN Tools不支持禁止弧这一不足.

要模拟禁止弧,主要需要将颜色类型比如从`T'改变为 `list T', 将所有的输入弧 (对库所而言) 加进列表中, 而且所有的输出弧必须从列表中移出一个随机元素 (并将列表返回库所). 原来的禁止弧就变成了一个双向弧, 它移走 (再加入) 空列表.

上面的例子做了这样的改变后, 结果变为:

image list-inhibitor.jpg

声明的改变

相关库所的改变

输入弧

输入弧要像对堆栈stack一样来处理.

输出弧

输出弧相对于队列或堆栈要复杂一些, 因为本例必须要选择一个随机元素.

现在出现两个问题: 我们先前使用的变量 "p"  不在被设定一个特定值,而且新引进的变量 "rest" 也不被设定为特定值. 这时我们选择在输出变迁的警卫函数中设定两个变量的值.

禁止弧

最后我们必须在禁止弧上输入一个正确的注入式.

这样连接于禁止弧上的变迁就只有当其输入库所是空列表时才能触发, 这正是禁止弧预期的行为.

使用反库所

基于列表的禁止弧解决办法较为复杂, 而且在有些情况下并不需要使用列表. 如果相关库所的令牌数量只能是1的话,添加一个反库所anti-place 并加入一个双向弧(它从反库所中移走并加入反库所所有的令牌), 会使禁止弧的实现更容易一些.

在上面的例子中, 我们可以看到网络中至多有 4 个令牌, 所以反库所方法可以使用在这个例子. 反库所加入之后,我们可以得到:

image anti-inhibitor.jpg

首先我们发现对相关库所的任意绑定值,在这个例子中,绑定值为 5. (同样可以选择 4, 7, 或 1000000 等等).

添加一个反库所, 并将这个库所变为一个有限容量的库所, 关于有限容量的库所请参见 here.

现在就很容易地添加禁止弧:

如果这个库所先前就有绑定值, 那么添加的反库所并不改变它的行为, 而且这个构造也是正确的.

实例

这篇文档所描述的模型可以被下载: