R语言simmer包rollback函数设置amount=3未按预期回退问题咨询
问题原因
rollback()的amount参数默认仅统计当前所在子轨迹内部的活动数量,不会跨层级统计父轨迹的活动。你写的rollback(amount=3)处于最内层的重启子轨迹中,该子轨迹一共只有3个活动:timeout(2)、log_("Restart")、rollback(3),回退3个活动会直接回到该子轨迹的起始位置,所以会反复执行重启逻辑。- 你设置了内层
branch的continue=TRUE,且分支选择逻辑是50%概率走重启分支、50%概率跳过,所以你看到的重复打印Restart不是无限循环,是每次回退后重新触发分支选择,直到随机抽到跳过分支的概率才会继续往下走,这和你预期的回退到修复步骤的逻辑完全不符。 - 你对回退计数的范围理解有误,
branch本身会作为1个独立活动计入父轨迹的活动序列,你如果要从内层子轨迹回退到外层的修复步骤,需要把内层子轨迹的总长度、内层branch活动本身都计入回退数量,仅数外层的3个活动是不够的。
解决方法
两种方案二选一即可:
- 调整
amount数值:以简单修复分支为例,要回退到Repair Simple步骤,需要把内层子轨迹的3个活动、内层branch本身、再加外层往前的3个活动都算进去,设置amount=7即可(复杂修复分支同理调整)。 - 更精准的方案是使用
target参数指定回退目标:给你要回退到的活动设置唯一名称,直接指定回退到该活动,不需要手动计数,不容易出错,示例如下:
# 给Repair Simple对应的timeout设置名称 trajectory() %>% timeout(1, "simple_repair_start") %>% log_("Repair Simple") %>% # 中间逻辑省略 # rollback直接指定target rollback(target = "simple_repair_start")
内容的提问来源于stack exchange,提问作者ncnc_2020
相关产品推荐
相关产品推荐

