【问题标题】:How to distribute agents' attributes randomly according to specific probabilities in Netlogo?Netlogo中如何根据特定概率随机分配agent的属性?
【发布时间】:2019-03-13 15:00:55
【问题描述】:

我对 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(概率攻击;攻击?=真)。之后,每滴答一次,性工作者被殴打的几率又是 0.01。

之后,在攻击?=true 的子集中,有报告攻击的概率(概率报告,0.5。这由 trust?=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

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

【问题讨论】:

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


    【解决方案1】:

    (1) 您不需要rnd 扩展名来执行您在此处尝试执行的任何操作。如果您只是想以某种概率采取一些行动,那么您的if random-float 1 &lt; &lt;probablility value&gt; 方法是正确的方法。 rnd 扩展是当您想要进入加权概率时,例如根据他们的收入选择代理。

    (2) NetLogo 将truefalse(大写无关紧要)识别为特定的真值。您不应该使用 1 和 0 作为真假的代理。直接使用真值有几个优点。最明显的是可读性,您可以使用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
    

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

    【讨论】:

    • 非常感谢,这非常有帮助,也让我感到欣慰的是,我离得不远了。稍后我可能会包括一个新问题,关于如何将每只海龟的这些概率相加,以获得基于这些方面的总体信任概率,并以此为基础挑选海龟。如果我没记错的话,这将被加权?抱歉,我来自定性背景,这是基于长期的实地调查,有时我对术语感到非常迷茫。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2017-06-13
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多