3

早上好,我是 AnyLogic 平台的新手,我已经开始研究它,因为我想用它来绘制公司的业务流程。我计划使用该工具的流程模型库对不同部门进行建模,目的是研究现在如何实现部门之间的信息流。

我的图表将由“源”元素和不同的“汇编器”元素组成,我希望最后一个(汇编器)作为网关。我附上一个简单的图表来更好地说明情况(示例)

假设 ''sourceA'' 和 ''sourceB'' (放置在不同的部门)生成两个不同的文档,使用两个自定义代理(例如,从 ''sourceA'' 生成的代理有一个 ''orderID'' 参数和从''sourceB'' 有一个 ''qualityCheckID'' 参数),在到达汇编器组件(放置在不同的部门)之前在各个队列上传送。由于部门不同步,队列很可能在模拟过程中未对齐(queue[10] = agent.orderID 设置为 10,queue[10] = agent.qualityIDCheck 设置为 9)。我希望汇编器作为网关工作,因此它等待“orderID”等于“”的代理

阅读文档,我看到代理在空闲时到达汇编器端口,否则在队列中等待。由于可能发生异步,在汇编程序端口中存在不具有等于 qualityCheckID 的 orderID 的代理,在这种情况下,我不希望生成汇编程序的输出。可能会发生必要的代理在队列中而不是在端口中,因此“组装者”必须在队列中搜索以查找相应的代理是否存在以及是否将其从队列中删除(在队列中替换错误的代理)端口将最后一个放入队列并产生输出)

有人可以帮助我了解如何实现此场景。

4

1 回答 1

1

早上好,安德里亚。

有一些替代方案。如果两个 ID 都是增量生成的(1、2、3、...、N),您可以使用 Match 块,它将同步您的流程。另外,您可以删除队列元素,因为此块已经包含队列。

但是,如果 ID 是随机生成的,您可能需要做一些变通并使用 Java 代码和函数。我会做如下:

而不是使用队列(一旦下一个块可用就将代理发送出去),我会使用等待块(这几乎是一个队列,但不会对元素进行排序,也不会在您想要它之前将代理发送出去。阅读 AnyLogic 上的描述就会清楚)。

每当代理进入等待块时,我会将其添加到带有整数(或您的订单参数类型)键和代理值(每个等待块一个)的LinkedHashMapHashMap集合中。这将允许更轻松的信息访问(而不是每次我想检查是否有特定代理时都搜索整个等待内容)。下一步是简单地检查其他等待块上是否有我需要执行组装任务的元素。如果是这样,将他们全部释放(以及当前代理)。

代码如下:

输入时:

WaitBlockHashMap.put(agent.orderID, agent)
if (WaitBlockHashMap2.get(agent.orderID)!=null) { //if the matching element 
                                                  //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.orderID));
}

或者

WaitBlockHashMap.put(agent.qualityCheckID, agent)
if (WaitBlockHashMap2.get(agent.qualityCheckID)!=null) { //if the matching element 
                                                         //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.qualityCheckID));
}

取决于该等待块中的代理类型。

我希望这会有所帮助,路易斯

于 2016-10-04T09:18:34.740 回答