【问题标题】:Releasing two turtles per tick netlogo每滴答声释放两只海龟 netlogo
【发布时间】:2020-07-02 22:23:54
【问题描述】:

我目前正在研究一个模型,我可以在其中模拟购物时的行人运动。所以,我已经想出了一些我需要的东西,但我一直在试图弄清楚如何在某个补丁中每次释放 2 只海龟(就像一对)。两只海龟同时释放。我的代码基于蚂蚁线,但它只是一次性释放所有行人,然后海龟开始行走。所有海龟都被释放后,蜱虫也会开始。我希望海龟在进入时开始“行走”。 这是我的代码:

breed [ leadvisitors leadvisitor ]
breed [ visitors visitor ]

to setup
  clear-all
   setup-visitors
reset-ticks
end

to setup-visitors 
  create-leadvisitors num-of-pedestrians * 0.1    ;;create 10% of the total number of pedestrians
  [ 
    set demand-type "none"
    set color black
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 0    
  ]
  create-visitors (num-of-pedestrians - (num-of-pedestrians * 0.1)) 
  [ set demand-type 0
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 1
    set attracted? false
  ]  ]
end

to go
  if turtles = 0  [ stop ]

  ask turtles 
  [ 
    set-demand-type  
    have-demand
  ]  


  if ticks > 100 [ stop ]
  tick
  display-labels
end

;;;;; visitor's internal state of demand ;;;;;

to set-demand-type
  if demand-type = 0
  [ set demand-type "food"
    set color red
    let target (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = red] 
  ]
end 

to have-demand  
  if demand-lvl = 0 
  [
    ifelse wait-time = -1 
    [ stroll ]

    [ set wait-time wait-time - 1
      if wait-time = 0
      [ stroll ]]
    ]

  if demand-lvl = 1
    [ ifelse wait-time = -1 
      [ stroll
        evaluate ]

      [ set wait-time wait-time - 1
        if wait-time = 0
        [ stroll 
          evaluate ]] 
    ] 
end 

to stroll 
if any? neighbors with [ pcolor = gray - 3 ]
  [ die ]

  ifelse any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = red]
  [ facexy exitpt-x exitpt-y ]
  [ rt random-float visitor-view-angle lt random-float visitor-view-angle ]
  fd walking-speed  
end

to evaluate 
  if any? neighbors with [ pcolor = gray or pcolor = orange or pcolor = blue or pcolor = gray - 4 or pcolor = gray - 3 or pcolor = red + 2]
  [ facexy exitpt-x exitpt-y 
    rt random-float visitor-view-angle lt random-float visitor-view-angle 
    fd walking-speed ]

  let _mycolor color
  if any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
  [ let new-target max-one-of ( patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [patch-influence]
    let dist-to-new-target min-one-of (patches with [pcolor = _mycolor] in-cone visitor-vision-depth visitor-view-angle) [distance myself]
    face new-target
    set heading towards new-target
    fd walking-speed   
    set attracted? true       

    attracted-and-visiting
    re-evaluate 
   ]


end 

to attracted-and-visiting        
   if pcolor = red + 2
   [ set heading towards one-of patches with [pcolor = red + 2]
     fd 0
     set patch-popularity patch-popularity + 1
     set wait-time avg-waiting-time 

    if count turtles-here > 0
        [ set num-of-visitors num-of-visitors + 1 ]
          set plabel num-of-visitors 
   ]      
end


to re-evaluate
  let _mycolor color
  if not any? (patches in-cone visitor-vision-depth visitor-view-angle) with [pcolor = _mycolor]
  [ set attracted? false ]

  ifelse choose? [set heading towards one-of patches with [pcolor = _mycolor]] [facexy exitpt-x exitpt-y]    
end


to-report choose?
  report random 2 = 0
end

【问题讨论】:

  • 我们需要查看您的go 程序才能更具体,但基本上在该程序中,您将获得所需的补丁sprout 2 visitors [],您将在括号中放入大小、颜色、标题、等等,一旦它们被创建,它们将在行走方面遵守与任何其他访问者相同的所有规则。他们将简单地加入 visitors 的代理集。
  • 嗨@Charles,我试过sprout 2 visitor []。访问者被突出显示,顶部的“预期命令”提示符。
  • 我的代码实际上很长。我在上面添加了完整的代码。希望对您有所帮助。
  • 非常抱歉 - 我的语法错误。应该是sprout-visitors 2 []。 (如果括号内没有任何内容,则不需要括号。)我将检查您的其余代码,但不正确的语法可能是问题所在。唉,我们都会犯错!

标签: time netlogo release agent


【解决方案1】:

由于我们来回的 cmets,让我来看看你在寻找什么。我假设您想在运行开始时创建leadvisitors,然后随着运行的进行在每个滴答声中添加两个visitors。如果是这样,那么您的 setup 过程将类似于

globals [num-visitors-created]

to setup
  clear-all
  set num-visitors-created 0
  create-leadvisitors num-of-pedestrians * 0.1  [
    set demand-type "none"
    set color black
    set size 1
    setxy 0 16
    set heading 180
    set pen-size 1
    set destination one-of patches
    set wait-time -1
    set demand-lvl 0
    set num-visitors-created num-visitors-created + 1
  ]
  reset-ticks
end

创建您的leadvisitors,但没有创建visitors。请注意,全局变量 num-visitors-created 会跟踪创建的 leadvisitors 和 visitors 的数量,每次创建 leadvisitor 或 visitor 时递增一。

在您的go 过程中,您将在每个刻度上创建两个访问者,直到创建的visitors 和leadvisitors 的总数达到num-of-pedestrians。 (如果只有一个新访客的空间,您希望只创建一个,还是需要成对创建?我假设是后者。)因为您不希望访客死亡为新的打开空间,我们测试创建的数字,而不是仍然存在的数字。

to go
  if turtles = 0  [ stop ]

  ; create a new pair of visitors if there is room.
  if num-visitors-created <= (num-of-pedestrians - 2)
    create-visitors 2 [ 
      set demand-type 0
      set size 1
      set heading 180
      set pen-size 1
      setxy 0 16
      set destination one-of patches
      set wait-time -1
      set demand-lvl 1
      set attracted? false
      set num-visitors-created num-visitors-created + 1
    ]

  ask turtles 
  [ 
    set-demand-type  
    have-demand
  ]

  if ticks > 100 [ stop ]
  tick
  display-labels
end

(既然leadvisitors似乎也可能死掉,你想保持leadvisitors的某个最小数量或比例吗?如果是,你应该开一个新问题。)

上面的代码将在每次报价时在patch 0 16 上创建一对新的visitors。但是,如果您想在不同的补丁上创建新的visitors,比如红色补丁之一,您可以在您的go 程序中将该补丁sprout 设置为新访问者。

  ask one-of patches with [pcolor = red] [
    sprout-visitors 2 [ 
      set demand-type 0
      set size 1
      set heading 180
      set pen-size 1
      set destination one-of patches
      set wait-time -1
      set demand-lvl 1
      set attracted? false
      set num-visitors-created num-visitors-created + 1
    ]
  ]

注意这里没有设置新访客的 xy 坐标,所以他们从萌芽他们的补丁开始。

【讨论】:

  • 你好查尔斯,第一个适合我。但确实添加了'create-visitors 2 / num-of-pedestrians。这样访客人数就不会超过由滑块控制的行人总数。正如我的问题所述,还有一件事。我希望两名访客一被释放就可以走路。但是有了这个,滴答计数只有在所有访问者都被释放后才开始。有没有办法让访客开始“行走”,并且在前两个访客被释放时开始计时?
  • Lyne,我不确定create-visitors 2 / num-of-pedestrians 是否符合您的要求。我假设num-of-pedestrians 很大,因此您的除法将产生一小部分,NetLogo 将四舍五入为零。不会创建访问者。我已经编辑了我的答案以包含该约束。新行查找两个数字中较小的一个,2 和滑块的值减去当前访问者数量。 (我假设 num-of-pedestrians 是那个滑块值。)
  • 我还假设行人只包括visitors,而不包括leadvisitors。如果两者都包括在内,您希望 count turtles 和 leadvisitors 都是海龟。
  • 那么我有点不确定你的设置。您的setup 在第一个滴答声之前立即创建num-of-pedestrians(leadvisitors 和visitors),直到go 程序开始,它们才会开始移动,此时所有的都会移动。您是否想从较少的行人开始,然后随着“时间”逐渐增加,直到达到最大数量?
  • 嗨,Charles,新代码对我来说不太适用,因为现在行人总数释放后,例如。 10号,另外一批10位游客也出来了,以此类推。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多