如何通过CSV输入设置NetLogo模型中不同智能体的种群规模?
解决NetLogo中通过CSV数据创建不同Breed种群的问题
问题说明
你的CSV文件第一行是智能体种群的名称表头,后续每行对应不同天数的种群规模数值。当前需要提取指定行的数据,为每个create-*命令匹配对应的创建数量。
解决方案代码
extensions [csv] globals [ data ] breed[ones one] breed[twos two] breed[threes three] breed[fours four] breed[fives five] breed[sixes six] breed[sevens seven] to setup ca ; 读取CSV文件,返回嵌套列表:第一个子列表是表头,后续子列表是每行数据 set data csv:from-file "data.csv" ; 选择要使用的目标行(示例取第一行数值数据,索引为1,列表从0开始计数) let current-population item 1 data ; 根据目标行数据创建对应数量的各breed智能体 create-ones item 0 current-population create-twos item 1 current-population create-threes item 2 current-population create-fours item 3 current-population create-fives item 4 current-population create-sixes item 5 current-population create-sevens item 6 current-population reset-ticks end
关键细节解释
csv:from-file "data.csv"会把CSV内容转换成嵌套列表结构:[["ones" "twos" ... "sevens"], [1 1 ... 1], [0 0 ... 2], ...]item 1 data用于提取CSV中第一行的数值数据(跳过表头行),如果需要使用其他天数的数据,修改索引即可(比如取第三行数据就写item 3 data)item N current-population对应取目标行中第N列的数值,作为对应breed的创建数量,顺序必须和CSV表头、你定义的breed顺序完全匹配
可选优化(批量处理)
如果想避免重复编写create-*命令,可以用循环批量处理所有breed:
to setup ca set data csv:from-file "data.csv" let current-population item 1 data ; 按CSV表头顺序定义breed列表 let breeds [ones twos threes fours fives sixes sevens] ; 循环匹配breed和对应的种群数量 foreach breeds current-population [ [breed num] -> create-breed num breed ] reset-ticks end
内容的提问来源于stack exchange,提问作者adkane
相关产品推荐
相关产品推荐

