这个难倒了我...
我有一个 ABM,它通过单个补丁(喷口程序(上的随机泊松产生到达医院单位的新患者。根据区域和其他分配的变量,为每个患者分配一个要去的区域和在病房中花费的时间。当我使用嵌入在程序或报告中的分布创建它时,它每次都工作正常,但是当我将随机变量编码到设置中以便更容易操作时,它会定期生成严重异常的低/高值(以原始格式运行时看不到的范围(,有时创建新患者根本不会发生,尽管模型仍然在滴答作响......唯一更改的是变量在设置中的位置,而不是在代码正文中的位置。
我不知道为什么它会随机没有病人进入系统,这让我不信任它产生的任何其他东西。这只是Netlogo不喜欢的格式风格吗?还是我错过了什么?
感谢您在解决此问题方面的任何建议/帮助
原始代码:
if ticks = 1000 [stop]
ask arrivals
[
assess
crowding-check
relocate
]
end
to assess
sprout-patients random-poisson 1.5
[set time_arrived ticks
set condition random-float 1.0
set NEWS2 random-float 7.0
set shape "person"
]
end
to-report AEC_treatment_time ;; gamma dist
let result random-gamma 3.478 0.525
if result < 2 [ report 2 ]
if result > 20 [ report 20]
report result
end
to-report AMU_treatment_time ; gamma dist
let result random-gamma 5.7716 0.3
if result < 4 [ report 4]
if result > 48 [ report 48]
report result
end
新代码:
ca
set new-patients random-poisson 1.5
set AEC-los random-gamma 3.478 0.525
set AMU-los random-gamma 5.7716 0.3
reset-ticks
end
to go
if ticks = 1000 [stop]
ask arrivals
[
sprout-patients new-patients
assess
crowding-check
relocate
]
end
to assess
ask patients-here
[set time_arrived ticks
set condition random-float 1.0
set NEWS2 random-float 7.0
set shape "person"
]
end
...
to-report AEC_treatment_time ;; gamma dist
let los-AEC AEC-los
if los-AEC < 2 [ report 2 ]
if los-AEC > 20 [ report 20]
report los-AEC
end
to-report AMU_treatment_time ; gamma dist ;; reports treatment time for patients in AMU
let los-AMU AMU-los
if los-AMU < 4 [ report 4]
if los-AMU > 48 [ report 48]
report los-AMU
end
PS尝试多次迭代,似乎是随机泊松变化是导致问题的原因
如果没有完整的代码,很难看到,因为它看起来是过程连接方式的问题,但是您的新结构ask patients-here
(在评估过程开始时(在循环中贯穿ask arrivals
(go 过程(。到达是一种品种吗?
一般来说,嵌套ask turtles
类型的结构是一件坏事,因为每只都会询问所有满足条件的海龟,所以你可能会得到微妙的错误。无论如何,这可能会让你回到以前做的事情:
to go
if ticks = 1000 [stop]
ask arrivals
[ sprout-patients new-patients [assess]
crowding-check
relocate
]
end
to assess
set time_arrived ticks
set condition random-float 1.0
set NEWS2 random-float 7.0
set shape "person"
end
这种结构使评估过程成为从的角度(或上下文(运行的过程,并在创建时立即运行。