【问题标题】:I need to count each visit made by a household to a shop我需要计算一个家庭对商店的每次访问
【发布时间】:2021-12-22 15:36:31
【问题描述】:

我的模型中有两个不同的品种,家庭和商店。 我希望商店计算来自家庭的每次访问。每一刻,家庭都会搬到商店所在地。

到目前为止我有:

    to count-v 
    ask unhealthy-shops [set count-visit-nh count-visit-nh + count households-on self]   
    ask healthy-shops [set count-visit-h count-visit-h + count households-on self]
    end

但是,这会计算同一块上的家庭,给我一个比实际家庭更大的数字。我只想统计和店铺在同一位置的住户。

请帮忙!

提前致谢。

【问题讨论】:

  • 你说:不过,这算同一个地块上的户数,而且我只想算和店铺在同一个位置的户数。根据我们所知道的,我不明白这两件事之间的区别。您的意思是要添加现在访问过的家庭数量,而不是包括以前访问过的可能在该补丁上的家庭数?请注意,为了让这些事情变得清晰,重要的是你提供一个minimal reproducible example你的问题(同样建议here
  • 嗨,Matteo,抱歉,我还没有学会提供可重现的示例。我有家庭和商店作为乌龟。我家一共有100户。每个家庭都会去一家商店。当我使用上面提供的代码计算家庭访问次数时,结果超过 100,因为每个商店都计算了该补丁上可能有 2 个不同商店的所有家庭。我只想计算与商店位于同一位置的家庭。希望这能澄清一点。
  • 无需抱歉,只需提供一段代码(尽可能短),任何人都可以简单地复制并粘贴到他们身边,以准确重现您遇到的问题类型(无需添加任何内容或进行任何更改)。在这种情况下,无论如何,我认为最好看到由家庭运行并让他们访问商店的代码 - 因为我认为我会在那里解决问题。但是让我明白,你的意思是在同一个补丁上有/可以有多个商店?我发布了一个答案,以防我们把讨论带到那里
  • 是否可以简单地确保 2 家商店永远不会在同一个补丁上?似乎您为看似不必存在的问题增加了很多开销。

标签: netlogo


【解决方案1】:

按照 cmets 中的交换:这里有一个普遍的想法,如果它适合您的代码,您将需要适应除 count-v 之外的任何过程和变量。

唯一的关键点是确保计数行为不会基于补丁发生,而是由家庭在访问商店时执行

例如,请参阅下面的可重现示例:

breed [shops shop]
breed [households household]

shops-own [
  healthy?
  visits-count
]

to setup
  clear-all

  ; Here we make sure that both shops are on the same patch,
  ; and that one is healthy while the other is unhealthy.
  ask patch 0 0 [
    sprout-shops 2 [
      ifelse (any? shops with [healthy? = TRUE])
        [set healthy? FALSE]
        [set healthy? TRUE]

      set shape "house"
      set size 2
      set color blue
    ]
  ]
  
  create-households 20 [
    setxy random-xcor random-ycor
    set color gray
    set shape "person"
  ]
end


to go
  ask households [
    ifelse (random 2 < 1)
      [visit-a-shop]
      [move-to one-of patches with [not any? shops-here]]
  ]
end


to visit-a-shop
  let target one-of shops
  move-to target
  ask target [
    set visits-count (visits-count + 1)
  ]
end

当然这里的关键部分在visit-a-shop。这样,只有访问商店的家庭,并且只有在访问时,才会更新其计数器。


我从您的代码中看到,对于两种不同类型的商店(即count-visit-hcount-visit-nh),您有两个不同的计数器变量。让我问:真的需要吗?因为如果商店对健康和不健康商店的计数器变量命名相同,那么就像我在示例中所做的那样,只需执行 set visits-count (visits-count + 1) 就很容易。否则,如果有两个变量名称不同,您将不得不引入一个条件来检查家庭正在访问的商店类型,并据此使用正确的变量。

【讨论】:

    【解决方案2】:

    啊,所以您将家庭搬到了与商店完全相同的位置,以子补丁准确度来衡量。所以商店可能在补丁 3 4 但 xcor = 3.1 和 ycor = 4.2?

    然后你需要比较x和y坐标,并用“我自己”而不是“自我”比较,

    如:

    ask turtle 0 [ print count turtles with [ xcor = [xcor] of myself and ycor = [ycor] of myself ]]
    

    韦德

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 2021-12-10
      • 1970-01-01
      • 2016-12-16
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多