NetLogo中shapefile邻接多边形海龟行为控制实现问题
NetLogo县域邻域农户集合构建逻辑修复方案
核心问题修正点
- 原邻域斑块集合未包含农户所属县域自身斑块,统计范围缺失本县农户
- 原
tneighbors存储的是patch集合,未转换为对应范围内的农户turtle agentset - 原采纳率计算、采纳状态判断逻辑存在语法和逻辑错误,无法正确运行
- 随机生成的采纳阈值AT未做区间截断,可能出现超出[0,1]有效范围的无效值
- 缺少初始采纳农户设置,模型初始状态下采纳率为0无法触发扩散过程
修改后完整代码
extensions [gis] globals [ GA-dataset ;; 导入的县域shapefile数据集 ] patches-own [ ID ;; 斑块对应县域ID,与shapefile属性一致 farm ;; 县域内农户总数 myneighbors ;; 本县+邻接县域的斑块集合 county-farmers ;; 本县范围内所有农户agentset neighbor-farmers ;; 本县+邻接县域范围内所有农户agentset AR ;; 邻域范围农户作物采纳率 ] turtles-own [ tId ; 农户唯一ID AT ; 作物采纳阈值 tneighbors ; 农户所属邻域(本县+邻县)所有农户agentset positive ;; 作物采纳状态,true为已采纳,false为未采纳 ] to setup ca reset-ticks set GA-dataset gis:load-dataset "County.shp" gis:set-world-envelope gis:envelope-of GA-dataset ;; 导入shapefile属性到斑块 gis:apply-coverage GA-dataset "CODE" ID gis:apply-coverage GA-dataset "FARMNO" farm ;; 导入县域邻接关系 file-close file-open "Neighbor.txt" while [not file-at-end?] [ let x file-read let y file-read ask patches with [ID = x ] [ set myneighbors ( patch-set myneighbors patches with [ID = y ] ) ] ] file-close ;; 关键修改:将本县自身斑块加入邻域集合,保证统计覆盖本县 ask patches [ set myneighbors (patch-set self myneighbors) ] ;; 按shapefile属性在各县域内生成对应数量农户 foreach gis:feature-list-of GA-dataset [ feature -> let target-patches ( patches gis:intersecting feature ) with [ gis:contained-by? self feature ] let farm1 round gis:property-value feature "FarmNo" if any? target-patches [ gis:create-turtles-inside-polygon feature turtles farm1 [ set tID who set shape "person" set color green set size 2 set positive false ;; 初始默认未采纳 ] ] ] ;; 初始化农户采纳阈值,截断到[0,1]有效区间 ask turtles [ set AT random-normal 0.2 0.1920 set AT max list 0 (min list 1 AT) set label precision AT 2 ] ;; 设置5%初始采纳农户,启动扩散过程 ask n-of (round 0.05 * count turtles) turtles [ set positive true set color red ] ask patches [ set AR 0 ;; 统计本县所有农户 set county-farmers turtles-here ] ;; 关键修改:统计每个县域邻域范围(本县+邻县)所有农户 ask patches [ set neighbor-farmers turtle-set [county-farmers] of myneighbors ] ;; 给每个农户赋值邻域农户集合 ask turtles [ set tneighbors [neighbor-farmers] of patch-here ] ;; 绘制县域边界 gis:set-drawing-color white gis:draw GA-dataset 1 end to go ;; 先更新所有县域邻域的采纳率 ask patches [ ifelse any? neighbor-farmers [ set AR (count neighbor-farmers with [positive = true]) / (count neighbor-farmers) ][ set AR 0 ] ] ;; 再判断农户采纳状态,更新颜色 ask turtles [ let local-AR [AR] of patch-here ifelse local-AR > AT [ set positive true set color red ][ set positive false set color green ] ] if ticks = 11 [stop] tick end
关键修改说明
- 邻域范围补全:读取完邻接关系后,将斑块自身加入
myneighbors集合,确保统计范围包含本县农户 - 农户集合分层统计:先按县域统计本县所有农户存入
county-farmers,再聚合邻接县域的农户集合得到完整邻域农户集neighbor-farmers,避免每个农户重复计算提升运行效率 - 逻辑顺序修正:模型运行时先计算所有邻域的采纳率,再统一更新农户采纳状态,避免顺序执行导致的计算偏差
- 边界处理:对采纳阈值做[0,1]区间截断,对无农户的县域设置采纳率为0,避免运行报错
- 初始状态设置:添加5%的初始采纳农户,保证扩散过程可以正常启动;新增采纳状态对应的颜色变化,方便可视化观察
内容的提问来源于stack exchange,提问作者Kazi Masel
相关产品推荐
相关产品推荐

