在 Netlogo 中依次从 CSV 文件中获取固定值

Taking fixed values from CSV file turn by turn in Netlogo

我正在努力写一个灌溉模型。我想让海龟从带有刻度的 CSV 文件中获取值。列表中有 100 个值。我希望 10 只海龟依次选择第一个(让我们说 20 个)值,即 turtle 0, 1,2 3 .. 将依次(每次滴答)在列表中取第一个值,并在第 10 个滴答之后海龟将取第二个值(如 22),依此类推。概念与水的需求有关,水的需求是固定的,每只龟在 10 天后会发生变化。 1000 个刻度将消耗 100 个值 在这方面的任何帮助将不胜感激。

谢谢

下面是一些可以帮助您入门的代码。我通过简单地创建随机需求数字的列表 demand-list 从 CSV 文件中提取 - 您可以在模拟开始时从 CSV 文件中读取它们。从那时起,使用 turtles-own 变量 demand 创建了十只海龟,并放入按 who 编号排序的列表中。

go 程序使用当前报价和 floor 运算符来查找需求列表中的哪个元素适合这组十个报价,mod 运算符确定消费者列表中的哪个海龟(消费者)应该在这个刻度处为其 demand 取该值。 show 简单地显示了每个滴答结束时每只海龟的需求。

globals [demand-list consumer-list]
turtles-own [demand]

to setup
  clear-all
  set demand-list n-values 100 [random 50]
  create-turtles 10 [set demand 0]
  set consumer-list sort turtles
  reset-ticks
end

to go
  let list-element floor ticks / 10
  let chosen-consumer ticks mod 10
  ask item chosen-consumer consumer-list [set demand item list-element demand-list]
  show map [c -> [demand] of c] consumer-list
  tick
end

IWR-perday 是 CSV 文件。我要问我不排序不写农民名单!这将如何在显示地图中显示以查看代码是否正常工作。

Breed [farmers farmer]
globals [demand-list  IWR-perday farmers-list]
farmers-own [current-demand irrigation-turn ]

to setup
  clear-all
       create-farmers 10 [ set irrigation-turn [0]
                      ask farmer 0 [ setxy min-pxcor + 1 0]
                      ask farmer 1 [ setxy min-pxcor + 3 0]
                      ask farmer 2 [ setxy min-pxcor + 5 0]
                      ask farmer 3 [ setxy min-pxcor + 7 0]
                      ask farmer 4 [ setxy min-pxcor + 9 0]
                      ask farmer 5 [ setxy min-pxcor + 11 0]
                      ask farmer 6 [ setxy min-pxcor + 13 0]
                      ask farmer 7 [ setxy min-pxcor + 15 0]
                      ask farmer 8 [ setxy min-pxcor + 17 0]
                      ask farmer 9 [ setxy min-pxcor + 19 0]]
                       set farmers-list sort turtles
  import-data 
    reset-ticks

end

to go
  
foreach [0 1 2 3 4 5 6 7 8 9 ] [ ?1 ->
  ask farmers with [who = ?1] [let list-element floor ticks / 10 
      set current-demand item list-element IWR-perday]]
      show map [c -> [current-demand] of c] farmers-list
  tick
    tick
end
to import-data
    
    ;; Import water demand
  ifelse ( file-exists? "IWR-perday.txt" )
  [
    set IWR-perday []
    file-open "IWR-perday.txt"
    while [ not file-at-end? ]
    [
      *set IWR-perday sentence IWR-perday (list file-read)
    ]
    file-close
  ]
  [ user-message "There is no IWR-perday.txt file in current directory!" ]
end*

如果您要问一个新问题,它真的应该作为一个新问题来提出,而不是作为旧问题的附加问题。但让我在这里回答。我已经将您的代码放在上面并进行了一些更改。首先,我将 setxy 请求从 create-farmers 块中取出。该块中的任何内容都由每个创建的农民执行,因此在本例中,它被执行了 10 次。接下来,尽量避免使用 who 个数字。你几乎永远不需要它们。特别是,farmers-list 包含农民的排序列表,您可以简单地使用它来直接询问合适的农民来设置其需求。此外,您不需要每个农民都设置 list-element,因为在任何给定刻度中它对所有农民都是相同的。您有两个 tick 命令 - 您只需要一个。最后,您会看到我简化了您的 file-read 命令。在您的情况下,file-read returns 一个值,您可以将其添加到列表中。

Breed [farmers farmer]
globals [demand-list  IWR-perday farmers-list]
farmers-own [current-demand irrigation-turn ]

    to setup
      clear-all
      create-farmers 10 [ set irrigation-turn [0] ]
      ask farmer 0 [ setxy min-pxcor + 1 0]
      ask farmer 1 [ setxy min-pxcor + 3 0]
      ask farmer 2 [ setxy min-pxcor + 5 0]
      ask farmer 3 [ setxy min-pxcor + 7 0]
      ask farmer 4 [ setxy min-pxcor + 9 0]
      ask farmer 5 [ setxy min-pxcor + 11 0]
      ask farmer 6 [ setxy min-pxcor + 13 0]
      ask farmer 7 [ setxy min-pxcor + 15 0]
      ask farmer 8 [ setxy min-pxcor + 17 0]
      ask farmer 9 [ setxy min-pxcor + 19 0]
      set farmers-list sort turtles
      import-data 
      reset-ticks
      
    end

to go
  let list-element floor ticks / 10 
  ask item (ticks mod 10) farmers-list [
    set current-demand item list-element IWR-perday
  ]
  show map [c -> [current-demand] of c] farmers-list
  tick
end

to import-data  
  ;; Import water demand
  ifelse ( file-exists? "IWR-perday.txt" )
  [
    set IWR-perday []
    file-open "IWR-perday.txt"
    while [ not file-at-end? ]
    [
      set IWR-perday lput file-read IWR-perday
    ]
    file-close
    show IWR-perday
  ]
  [ user-message "There is no IWR-perday.txt file in current directory!" ]
end

我想如果你 运行 把这个和你的数据文件放在一起,我检查了一下,你会看到在每组十个刻度内,十只乌龟的需求是一个接一个地设置的. IWR-perday 中有超过 1000 个值,这将持续超过 10,000 个滴答!