If statement Netlogo:嵌套的if/ifelse语句
使用Netlogo构建我的第一个ABM时,遇到了涉及ifelse语句以及如何使用它们的问题。我在模拟特工对洪水的反应。这些概念如下:If statement Netlogo:嵌套的if/ifelse语句,if-statement,netlogo,agent-based-modeling,If Statement,Netlogo,Agent Based Modeling,使用Netlogo构建我的第一个ABM时,遇到了涉及ifelse语句以及如何使用它们的问题。我在模拟特工对洪水的反应。这些概念如下: to process-property let $random-flood-number random-float 1 ask properties [ set flood-damage-list-consequent replace-item 1 flood-damage-list-consequent (item 1 flood-dam
to process-property
let $random-flood-number random-float 1
ask properties [
set flood-damage-list-consequent replace-item 1 flood-damage-list-consequent (item 1 flood-damage-list-initial * (1 - PLP-reduction))
set flood-damage-list-consequent replace-item 2 flood-damage-list-consequent (item 2 flood-damage-list-initial * (1 - PLP-reduction))'
ifelse $random-flood-number < probability-flooding
[
set flooded? TRUE
set number-of-times-flooded (number-of-times-flooded + 1)
if plp-adopted? != TRUE [
calculate-adoption-intention
]
]
[
set flooded? FALSE
]
]
ask properties with [plp-adopted? = TRUE] [
plp-reliability-analysis
]
end
to plp-reliability-analysis
if plp-abandoned? = TRUE [stop]
if flooded? = TRUE [
if number-of-times-flooded > 1 [
let plp-reliability-factor 0.77 ;;This variable represents the probability of success that Manual PLP will offer full reduction in damage. Taken from JBA (2012;2014).
ifelse random-float 1 < plp-reliability-factor
[
set plp-deployed-successful? TRUE
set PLP-reduction 0.25
set successful-flood-damage-reduction (sum flood-damage-list-initial * PLP-reduction)
]
[
set plp-deployed-successful? FALSE
set PLP-reduction 0.9
set unsuccessful-flood-damage-reduction (sum flood-damage-list-initial * PLP-reduction)
calculate-abandonment-intention
]
]
]
end
如果代理人被淹,他们会考虑采取保护措施(如果他们还没有)。
如果某个代理已采取保护措施,并且被淹没,则计算该措施的成功率
我的代码如下:
to process-property
let $random-flood-number random-float 1
ask properties [
set flood-damage-list-consequent replace-item 1 flood-damage-list-consequent (item 1 flood-damage-list-initial * (1 - PLP-reduction))
set flood-damage-list-consequent replace-item 2 flood-damage-list-consequent (item 2 flood-damage-list-initial * (1 - PLP-reduction))'
ifelse $random-flood-number < probability-flooding
[
set flooded? TRUE
set number-of-times-flooded (number-of-times-flooded + 1)
if plp-adopted? != TRUE [
calculate-adoption-intention
]
]
[
set flooded? FALSE
]
]
ask properties with [plp-adopted? = TRUE] [
plp-reliability-analysis
]
end
to plp-reliability-analysis
if plp-abandoned? = TRUE [stop]
if flooded? = TRUE [
if number-of-times-flooded > 1 [
let plp-reliability-factor 0.77 ;;This variable represents the probability of success that Manual PLP will offer full reduction in damage. Taken from JBA (2012;2014).
ifelse random-float 1 < plp-reliability-factor
[
set plp-deployed-successful? TRUE
set PLP-reduction 0.25
set successful-flood-damage-reduction (sum flood-damage-list-initial * PLP-reduction)
]
[
set plp-deployed-successful? FALSE
set PLP-reduction 0.9
set unsuccessful-flood-damage-reduction (sum flood-damage-list-initial * PLP-reduction)
calculate-abandonment-intention
]
]
]
end
我认为问题在于“plp可靠性分析”程序中的ifelse语句。我是Netlogo的新手,对于何时使用“如果”或“如果其他”语句感到困惑。如果有人能解释并看看上面的代码,我将非常感激
谢谢,
Davidif和ifelse之间的区别在于:
- 当您只想在特定条件下运行某段代码时,使用
用于在某些条件下运行某段代码,如果不满足该条件,则使用另一段代码ifelse
to process-property
let $random-flood-number random-float 1
ask properties
[ ifelse $random-flood-number < probability-flooding
[ set flooded? TRUE ]
[ set flooded? FALSE ]
]
ask properties with [plp-adopted? = TRUE]
[ plp-reliability-analysis
]
end
to plp-reliability-analysis
if flooded? = TRUE
[ if number-of-times-flooded > 1
[ let plp-reliability-factor 0.77
ifelse random-float 1 < plp-reliability-factor
[ set plp-deployed-successful? TRUE ]
[ set plp-deployed-successful? FALSE ]
]
]
end
但对于第二个和更高版本的代码,它将运行,77%的属性将plp记录为成功,而其他属性将设置为不成功
那么,你如何最终得到一些具有虚假洪水组合的属性呢?而真正的plp部署成功了吗
现在及时向前跳,已经发生了2次(或更多)洪水。刚刚发生洪水,那么77%的物业采用plp?真正的plp部署成功了吗?这一次,没有洪水,所有的财产都被淹了?设置为false。采用plp的?发送至plp可靠性分析程序。然而,洪水泛滥了吗?现在为false,因此代码块不会运行,并且它们保留其plp值?从上一次运行到。如果
if
和ifelse
之间的区别在于:
- 当您只想在特定条件下运行某段代码时,使用
用于在某些条件下运行某段代码,如果不满足该条件,则使用另一段代码ifelse
to process-property
let $random-flood-number random-float 1
ask properties
[ ifelse $random-flood-number < probability-flooding
[ set flooded? TRUE ]
[ set flooded? FALSE ]
]
ask properties with [plp-adopted? = TRUE]
[ plp-reliability-analysis
]
end
to plp-reliability-analysis
if flooded? = TRUE
[ if number-of-times-flooded > 1
[ let plp-reliability-factor 0.77
ifelse random-float 1 < plp-reliability-factor
[ set plp-deployed-successful? TRUE ]
[ set plp-deployed-successful? FALSE ]
]
]
end
但对于第二个和更高版本的代码,它将运行,77%的属性将plp记录为成功,而其他属性将设置为不成功
那么,你如何最终得到一些具有虚假洪水组合的属性呢?而真正的plp部署成功了吗
现在及时向前跳,已经发生了2次(或更多)洪水。刚刚发生洪水,那么77%的物业采用plp?真正的plp部署成功了吗?这一次,没有洪水,所有的财产都被淹了?设置为false。采用plp的?发送至plp可靠性分析程序。然而,洪水泛滥了吗?现在为false,因此代码块不会运行,并且它们保留其plp值?从上一次运行到。属性所在的每个修补程序都有不同的概率泛洪值,因此根据绘制的随机数,某些属性可能被泛洪,而其他属性可能不被泛洪。plp可靠性系数并不代表77%的性能,而是plp的成功率。因此,如果随机数大于0.77,则不成功。我理解你所说的保持plp的价值观是什么意思?对。如果采用了某个属性,但未被淹没,如何确保该属性不会尝试并计算plp部署是否成功?如果为真/假(1),则可以,不同的特性可能具有不同的值,但您仍然只能绘制一个随机数。如果您绘制的随机数较低,则许多属性将泛洪,如果您绘制的随机数较高,则没有任何属性将泛洪。(2) 如果一个变量只对一个勾号进行操作,那么只需将其设置为false,就像在执行
tick
命令之前所做的最后一件事一样。属性所在的每个修补程序都有不同的概率泛洪值,因此根据绘制的随机数,某些属性可能被泛洪,而其他属性可能不被泛洪。plp可靠性系数并不代表77%的性能,而是plp的成功率。因此,如果随机数大于0.77,则不成功。我理解你所说的保持plp的价值观是什么意思?对。如果采用了某个属性,但未被淹没,如何确保该属性不会尝试并计算plp部署是否成功?如果为真/假(1),则可以,不同的特性可能具有不同的值,但您仍然只能绘制一个随机数。如果您绘制的随机数较低,则许多属性将泛洪,如果您绘制的随机数较高,则没有任何属性将泛洪。(2) 如果一个变量只运行一个勾号,那么只需将其设置为false,就像在执行tick
命令之前所做的最后一件事一样。