如何根据Netlogo中的特定概率随机分配代理属性?

时间:2019-03-13 15:00:55

标签: random attributes netlogo probability agent-based-modeling

我对Netlogo还是比较陌生,只完成了一些模型。目前正在为我的论文工作,其中我需要根据特定的概率随机分配代理的属性,其中一些是在模拟开始时分配的,其他属性则要在整个过程中分配。对于那些熟悉它的人来说,它与信任游戏的扩展有关。我与一个不使用Netlogo的同事一起完成了概念模型,所以我现在有些困惑。

我认为rnd扩展名可能有用,但是我不太清楚如何使用它。我很抱歉,如果这对您中的每个人似乎都是多余的,但我真的希望在这里得到一些帮助。

extensions [ rnd]

;; divides agents into two types
breed [ sexworkers sexworker ]
breed [ officers officer ]

;; determines attributes of agents
sexworkers-own
[ assault?       ;; is assaulted
  trust?         ;; probability to trust police to report assault
  protection?    ;; probability of good experience with police during report
  prob-trust ]   ;; probability to trust overall

officers-own
[ behavior   ] ;; probability of treating sex workers well/badly during report

这是模型的开始,然后我要根据特定的概率分配属性。老实说,我还没有找到一种可以按我预期的方式工作的方法。 我想要的是开始,对于每个性工作者一样,被攻击的概率为0.01(概率攻击;攻击?= true)。此后,每次打勾时,性工作者再次受到攻击的可能性为0.01。

然后,在攻击的子集中?= true,则有可能报告攻击(概率报告,0.5。这由信任表示?= true / false。在报告者的子集中,存在那么最终有可能在警察身上有好/坏经历(概率保护),这里就是保护?= true / false。

这三个属性应根据概率随机分布,并且还需要组合概率来将来信任警察,即概率信任。 (概率信任=概率攻击+概率报告+概率保护)。

我做了什么(到目前为止,没有rnd扩展名是

      ;; determines sex workers' behavior
      ask sexworkers [ move ]
      ask sexworkers [ victimize ]
      ask sexworkers [ file ]

    to victimize
 ask sexworkers [
    ifelse random-float 1 <= 0.0001 
    [ set assault? 1 ]
    [ set assault? 0 ]
  ]
end

to file 
  ask sexworkers with [ assault? = 1 ] [
   ifelse random-float 1 <= 0.5 
    [ cooperate ]
    [ avoid ] 
  ]
end

to cooperate
  ask sexworkers [ set trust? 1  ]
end

to avoid
  ask sexworkers [ set trust? 0 ]
end

目前发生的事情是属性没有变化,所有性工作者似乎都没有攻击和信任/不信任同时变化。我不确定发生了什么。

1 个答案:

答案 0 :(得分:3)

(1)您不需要rnd扩展名即可在此处尝试执行任何操作。如果您只是想以某种可能性采取某种行动,那么您的if random-float 1 < <probablility value>方法就是正确的方法。 rnd扩展名是您要加权的概率,例如,根据其收入选择代理商。

(2)NetLogo将truefalse(大小写无关紧要)识别为特定的真值。您不应将1和0用作true和false的代理。直接使用真值有几个优点。最明显的是可读性,您可以使用set trust? trueif trust? = true [do something]之类的语句。更紧凑的说,您只需说if trust? [do something]即可。其他优点包括根据您的条件访问notand之类的逻辑运算符。

关于每个代理具有相同行为的实际问题,您已经嵌套了ask turtles类型的语句。例如,您有:

to file 
  ask sexworkers with [ assault? = 1 ] [
   ifelse random-float 1 <= 0.5 
    [ cooperate ]
    [ avoid ] 
  ]
end

如果将合作和避免过程替换为该代码,则会得到:

to file 
  ask sexworkers with [ assault? = 1 ] [
   ifelse random-float 1 <= 0.5 
    [ ask sexworkers [ set trust? 1  ] ]
    [ ask sexworkers [ set trust? 0 ] ] 
  ]
end

因此,如果您的随机数是0.4,那么您所有的性工作者的信任度都将设置为1,而不仅仅是“掷骰子”的特定性工作者。

您要么需要:

to file 
  ask sexworkers with [ assault? = 1 ] [
   ifelse random-float 1 <= 0.5 
    [ set trust? true ]
    [ set trust? false ] 
  ]
end

或者您需要:

to cooperate
  set trust? true
end

to avoid
  set trust? false
end

如果没有其他事情要做,请使用第一个选项。如果设置信任,请使用第二个选项?价值只是乌龟在合作或避免时应采取的许多行动之一。