我记下了这些行,以便为每个补丁计算一个change-LU-list
,该用于从相关权重中随机选择LU(更改LU列表的第0项i项)之一(使用最终函数rnd:weighted-one-of-list
。
如您所见,我正在使用列表列表的数据来构建change-LU-list
,然后我从更新的项目中进行一些计算,删除不需要的项目,所以我最终只拥有其权重LU
。
这是在网络徽标中做到这一点的最佳方式吗?还是我应该使用array
扩展?
由于每个补丁的change-LU-list
都不同,因此我将其设置回ask patches
块内的 nul 值。还是我应该使用局部变量进行change-LU-list
?
我还有一个"删除项目"命令的问题,该命令无法按预期工作,错误请求"命令"。
我仍在学习过程中,并正在寻找任何建议,以网络徽标风格构建我的模型。
感谢您抽出宝贵时间!(抱歉,如果太难阅读,如有必要,我可以对其进行编辑以使其看起来更简单)
to change-LU
ask patches with [eligible = true] [
;; creation of a list of possible LU (from historic data item 1) and adding a second item for the weight, it should be updated for every patch !
set change-LU-list map [inner-list -> (list item 1 inner-list 0 0 0 ) ] historic-data
;; let's replace item 1 by the area, item 2 by the yield, item 3 by the price, item 4 by the cost, item 5 by the historic, item 6 by the final weight
let i 0
while [i < length historic-data] [
let x item 0 item i historic-data
set change-LU-list replace-item i change-LU-list (replace-item 1 item i change-LU-list (area)) ;; area is a patch variable
set change-LU-list replace-item i change-LU-list (replace-item 2 item i change-LU-list (last (first (filter [yield-inner-list -> (item 0 yield-inner-list = year) ;; year is a global variable
AND (abs (real-x - item 1 yield-inner-list) <= 0.01375)
AND (abs (real-y - item 2 yield-inner-list) <= 0.01375)
AND (item 3 yield-inner-list = x ) ] yield-data))))
set change-LU-list replace-item i change-LU-list (replace-item 3 item i change-LU-list ( item 2 (first (filter [sgm-inner-list -> (item 0 sgm-inner-list = year) AND (item 1 sgm-inner-list = x )] sgm-data))))
set change-LU-list replace-item i change-LU-list (replace-item 4 item i change-LU-list ( item 3 (first (filter [sgm-inner-list -> (item 0 sgm-inner-list = year) AND (item 1 sgm-inner-list = x )] sgm-data))))
set change-LU-list replace-item i change-LU-list (replace-item 5 item i change-LU-list ( item 3 (first(filter [historic-inner-list -> (item 0 historic-inner-list = LU) AND (item 1 historic-inner-list = x) ] historic-data))))
set change-LU-list replace-item i change-LU-list (replace-item 6 item i change-LU-list ( (( (item 2 item i change-LU-list) * (item 3 item i change-LU-list)) / (item 4 item i change-LU-list)) * (item 5 item i change-LU-list)))
set change-LU-list remove-item i change-LU-list (remove-item 2 item 0 change-LU-list)
set change-LU-list remove-item i change-LU-list (remove-item 3 item 0 change-LU-list)
set change-LU-list remove-item i change-LU-list (remove-item 4 item 0 change-LU-list)
set change-LU-list remove-item i change-LU-list (remove-item 5 item 0 change-LU-list)
]
let LU-result first rnd:weighted-one-of-list change-LU-list last
set LU LU-result ;; updating the patch properties "LU"
]
end
这是在网络徽标中执行此操作的最佳方法吗?还是我应该使用数组 外延?
当然,您不想多次更改大型列表。 但是,建立一个庞大的列表然后减少它是非常低效的。 如果我理解这个问题,每一行(i)都独立于另一行,所以我建议为每个"i"计算你需要的两个值(一个数字和一个权重),并将结果存储在一个数组中,因为你知道数组会有多大。 跳过制作任何庞大的清单。但是在每个"i"中,列表可能和数组一样容易使用。
由于每个补丁的更改 LU 列表都不同,因此我将其设置回 Ask 补丁块内的 NUL 值。或者我应该使用本地 变量用于更改 LU 列表 ?
您绝对不希望大量列表的内存要求乘以补丁数量。不要使用局部变量。
我还有一个"删除项目"命令的问题,该命令不起作用 正如预期的那样,错误请求"命令"。
你有一个对我来说没有意义的命令。检查 语法字典。
删除项目只有两个参数,一个项目编号和一个列表。 我不知道你在括号里的第三项在做什么。
涉水 ( "可供租用,请参阅个人资料" )