If statement Netlogo:嵌套的if/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

使用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-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的新手,对于何时使用“如果”或“如果其他”语句感到困惑。如果有人能解释并看看上面的代码,我将非常感激

谢谢,
David

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值?从上一次运行到。

如果
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
命令之前所做的最后一件事一样。