AnyLogic运行时切换Source到达定义模式set_rate失效问题
Process Modeling Library Source组件动态切换到达模式异常解决方案
问题根因
代码失效的核心原因是API调用与当前到达模式不匹配:
set_rate()方法仅在Source处于RATE(到达率)模式时生效,作用是设置单位时间内的实体到达数量- 当Source切换到
INTERARRIVAL_TIME(到达间隔时间)模式时,组件不再读取rate参数,而是读取实体到达的间隔时间参数,此时调用set_rate()不会产生任何效果 - 原代码中还存在单位参数误用问题:
PER_MINUTE是率单位,仅能用于到达率设置,间隔时间设置需要使用MINUTE/SECOND/HOUR这类纯时间单位
两种模式的正确调用方式
- 到达率(RATE)模式:调用
source.set_rate(到达率数值, 率单位),率单位可选PER_SECOND/PER_MINUTE/PER_HOUR - 到达间隔时间(INTERARRIVAL_TIME)模式:调用
source.set_interarrivalTime(间隔时间数值, 时间单位),时间单位可选SECOND/MINUTE/HOUR
修正后代码
假设变量arrivalRate的统计单位为「个/小时」,修正后的切换逻辑如下:
if (comboArrival.getValueIndex()==0) { // 切换为到达间隔时间模式 source.set_arrivalType(SourceRate.INTERARRIVAL_TIME); // 间隔时间 = 1/到达率,按单位换算后传入:60/arrivalRate 得到的是分钟级间隔 source.set_interarrivalTime(60.0 / arrivalRate, MINUTE); } else { // 切换为到达率模式 source.set_arrivalType(SourceRate.RATE); // 直接传入小时级到达率,指定单位为PER_HOUR即可自动适配模型时间单位 source.set_rate(arrivalRate, PER_HOUR); }
补充提示:如果切换模式后第一次实体到达时间不符合预期,可在切换逻辑末尾添加
source.reset(),清空上一个模式残留的调度计划,确保新的到达规则立即生效。另外注意枚举类SourceRate首字母为大写,原代码中小写开头的sourceRate会触发编译错误。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

