Q: [Anylogic] 如何计算在seize block队列中等待的所有agent的变量总和?
Posted
技术标签:
【中文标题】Q: [Anylogic] 如何计算在seize block队列中等待的所有agent的变量总和?【英文标题】:Q: [Anylogic] How to calculate the sum of variables of all agents that is waiting in the queue of seize block? 【发布时间】:2018-04-01 19:46:24 【问题描述】:我还是 Anylogic 的新手。我需要一个解决问题的建议。 例如,现在有 3 个代理在抢占块的队列中等待。 第一个代理包含变量 6 第二个代理包含变量 5 第三个代理包含变量 6 因此,来自 3 个代理的变量总和为 17。 注意:这三个变量的类型相同(整数)。
问题:我想知道有没有办法计算这个值?
模型说明。
有一个产品将由两个工人处理。 基本上,一个产品必须由 3 个任务处理,即任务 A、任务 B 和任务 C。任务 A 和 C 称为“固定任务”。任务 A 将由工作站 1 的工人 1 完成。同样,任务 C 将由工作站 2 的工人 2 完成。但是,作为“共享任务”的任务 B 可以由任何一方完成工人 1 或 2 在他们自己的工作站。 每次工人 1 完成任务 A 后,他必须决定是将产品放在缓冲区供工人 2 执行共享任务还是自己执行共享任务。
首先,产品从源块流出,然后由第一个工作站的第一个工人处理,工人1完成他的固定任务后,他将决定是做还是通过与worker2共享任务。该决定基于站 2 前面缓冲区中的子任务总数(让我们分配这个值 = T)。值 T 将与通过计算获得的值 R 进行比较。如果 T 大于 R ,则工人 1 将执行共享任务,否则他将让工人 2 执行。
我的想法是,我在代理(产品)中创建了一个变量,即要完成的剩余子任务的数量。当代理退出选择输出块 true 或 false 时,将嵌入此值。 问题是,在缓冲区,我不知道如何计算 T 值,这是工人 2 必须执行的所有剩余子任务的值。
关于我的问题,如何获取缓冲区中的子任务总数(T)?
提前谢谢你。
【问题讨论】:
【参考方案1】:AnyLogic 允许通过以下方式使用 Stream API 收集此类统计信息:
seize.queue.waitingEntities.stream().mapToInt( a -> a.variable ).sum();'
通常,这种方式比 for 循环更具可读性。
【讨论】:
感谢您的建议!【参考方案2】:我是这样理解你的问题的:
-
您有许多代理在抢占队列中
所有代理都相同,这意味着它们都包含一个变量,称为“变量”,可以采用任何整数值
您想知道占用队列块中所有代理的变量总和是多少
如果我正确理解你的问题,你可以这样做:
int var=0;
for(int i=0;i<seize.size();i++)
var+=seize.get(i).variable;
“var”给你你想要计算的数字
【讨论】:
感谢您的回答。你的理解是正确的。如果您不介意,我想再问两个问题。 Q1)我是否需要创建一个新的功能组件(代理组件)才能将这段代码放入其中并返回值? Q2) var 是否总是更新? 创建一个不带参数并返回整数的函数......让我们称之为 int count() 并创建一个变量调用“totalSum”(整数)然后,您可以根据何时在任何地方使用该函数你想数数......将它添加到 onEnter 和抓住块的 onExit 是很自然的,你这样做:totalSum=count();然后你就可以使用会一直更新的totalSum以上是关于Q: [Anylogic] 如何计算在seize block队列中等待的所有agent的变量总和?的主要内容,如果未能解决你的问题,请参考以下文章