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

How to distribute agents' attributes randomly according to specific probabilities in Netlogo?

我对 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(prob-assault; assault?=true)。之后,每跳一次,性工作者再次受到攻击的几率为 0.01。

之后,在assault?=true的子集中,则有概率报告攻击(prob-report,0.5。这用trust?=true/false表示。在那些子集中谁报告,那么最终有一个 good/bad 经历过警察(prob-protection)的概率,这里是保护?=true/false。

这三个属性应该按照概率随机分布,然后得到一个组合的概率,将来信任警察,prob-trust。 (概率信任 = 概率攻击 + 概率报告 + 概率保护)。

我所做的(到目前为止没有 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

虽然目前发生的情况是属性没有变化,所有性工作者似乎都没有受到攻击并且 trust/not 信任同时发生变化。我不确定发生了什么。

(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,而不仅仅是 'rolled the die'.

的特定性工作者

您需要:

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

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