JWFD工作流引擎设计--节点匹配搜索算法(再讨论)
NMSA Node matching search algorithm--节点匹配搜索算法说明
只所以要设计这样一个算法,原因是在设计流程引擎的过程中遇到下面的这个问题
“在对称条件下带条件选择的汇聚路由问题”:
问题的严格数学语言描述:在任意一个流程图中,存在N个分支点和M个汇聚点,所有汇聚点和分支点的关系有规则对称和不规则对称两种(图1中的A2的拓扑是 规则对称,A1,A3是不规则对称),每一个分支点的运行路径数S和它的实际分支路径数W有可能不相同,即S<>W和S==W的情况同时存 在,现在的问题是:在规则对称的拓扑结构下(A2),已知分支点的实际运行路径数值S,求图A2中对称汇聚点的实际访问(实际汇聚)数值K
(----图1)
问题的描述用比较严格的语言使得这个问题更加像数学问题,其实本来就是个数学问题,只不过我没有找到这个问题的所属的数学领域,干脆自己取个名字-叫流程 拓扑分析方法
该问题的现实描述(现实描述的含义是在实际的开发工作中用比较实际的语言来表述)
已知流程分支点的运行路径数值S,求流程图中一个汇聚点的实际访问(实际汇聚)数值,通过获取该数值,使得流程运行控制器(流程引擎)能够准确的控制流程 的运转走向,即准确的控制对条件异步汇聚点放行的时机
算法设计思路: 对于标准的对称的流程图而言,一个汇聚点一般来讲是应该对应一个分支点的,也就是说汇聚支路数应该和它前面的分支支路数相吻合(当然,这只是对很规则的对 称流程图模型来讲),那么如果在分支节点中如果出现了条件选择公式(或者智能脚本),那么从这个分支节点所分出来的支路,就不一定都会被选中,
简单举例, 我们在分支节点中嵌入了一个条件表达式
if a>2
Then goto PATH A B (实际运行两条分支)
else goto PATH A B C(实际运行三条分支)
if a=其它值
then ..............(更多的情况)
上述表达式中
流程节点中嵌入的a值一般是要在流程实际运行过程中才能够获得,因为a的值极有可能来自一个嵌入流程的表单,而这个表单要在流程运行的时候才能够被处理, 而处理的结果是实时的传递给流程的,所以从这个方面来讲,通过预先确定a值的方法来回避这个问题是不太现实的
(请参考 JE论坛上面大家对这个问题的讨论 http://www.javaeye.com/topic/513430
firebody同志的意见是a值可以放在数据库中
ronghao同志
意见1是”让这两个节点进行通信,可以在设计期就完成两者的互相映射“
意见2是另一种实现方式是采用token。如下图所示,在OR-split节点token根据实际触发的情况,每个触发的分支产生一个新的子token, 当子 token到达OR-join节点后即可通过其访问到它的父token,再通过父token遍历其子token即可获得OR-split节点实际触发的分 支信息。
图2
如果要采取其他的方式来处理这个问题,我比较倾向于ronghao同志的意见1,让两个关联节点进行通讯,使其互相映射在这种情况下,a的值一旦在运行状 态下被确定下来,后面和它映射的那个汇聚控制点就立即知道了这个值,那么流程引擎通过简单的运算就可以知道精确控制汇聚放行的条件K值了,这个思路非常不 错。。但是前提是要明确的知道互相映射节点是哪些,要在流程运行之前确定下来这一节点对,这个工作可以通过我设计的节点匹配算法
来完成,也可以在流程设计器设计流程的过程中,通过人工来完成,我个人认为,后者显得更加简洁明了些,但是前者也不失为一种有效的方法
(该算法的伪代码设计说明请参考我的博文 “JWFD工作流引擎设计----节点匹配搜索算法(用于初步解决条件异步汇聚问题) 补充” 地址:http://comsci.javaeye.com/blog/502102
该算法的JAVA代码 请参考 JWFD V0.96工作流开发包SRC中的org.jwfd.workflowEngines.Algorithm.TopologyAnalysis.java 文件
文件中有详细的说明 下载地址(本文附件) http://comsci.javaeye.com/blog/478323
旧版本JWFD代码开发包下载 http://d.download.csdn.net/down/1299903/comsci
)
(希望同志们对这个问题不要放弃,我觉得里面还有很多东西可以挖掘)
如果对采用匹配算法和节点映射都不是很感兴趣,那么ronghao同志的第二种方法-token方法也不错,这样的处理方法也很灵活,但是需要增加流程中 的控制变量,那么总体来讲就设计和开发工作量而言,ronghao同志的第一种处理方法是最优的,特别是通过在流程设计过程中确定下来匹配的节点这个办法 是在原理上和实际上比较易于理解和实现的,前提是流程设计器的设计活动中,系统需要增加一个或者几个变量来做对称节点的匹配映射工作,这个工作如果交给人 工用肉眼来完成,个人觉得显得比较方便。。哈哈,计算机算法在这个方面不如人的肉眼判断拓扑关系那么方便和直观,这也许就是当前和今后人工智能要努力的方 向了
有点感觉,把这个问题的解决方法形成一个体系,并从中总结出一些系统的原理和方法论来,不过这个过程应该比较长
很多理论体系都是在经过比较漫长的岁月的沉淀之后才逐渐形成的,我想工作流系统设计也不例外。。。