从很多网络上公开的工作流研究方面的论文来看,很多研究者都用过矩阵表示工作流图,矩阵天生就是表示图形拓扑连接的一种数学工具,加之在程序设计上面,采用二维数组+自定义数据结构就可以很好的实现一个矩阵,所以用矩阵来为工作流图建模是一个发展的方向,但是今天在继续开发矩阵工作流数据结构的时候,发现这里还存在几个关键性的问题需要解决
目前已经实现的工作流矩阵模型的构建是这样的,如下有一个简单的流程图
如果我们按照流程图的矩阵表示法,可以构建出如下的一个矩阵出来
(根据流程的节点之间的连接线的情况,比如说节点1到节点2有一条连接线,那么我们就在矩阵的第一行和第二列的交叉处用1来表示..节点2和节点3有一条连接线,那么我们就在第二行和第三列的交叉处用1来表示,如此类推,这个流程矩阵模型就完成了 )
但是我发现这个矩阵模型存在着巨大的缺点,使其不足以像SQL数据库结构那样很完善的表达一个流程图,这些缺点是:
1:这种矩阵结构无法清晰的表达出节点间连接的方向性,比如说节点1和节点2的连接方向是从节点1到节点2,还是从节点2到节点1,在这个矩阵里面无法表示出来
2:这种矩阵的元素表示的是节点间连接线,而不是节点本身,而我们的工作流系统在处理流程的时候,需要读取和设置节点本身的状态参数,如果这个矩阵无法存储节点本身的信息,那么用矩阵来表示流程图对我们设计工作流引擎的API帮助不大。。。
由于有这些缺点,所以用矩阵来表示工作流图的工作,还需要进一步的加强结构设计,起码要把上述的两个主要问题解决了。。。。
大家都知道,现在的GPU运算正在如火如荼的发展。。。如果工作流能够用矩阵模型来表示,那么我们的工作流系统是否可以用到GPU硬件对矩阵运算的强力支持呢? 这样的发展方向-既超大规模的动态流程图-运行在并行GPU系统上面。。
这里我还想进一步阐述我对于下一代工作流发展的看法,实际上工作流的结构近似于一个神经网络(http://www.iteye.com/topic/1129799),而如果我们实现了(节点数量>1000)的工作流图的存储和处理,以及自动处理过程,那么我们也可以在这样的系统基础上比较容易的实现一个类神经计算网络,如果工作流的拓扑结构发生变化,而矩阵存储的流程图拓扑数据也同步发生变化,那么这种自适应的动态工作流,完全可以在某种程度上变成人工智能系统的一个核心模块。。。也就是说。。现在打好工作流的基础,以后无论技术如何发展,我们都会拥有一个强有力的技术支撑。。。。
我们个人做开源,虽然在技术的精细度和理论的完善程度上面无法和专业的大公司和研究机构相比,但是我们的优势是灵活,具有前瞻性,实践能力与理论基础很好的结合
这个版本的JWFD是要好看些哈。。。嘿嘿
2013.6.21 今天先从理论上解决这前面提到两个关键问题 我能够思考到的初步的解决办法 如下
关键点1: 在矩阵元素中增加一个变量,表示连接线方向性的变量,用于标示连接线是从哪个节点到哪个节点。。。
关键点2: 在矩阵元素对线段变量转换为两个节点的变量 原来是 A线段 现在是 (A节点,B节点)
综合上面对两个关键问题的解决思路,那么这个矩阵元素就起码应该包含3个变量(群) {A,B,C}
A是节点1,B是节点2,C是连接线方向标示变量,方向变量用一个正负号来表示,+号表示A->B -号表示B->A
那么结合前面的设计 我们的流程矩阵元素数据结构应该是这样的 M12元素 {node1,node2,+}
然后node2节点的状态和类型数据应该存储在另外一个数据文件中,拓扑结构和状态参数应该分开存储,是吗? 我不是很确定
另外还有一些很重要的问题要考虑,比如说,以后要用GPU或者CPU对流程矩阵进行大规模数据读取和计算操作,那么这样的结构需要做什么改进?
(需要了解一个GPU编程的一些基础数据结构,然后进行一些前瞻性的预设计,免得以后要用GPU的时候,数据结构还要做大规模的修改,就比较麻烦了)
正在看GPU的资料,大概能够用到GPU里面的可编程顶点处理器进行矩阵处理。。。
2013.6.24 愉快的周末结束之后,今天继续完成我们伟大的JWFD-矩阵数据结构设计工程
今天把上周5设计出来的矩阵元素思路变成了代码,并全部输出出来,如下图(这个矩阵是一个6*6的流程矩阵,一个矩阵元素包含三个子数据结构)
101表示节点1的运行状态(我这里只是测试初始值,第一个值1表示 节点 is_active的状态(判断节点是否处于活动状态,我是从JWFDV0.96版本的SQL数据库中继承这个参数设计思路的,第二个值0表示节点 visited (节点是否已经被访问过状态值) 第3个值1(actioned_time)表示节点的处理次数
类似的010表示节点2的运行状态,设计原理同上所述
最后的+号如前面所说的是表示节点1和节点2之间的连接线的方向,+号就表示连接线方向是从节点1->节点2,-号表示反方向
那么这个矩阵应该就可以表示一个正在运行过程中的流程图的拓扑连接关系和节点运行状态参数值了,还需要添加什么东西呢? 还需要继续思考。。。。
这个类就是包含前面定义的那个节点状态值类(MatrixElement)的主类,里面有节点1(ME01),节点2(ME02)和表示节点间连接线的方向性的+-号字符串LindDirection
还有部分代码,我就没有贴出来了。。。太长了。。。等我把这个部分设计完,我会发布JWFD的矩阵数据结构建模模块代码的。。。
设计到这个部分,下一步就是修改JWFD的XML-TO数据库解析部分,把XML解析到数据库的代码转换为XML-矩阵解析过程的代码。。。。听听音乐。。继续
2013.6.27 这几天修复了几个JWFD原来的补丁,但是矩阵建模的工作仍然在继续
在初始化一个矩阵数据结构的时候,既把矩阵的元素全部用0来填充之后,我们要完成把XML图的节点和连接线信息转换到矩阵表中保存的时候,遇到一个技术细节上的问题,现在刚把这个问题解决掉,初始化之后的矩阵无法对单一的元素进行赋值,这可麻烦了,要知道,我们解析流程图XML数据的同时,就需要把XML文件中的流程图节点和连接线信息提取出来,并一一的写入矩阵(数据库)里面,无法对单一矩阵元素赋值,就意味着这个过程无法完成,真讨厌啊。。。
一个刚初始化完成的流程矩阵如下(000表示节点X的状态序列,*的位置是连接线方向+-的存储点)
然后我们调用如下的代码,模拟解析XML数据之后,把某几个节点信息写入这个矩阵的过程
//建立两个流程矩阵元素实例 以便下一步写入到矩阵中
WFMatrixElement WF01 = GM.new WFMatrixElement();
//把节点信息状态值设置好,这段代码应该是流程运行过程中调用的
WF01.ME01.Set_Actioned_Time(1);
WF01.ME01.Set_IS_Active(1);
WF01.ME01.Set_Visited(3);
WF01.ME02.Set_Actioned_Time(1);
WF01.ME02.Set_IS_Active(0);
WF01.ME02.Set_Visited(5);
WF01.Set_LineDirection("-");
WFMatrixElement WF02 = GM.new WFMatrixElement();
WF02.ME01.Set_Actioned_Time(0);
WF02.ME01.Set_IS_Active(1);
WF02.ME01.Set_Visited(2);
WF02.ME02.Set_Actioned_Time(1);
WF02.ME02.Set_IS_Active(2);
WF02.ME02.Set_Visited(1);
WF02.Set_LineDirection("+");
//初始化矩阵
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
GM.CM[i][j] = GM.WFME;
}
}
// 用具体的节点信息数据填充矩阵的某个元素
GM.ConstMatrix(WF01,2,3);
GM.ConstMatrix(WF02,4,3);
上面的代码最后两句就是把连接线和节点信息写入矩阵的执行代码,执行完成之后,矩阵表如下所示
大家注意到没有,这个矩阵表中的两个元素A[2][3]和A[4][3]被写入了模拟的流程图节点信息,这表示我们已经完成一个重要的工作
扫清了把XML文件转换为矩阵表的一个重要技术问题。。。。。。。。。接下来,再对矩阵的结构和建模代码再进行一些修正和细化
我相信,不依赖数据库的工作流系统一定会成功建立起来。。。。。