我们如何根据特定的变量来计算代理? [英] How can we count agents according to specific variables?

查看:14
本文介绍了我们如何根据特定的变量来计算代理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试解决以下问题:

每个代理都有其特定的代码,并且在每次迭代中更新该迭代中活动的代理列表。我们想要计算每个迭代中列表中存在的每个代码的代理数量。 我们有以下步骤(代码)。OBS:我们需要使用配置文件列表,因为Turtle配置文件导出的输出

很抱歉出现下面的大代码,但我们已尽最大努力将其简化为可重现的代码

提前谢谢

globals [ ListProfiles Death ]

turtles-own [ profiles-code metabolism-code reproduction-code metabolism reproduction resource-turtle ]

patches-own [ resources ]

to setup
  ca
  prepare
  ask patches [ set resources random 100 ]
  let list1 ( list 2 4 )
  let list2 ( list 5 10 )
  (
    foreach list1
  [
    this-metabolism ->

      foreach list2
      [
        this-reproduction ->
        ask n-of 1 patches
        [
          sprout 1
          [
            set metabolism this-metabolism
            set reproduction this-reproduction
            setup-turtles
          ]
        ]
      ]
    ]
  )
  reset-ticks
end

to setup-turtles
  (
    ifelse
    metabolism = 2 [ set metabolism-code "M1" ]
    metabolism = 4 [ set metabolism-code "M2" ]
  )

  (
    ifelse
    reproduction = 5 [ set reproduction-code "R1" ]
    reproduction = 10 [ set reproduction-code "R2" ]
  )
  set profiles-code ( word metabolism-code reproduction-code )
  print ( word "profiles-code: " profiles-code )
end

to go
  ListProfilesProc
  MetaboProc
  ProbDieProc
  output

  tick
end

to ListProfilesProc
  set ListProfiles [ ]
  ask turtles [
    set ListProfiles lput profiles-code ListProfiles
  ]
  set ListProfiles remove-duplicates ListProfiles
end

to MetaboProc
  ask turtles [
    (
      ifelse
    metabolism = 2
      [
        set resource-turtle ( resources - metabolism )
        if resource-turtle <= 60 [ DieProc ]
        (
          ifelse
          reproduction = 5
          [
            if resource-turtle >= 5 [ hatch 1 ]
          ]
          reproduction = 10
          [
            if resource-turtle >= 10 [ hatch 1 ]
          ]
        )
      ]
    )
  ]
end

to DieProc
  let code profiles-code
  foreach ListProfiles [ lp ->    ;; I think, here's the problem... I can't individualize the kills by code. I've already tried several things. And therefore I can't get the output of the deaths by code. It is always repeated (general calculation)...
    
    if lp = code
    [
      set Death Death + 1
    ]
  ]
  die
end

to ProbDieProc
  ask turtles
  [
    let prob-die random-float 1.01
    if prob-die < 0.77 [ DieProc ]
  ]
end

to prepare
  carefully
    [ file-delete ( word "output.csv" ) ]
  [ ]
  file-open  ( word "output.csv" )
  file-print ( word "code_profile,death,tick" )
  file-close
end

to output
  file-open ( "output.csv" )
  foreach ListProfiles
  [
    t ->
    file-print ( word t "," Death "," ticks )
  ]
  file-close
end

推荐答案

Deaths现在它是一个global变量,这意味着任何任何海龟访问它(更新或读取)时,它们都共享&q;相同的值。相反,您需要跟踪每个配置文件类型的死亡人数。按照你的方式,profiles-code区分不同的海龟类型,你可以用几种方法来解决这个问题-例如:你可以为每个配置文件类型创建特定的Death跟踪器(例如。Death-M1R1Death-M1R2...等)并根据需要输出;或者您可以使用列表,在其中更新列表中与特定配置文件对应的项;或者您可以使用列表列表并使用position获取不同breed的Death值;或者您可以使用tables扩展,这是我将在下面展示的示例,因为我认为它是最干净和最明确的。

如果您在其他编码语言中使用过tables扩展,则tables扩展允许使用类似于字典结构的东西,其中您有一个{key:Value}对,这样,如果您输入键,就会得到值。因此,这里的一般工作流程是构建一个字典来存储每种配置文件类型的姓名和死亡人数。然后,每当海龟死亡时,它都会在词典中更新其配置文件类型的死亡计数。

为简单起见,我对上面的代码只做了很小的更改,并在我进行了(最多)更新的地方添加了注释:

extensions [ table ]

globals [ ListProfiles Death NInitial NFinal R Birth deaths-dict ]

turtles-own [ profiles-code metabolism-code reproduction-code metabolism reproduction resource-turtle ]

patches-own [ resources ]

to setup
  ca
  prepare
  ; Define deaths-list as a list
  set deaths-dict table:make
  ask patches [ set resources random 100 ]
  let list1 ( list 2 4 )
  let list2 ( list 5 10 )
  (
    foreach list1
  [
    this-metabolism ->

      foreach list2
      [
        this-reproduction ->
        ask n-of 1 patches
        [
          sprout 1
          [
            set metabolism this-metabolism
            set reproduction this-reproduction
            setup-turtles
            ; Add each metabolism / reproduction to the deaths dictionary with 0 as initial deaths value
            table:put deaths-dict ( word metabolism-code reproduction-code ) 0
          ]
        ]
      ]
    ]
  )
  print deaths-dict
  reset-ticks
end

to setup-turtles
  (
    ifelse
    metabolism = 2 [ set metabolism-code "M1" ]
    metabolism = 4 [ set metabolism-code "M2" ]
  )

  (
    ifelse
    reproduction = 5 [ set reproduction-code "R1" ]
    reproduction = 10 [ set reproduction-code "R2" ]
  )
  set profiles-code ( word metabolism-code reproduction-code )
  print ( word "profiles-code: " profiles-code )
end

to go
  ; Stop the model if no turtles exist
  if not any? turtles [ stop ]
  ListProfilesProc
  MetaboProc
  ProbDieProc
  output
  tick   
end

to ListProfilesProc
  ; Simple way to get a sorted list of profile types
  set ListProfiles sort remove-duplicates [ profiles-code ] of turtles
end

to MetaboProc
  ask turtles [
    (
      ifelse
    metabolism = 2
      [
        set resource-turtle ( resources - metabolism )
        if resource-turtle <= 60 [ DieProc ]
        (
          ifelse
          reproduction = 5
          [
            if resource-turtle >= 5 [ hatch 1 ]
          ]
          reproduction = 10
          [
            if resource-turtle >= 10 [ hatch 1 ]
          ]
        )
      ]
    )
  ]
end

to ProbDieProc
  print "Running die proc..."

  ask turtles
  [
    let prob-die random-float 1
    if prob-die < 0.4 [
      DieProc
    ]
  ]
end

to DieProc
  ; Pull current death count for this profile
  let current-profile-death-count table:get deaths-dict profiles-code
  ; Increase that death count by one
  let current-profile-new-death-count current-profile-death-count + 1
  ; Update the death count in the master dictionary
  table:put deaths-dict profiles-code current-profile-new-death-count
  die
end

to prepare
  carefully
    [ file-delete ( word "output.csv" ) ]
  [ ]
  print "opening..."
  file-open  ( word "output.csv" )
  file-print ( word "code_profile,death,tick" )
  file-close
end

to output
  file-open ( "output.csv" )
  foreach ListProfiles
  [
    t ->
    let profile-deaths table:get deaths-dict t
    file-print ( word t "," profile-deaths "," ticks )
  ]
  file-close
end

输出如下所示:

这篇关于我们如何根据特定的变量来计算代理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆