Как распределить атрибуты агентов случайным образом в соответствии с конкретными вероятностями в Netlogo? - PullRequest
1 голос
/ 13 марта 2019

Я относительно новичок в 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, тогда есть вероятность сообщить о нападении (prob-report, 0.5. Это выражается доверием? = True / false. В подмножестве тех, ктосообщают, что существует окончательная вероятность наличия хорошего / плохого опыта работы с полицией (вероятностная защита), здесь защита? = true / false.

Эти три атрибута должны быть случайным образом распределены в соответствии с вероятностями, иКроме того, это приводит к комбинированной вероятности доверия полиции в будущем, вероятному доверию. (вероятное доверие = вероятное нападение + вероятное сообщение + вероятная защита).

Что я сделал (без расширенияпока что это так:

      ;; 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 Ответ

3 голосов
/ 14 марта 2019

(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, а не только конкретный секс-работник, который «бросил кубик».

Вам либо нужно:

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

Используйте первый вариант, если на самом деле больше ничего не делается. Использовать второй вариант, если установить доверие? значение - это лишь одно из многих действий, которые черепаха должна предпринять, когда она сотрудничает или избегает.

...