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 将 true
和 false
(大小写无关紧要)识别为特定的真值。您不应该使用 1 和 0 作为 true 和 false 的代理。直接使用真值有几个优点。最明显的是可读性,你可以有像 set trust? true
和 if trust? = true [do something]
这样的语句。更紧凑的是,您可以简单地说 if trust? [do something]
。其他优势包括根据您的条件访问逻辑运算符,例如 not
和 and
。
关于每个具有相同行为的代理的实际问题,您嵌套了 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
如果确实没有其他任何事情要做,请使用第一个选项。如果设置信任使用第二个选项?值只是乌龟在合作或躲避时应该采取的众多行动之一。
我对 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 将 true
和 false
(大小写无关紧要)识别为特定的真值。您不应该使用 1 和 0 作为 true 和 false 的代理。直接使用真值有几个优点。最明显的是可读性,你可以有像 set trust? true
和 if trust? = true [do something]
这样的语句。更紧凑的是,您可以简单地说 if trust? [do something]
。其他优势包括根据您的条件访问逻辑运算符,例如 not
和 and
。
关于每个具有相同行为的代理的实际问题,您嵌套了 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
如果确实没有其他任何事情要做,请使用第一个选项。如果设置信任使用第二个选项?值只是乌龟在合作或躲避时应该采取的众多行动之一。