NetLogo问题:将海龟数组数据存入全局matrix变量时程序异常
问题:NetLogo中无法将海龟数组存入全局矩阵变量
我给每只猫海龟配置了数组,尝试把数组数据存入全局矩阵变量时程序无法正常运行,目标是实现每只海龟的数组数据存入全局matrix变量,问题出在以下代码段:
let n 0 while [n < 40][ let tmp_num1 (array:item get_k n) matrix:set col_k CatNum n tmp_num
完整代码
extensions [ array matrix] globals[ i v col_k ] breed[cats cat] breed[rats rat] cats-own [ CatNum data_from_rat a_array GetRatNum get_k k ] rats-own[ kg num ] to setup clear-all reset-ticks set i 0 set v 0 creat-animals creat-world set col_k matrix:make-constant 40 40 0 ask cats[ set k 0 set a_array array:from-list n-values 20 [0] set get_k array:from-list n-values 20 [0] ] end to go ask n-of 20 rats[ if i < 20 [ set num i set i i + 1 ] ] ask rats[ update creat-ratnum fd 3 rt random 90 ] ask n-of 40 cats[ if v < 40 [ set CatNum v set v v + 1 ] ] ask cats[ let agsets other turtles-here with [breed = rats] if count agsets >= 1 [ interaction(one-of agsets) ] fd 3 lt random 90 ] tick end to creat-animals create-cats 40[ set shape "cat" set size 2 set color orange setxy random-xcor random-ycor ] create-rats 20[ set shape "mouse side" set size 2 set color pink setxy random-xcor random-ycor ] end to creat-world ask patches[ set pcolor white ] end to creat-ratnum loop[ if i >= 20 [stop] set num i set i i + 1 ] end to update set kg random-float 1 end to interaction[provider] set data_from_rat([kg] of provider) set GetRatNum ([num] of provider) let tmp_num (array:item get_k GetRatNum) ifelse tmp_num >= 1 [ set tmp_num tmp_num + 1 array:set get_k GetRatNum tmp_num ][ set tmp_num tmp_num + 1 array:set get_k GetRatNum tmp_num ] array:set a_array GetRatNum data_from_rat let n 0 while [n < 40][ let tmp_num1 (array:item get_k n) matrix:set col_k CatNum n tmp_num ] end
问题分析与修复方案
核心问题点
- 无限循环:while循环中未对变量
n执行自增操作(set n n + 1),程序会一直卡在循环内无法推进 - 变量名错误:定义了
tmp_num1但调用matrix:set时误用了tmp_num,导致变量未定义或取值错误 - 数组越界:猫的
get_k数组长度为20(array:from-list n-values 20 [0]),但循环遍历到39(n < 40),访问数组不存在的索引会触发报错 - 冗余语法错误:原代码中存在多余的
;;]注释符号,导致语法解析异常
修复后的interaction过程代码
to interaction[provider] set data_from_rat([kg] of provider) set GetRatNum ([num] of provider) let tmp_num (array:item get_k GetRatNum) ; 简化重复的计数逻辑 set tmp_num tmp_num + 1 array:set get_k GetRatNum tmp_num array:set a_array GetRatNum data_from_rat let n 0 ; 遍历get_k数组的实际长度20,避免越界 while [n < 20][ let tmp_num1 (array:item get_k n) matrix:set col_k CatNum n tmp_num1 set n n + 1 ] ; 若需填充矩阵剩余20列(索引20-39)为0,可补充以下代码 while [n < 40][ matrix:set col_k CatNum n 0 set n n + 1 ] end
额外优化点
- 原代码中
ifelse tmp_num >= 1的两个分支逻辑完全重复,可简化为直接自增计数 creat-ratnum过程的loop可替换为更简洁的逻辑,避免不必要的循环go过程中ask n-of 20 rats的逻辑可能重复设置rat的num,建议调整为仅给未分配编号的rat赋值
内容的提问来源于stack exchange,提问作者Notyet1998
相关产品推荐
相关产品推荐

