注目イベント!
春の新人向け連載2025開催中!
今年も春の新人向け連載が始動しました!!
現場で役立つ考え方やTipsを丁寧に解説、今日から学びのペースを整えよう。
詳細はこちらから!
event banner

用Petri网可视化UML无法表达的“动态”

日本語|English|中国语
| 3 min read
Author: kotaro-yaehata kotaro-yaehataの画像
Information

为了覆盖更广泛的受众,这篇文章已从日语翻译而来。
您可以在这里找到原始版本。

# 仅用UML不够?了解Petri网后可更深入理解系统

#

本文的目的

#

本来打算把解读 UML Format2.5.1 的结果写成文章,但在解读过程中发现需要 Petri网 的思路,于是学习了 Petri网。既然如此,就把学习成果分享出来,所以写了这篇文章。

UML 是一款强大的建模工具,但在表达系统复杂的行为或状态变迁时,有时会存在局限。因此,本文将介绍一种补充 UML、更深入理解系统的建模方法——“Petri网”。

通过阅读本文,可以获得以下效果:

  1. 减少因模型编写方式而在评审中被指出的问题,提高成果物质量
  2. 在进行需求分析等创建模型时,能够正确理解自己所创建模型的含义
  3. 通过理解模型的含义,更容易向客户解释模型

由于 UML Format 中多次出现 Petri网 的概念,这次将聚焦 Petri网,阐述其与 UML 的区别以及 Petri网 的应用方法。

什么是 Petri网?与 UML 的区别

#

Petri网 是 Karl Adam Petri 于 1962 年提出的一种用于数学描述离散分布式系统的方法。(离散分布式系统:如智能家居系统,将客厅照明调节、空调调节等并行且分散的操作串联起来,实现一个完整系统)

UML 和 Petri网 都是用于对系统行为进行建模的工具,但各有擅长的方面。

  • UML: 擅长表达系统整体结构及对象之间关系。
  • Petri网: 擅长清晰地表达系统内的状态变化、并行处理及时间流动。

例如,若用 UML 的活动图对系统行为进行建模,可以理解系统会执行哪些处理,但难以表达事件(动作)之间的状态变化,也不易在时间轴上表现行为,这是其弱点。

当客户提出“系统内部的各步骤以何种顺序发生”的更详细说明需求时,可借助 Petri网,更准确、清晰地进行说明和表达。

Petri网基础

#

构建 Petri网 所需的要素如下。Petri网 由库所(状态)、变迁(转移/事件)、连接它们的弧(输入弧、输出弧)以及标记组成。

  1. 库所(Place): 表示状态的圆形节点
  2. 变迁(Transition): 表示状态变化的矩形节点
  3. 输入弧: 从前状态连接至变迁,用于表示变迁触发所需的库所
  4. 输出弧: 从变迁连接至后状态,用于表示变迁触发后用于迁移到下一状态的库所
  5. 标记(Token): 放置在库所内部的黑点,表示系统的局部状态,即资源当前所在的库所

这是构成简单 Petri网 的基本要素。简单 Petri网 适用于并行处理建模,非常适合对多个彼此独立并发执行的进程等情况进行建模。需要注意的是,简单 Petri网 只能对相对简单的问题建模。然而,通过使用扩展 Petri网(如 Colored Petri Nets、Timed Petri Nets 等),也可以对复杂系统进行建模。
下面展示一个简单 Petri网 的建模示例。

简单 Petri网

基于上述,以下以制作老式甜甜圈(Old-Fashioned)为例,用 Petri网 进行表示。首先,为制作 Old-Fashioned,需要甜甜圈以及用于涂层的巧克力。因此,作为原料,存在尚未油炸的甜甜圈和未加工成巧克力酱的巧克力,这些都作为库所存在。当然,在此状态中,标记同时位于代表甜甜圈和巧克力的最左侧库所。

Petri网示例

在这里,当对甜甜圈进行油炸时,变迁“油炸甜甜圈”触发,标记从前状态移动到后状态。

Petri网示例

进一步,将巧克力加工为涂层用巧克力酱时,变迁“将巧克力加工成巧克力酱”触发,标记从前状态移动到后状态。

Petri网示例

最后作为收尾,将巧克力酱涂层于甜甜圈时,变迁“将巧克力涂层于甜甜圈”触发,两个标记从各自的前状态移动到后状态。

Petri网示例

Petri网规则

#

在 Petri网 中,标记有一些特殊的约束,这里进行说明。

状态表示

#
  1. 库所中标记的数量表示系统的局部状态
  2. 一个标记对应一个资源。若任意库所中有 k 个标记,就表示该库所中存在 k 个资源
  3. 若同一库所中有多个标记,则这些标记不可区分


    也就是说,标记只是表示在该库所的某个时间点上有多少资源,而不考虑这些标记(资源)的具体种类。

状态迁移规则

#
  1. 若各输入库所中存在的标记数量不少于对应弧的权重,则该变迁可触发。
    ※弧的权重通过在箭头上标注数字来表示(例如:若权重为3,则需要3个标记)
  2. 当变迁触发时,会从各输入库所中移除与输入弧权重(箭头数量)相同数量的标记,并在输出库所(后状态)添加与输出弧权重(箭头数量)相同数量的标记


    也就是说,在整个 Petri网 中,标记数保持不变,不会有多于箭头数量的标记移动。
    最后,以下示例展示了变迁触发前后的标记移动示意图。

变迁后标记示例

结束语

#

我也是借着解读 UML Format 的机会了解到 Petri网,认为它比 UML 更原始,却具有直观易懂的表达方式。

UML 有助于理解系统结构,而结合 Petri网 则能够更深入理解系统的动态方面。

  • 虽然熟悉 UML,却无法很好地表达系统的动态…
  • 想向客户具体说明系统的运行过程…

对于有上述困扰的读者,不妨考虑使用 Petri网 进行建模与表达。

理解 UML 与 Petri网 各自的优势,适当区分使用,应该能实现更高效的系统设计与开发。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。