在2024年某校妈妈杯校赛中,我们碰到了高铁安检流程优化问题,类似2017年美赛的机场安检流程评估与优化。我们查阅前人论文发现,他们采用petri网+随机过程处理的此问。
以下是本人在使用gsdn模型查阅的资料,并为运用进行举例,观点并不一定正确,如有错误还请指出。
想要准确了解GSDN模型及概念可以查阅 : [4]张建东,高晓光,吴勇,朱岩.GSPN 的分析方法及其应用[J].火力与指挥控制,2005,30(5):27-31。
如有错误非常抱歉!!
一、对 Petri Net 以及GSDN模型简要介绍
Petri网是对离散并行系统的数学表示。Petri网是20世纪60年代由卡尔·A·佩特里发明的,适合于描述异步的、并发的计算机系统模型。 Petri网既有严格的数学表述方式,也有直观的图形表达方式,既有丰富的系统描述手段和系统行为分析技术,又为计算机科学提供坚实的概念基础。(摘自百度百科)
简单的来说,通过有向弧构建网络图,通过设置其中库所(place)可容纳token数以及网络总token数,来模拟每一步中token是否发生变迁(从一个库所到另一个库所)。具体可见Petri网建模技术基础入门学习-CSDN博客。
在此提供一个简单的Petri Net 在matlab上运行的代码。 (鸣谢大佬,非原创,侵权可删,只是想为后来人指路>_<)
(以及我只是一下子找不到大佬id了呜呜呜)
%%petri网动态运行仿真程序
%%计算结果:变迁激发列表fired_t_list,记录激发的变迁;系统状态变化情况sys_state,记录变迁激发后各库所的令牌分布情况
%%作者:izzet
%%
clc;
close all;
clear
P=(1:13);
T=(13:25);
F = [[P(1),T(1)];[T(1),P(2)];[P(2),T(2)];[T(2),P(3)];[P(3),T(3)];[T(3),P(4)];[P(4),T(4)];[T(4),P(5)];[P(5),T(5)];[T(5),P(6)];
[P(6),T(11)];[T(11),P(12)];[T(2),P(7)];[P(7),T(7)];[T(7),P(8)];[P(8),T(8)];[T(8),P(10)];
[P(10),T(11)];[P(8),T(9)];[T(9),P(9)];[P(9),T(10)];[T(10),P(10)]];
M=[Inf 2 1 3 2 1 5 1 3 4 4 2 4]; %初始令牌分布
K=[Inf 10 31 23 Inf 25 Inf 19 Inf 18 Inf Inf Inf]; %各库所容量函数
W=[2 1.5 2 3 1 1 1 0.99 1 1]; %权函数
sys_state=M;
fired_t_list=[];
%pre_set={}; %变迁前集初始化
%post_set={}; %变迁后集初始化
pre_set = cell(1, length(T)); % 变迁前集初始化
post_set = cell(1, length(T)); % 变迁后集初始化
for i = 1:length(T)
pre_set{i} = []; % 初始化为空数组
post_set{i} = []; % 初始化为空数组
end
for i=1:length(T)
u=1;
v=1;
for j=1:length(F)
if F(j,2)==T(i)
pre_set{T(i)}(u)=F(j,1);
u=u+1;
end
if F(j,1)==T(i)
post_set{T(i)}(v)=F(j,2);
v=v+1;
end
end
end
%%
main_switch = 0; % 定义变量 main_switch,并初始化为 0
while main_switch == 0
enable_t = T; % 可激发变迁集合初始化,一开始假设所有变迁均可激发
for i = 1:length(T)
pre_switch = 0; % 初始化前集开关为 0
for j = 1:(u-1) % 变迁前集条件考察
arc = find(ismember(F, [pre_set{T(i)}(j), T(i)], 'rows'));
if M(pre_set{T(i)}(j)) < W(arc)
ind = find(enable_t == T(i));
enable_t(ind) = [];
pre_switch = 1;
break; % 一票否决制
end
end
if pre_switch == 1
continue; % 当前变迁不满足前集条件,跳过后续操作,进行下一轮循环
end
end
for j = 1:(v-1) % 变迁后集条件考察
arc = find(ismember(F, [T(i+12), post_set{T(i+12)}(j)], 'rows'));
if M(post_set{T(i+12)}(j)) + W(arc) > K(post_set{T(i+12)}(j))
ind = find(enable_t == T(i+12 ));
enable_t(ind) = [];
break; % 一票否决制
end
end
% 在这里添加根据一些条件更新 main_switch 的代码
if isempty(enable_t)
main_switch=1;
else
fired_t=enable_t(1); %特别处理
fired_t_list=[fired_t_list fired_t]; %该该变迁添加至列表
fired_t_pre=pre_set{fired_t}; %找出该变迁前集
fired_t_post=post_set{fired_t}; %找出该变迁后集
for i=1:length(P)
if ismember(P(i),setdiff(fired_t_pre,fired_t_post))
arc=find(ismember(F,[P(i),fired_t],'rows'));
M(i)=M(i)-W(arc);
elseif ismember(P(i),setdiff(fired_t_post,fired_t_pre))
arc=find(ismember(F,[fired_t,P(i)],'rows'));
M(i)=M(i)+W(arc);
elseif ismember(P(i),intersect(fired_t_post,fired_t_pre))
arc1=find(ismember(F,[P(i),fired_t],'rows'));
arc2=find(ismember(F,[fired_t,P(i)],'rows'));
M(i)=M(i)-W(arc1)+W(arc2);
else
M(i)=M(i);
end
end
sys_state=[sys_state;M];
end
end
而GSDN模型,则是在petri网的流程基础上,增加有着一定发生概率的变迁。如安检问题中,存在行李检测出危险物品/需要复检的可能性,因此可以采用GSDN模型做出研究。
二、GSDN的数学模型建立——马尔科夫链
因为GSDN存在有着发生概率的变迁,其迭代过程(每一步变迁)在数学模型上类似马尔科夫链变迁过程。实际上,因为概率的存在,并不便于进行 Petri Net 的模拟,而是根据数学原理搭建同构马尔科夫链,进行计算。
例一:(引用论文模型 [1])
如图,其中a1、a2表示两个随机事件发生概率,会变迁至不同的库所。而 v1~v11 则是各个变迁的引发速率(可以用 1/T 统一表示,T为该事件从发生到完成所需时间)
接着,根据变迁关系,列方程组
通过矩阵计算,能够得出 p1~p11 即每个状态的稳定概率。
下图是上式所用数据以及最终求解:
上述牵扯到两个随机过程,下面再举一个只包含一个随机过程的简单案例,供大家参考如何列方程组:
例二:(引用论文模型 [2])
三、根据求得稳定概率,对模型分析
其次,通过求得的稳定概率,我们能对该GSDN模型进行分析:
①平均token数:表示托肯出现在库所 X 的概率值的期望.平均托肯数越大,则旅客安检过程中 处于这个状态的概率越大,当token处于这个时间较长时,表示大部分时间被这一库所占用,则这一点 即为瓶颈。
②变迁利用率:变迁利用率这个值等于使变迁 t 处于可实施状态的所有状态标识的稳定概率之和.变迁 t 的利用率越大,触发该活动的可实施状态概率越大,流程中等待该变迁的token数量越大,等待(排队)时间越长。
四、参考文献
[1]黄艳红,汪凯,陈梦倩,等.基于Petri网模型的机场安检口客流量优化[J].上海工程技术大学学报,2017,31(02):154-160.
[2]孙霞,缪玉婷,张洁.随机Petri网在煤矿水害处理流程中的应用研究[J].煤矿机械,2023,44(11):183-185.DOI:10.13436/j.mkjx.202311054.
[3]张建东,高晓光,吴勇,朱岩.GSPN 的分析方法及其应用[J].火力与指挥控制,2005,30(5):27-31