NetLogo界面图表未更新求助:欧盟CSDDD政策模拟代码故障
NetLogo模拟欧盟CSDDD政策图表不更新问题求助
我正在为研究论文编写模拟欧盟新CSDDD政策的NetLogo代码,代码运行异常,已解决部分问题但仍存在新故障。目前核心问题是NetLogo界面创建的图表无法更新显示,多次修改代码仍未解决,以下是更新后的代码:
globals [compliance-threshold-level penalty-rate num-compliant] turtles-own [sustainability-score is-company? inspected] to setup clear-all set-default-shape turtles "circle" ;; 创建企业 create-turtles num-companies [ set is-company? true set color blue setxy random-xcor random-ycor ] ;; 创建供应商 create-turtles num-suppliers [ set is-company? false set sustainability-score random 101 set color green setxy random-xcor random-ycor ] ;; 设置参数 set compliance-threshold-level 70 set penalty-rate 10 set num-compliant 0 reset-ticks end to go ask turtles with [is-company?] [ inspect-suppliers check-compliance ] update-visuals tick end to update-visuals ;; 更新合规趋势图 set-current-plot "Compliance Over Time" clear-plot plot num-compliant ;; 更新平均可持续得分图 set-current-plot "Average Sustainability Score" clear-plot let total-score sum [sustainability-score] of turtles with [not is-company?] let total-suppliers count turtles with [not is-company?] let average-score ifelse-value (total-suppliers > 0) [total-score / total-suppliers] [0] plot average-score ;; 更新供应商得分分布直方图 set-current-plot "Supplier Score Distribution" clear-plot histogram [sustainability-score] of turtles with [not is-company?] end to inspect-suppliers let suppliers turtles with [not is-company?] let num-suppliers count suppliers ;; 确定要检查的供应商数量 let num-to-inspect min (list 5 num-suppliers) if num-to-inspect > 0 [ let to-inspect n-of num-to-inspect suppliers ask to-inspect [ set inspected true ] ] end to check-compliance let inspected-suppliers turtles with [inspected = true and not is-company?] if any? inspected-suppliers [ let total-score sum [sustainability-score] of inspected-suppliers let count-inspected count inspected-suppliers ;; 计算平均得分 let average-score ifelse-value (count-inspected > 0) [total-score / count-inspected] [0] ;; 合规检查 if average-score >= compliance-threshold-level [ set num-compliant num-compliant + 1 ask turtles with [is-company?] [set color green] ] if average-score < compliance-threshold-level [ ask turtles with [is-company?] [set color red] ;; 施加惩罚,确保可持续得分不低于0 ask inspected-suppliers [ set sustainability-score max (list 0 (sustainability-score - penalty-rate)) ] ] ;; 重置检查标记 ask inspected-suppliers [ set inspected false ] ] end
核心问题及修复方案
1. 图表更新逻辑错误
当前每次更新图表时调用clear-plot,会清空之前所有数据,只绘制当前数值,导致无法形成时间序列。修复方式:
- 对于时间序列类图表(合规趋势、平均得分趋势),移除
clear-plot,让NetLogo自动按tick步累加数据; - 对于直方图(供应商得分分布),保留
clear-plot,因为需要每步重绘当前分布。
修改后的update-visuals代码:
to update-visuals ;; 更新合规时间序列图 set-current-plot "Compliance Over Time" plot num-compliant ;; 更新平均可持续得分图 set-current-plot "Average Sustainability Score" let total-score sum [sustainability-score] of turtles with [not is-company?] let total-suppliers count turtles with [not is-company?] let average-score ifelse-value (total-suppliers > 0) [total-score / total-suppliers] [0] plot average-score ;; 更新供应商得分分布直方图 set-current-plot "Supplier Score Distribution" clear-plot histogram [sustainability-score] of turtles with [not is-company?] end
2. num-compliant计数逻辑错误
当前代码中,每个企业每次检查合规都会让num-compliant累加1,导致数值持续暴涨,且未按时间步统计当前合规企业数量。修复方式:
- 新增
turtles-own变量is-compliant?,用于标记单个企业的合规状态; - 每步重置
num-compliant,统计当前合规的企业总数。
步骤1:修改turtles-own声明
turtles-own [sustainability-score is-company? inspected is-compliant?]
步骤2:在setup中初始化变量
;; 创建企业时 create-turtles num-companies [ set is-company? true set is-compliant? false set inspected false set color blue setxy random-xcor random-ycor ] ;; 创建供应商时 create-turtles num-suppliers [ set is-company? false set sustainability-score random 101 set inspected false set color green setxy random-xcor random-ycor ]
步骤3:修改go和check-compliance逻辑
to go set num-compliant 0 ;; 每步重置合规计数 ask turtles with [is-company?] [ inspect-suppliers check-compliance ] ;; 统计当前合规企业数量 set num-compliant count turtles with [is-company? and is-compliant?] update-visuals tick end to check-compliance let inspected-suppliers turtles with [inspected = true and not is-company?] if any? inspected-suppliers [ let total-score sum [sustainability-score] of inspected-suppliers let count-inspected count inspected-suppliers let average-score ifelse-value (count-inspected > 0) [total-score / count-inspected] [0] ;; 单个企业独立判断合规状态 if average-score >= compliance-threshold-level [ set is-compliant? true set color green ] if average-score < compliance-threshold-level [ set is-compliant? false set color red ask inspected-suppliers [ set sustainability-score max (list 0 (sustainability-score - penalty-rate)) ] ] ask inspected-suppliers [set inspected false] ] end
3. 其他潜在问题修复
- 初始化
inspected变量:所有海龟创建时都要设置inspected false,避免未初始化的布尔值导致逻辑异常; - 移除全局修改企业颜色的代码:原代码中只要有一个企业检查供应商,所有企业颜色都会被修改,改为单个企业自己设置颜色,符合模拟逻辑。
内容的提问来源于stack exchange,提问作者Rahul Arora
相关产品推荐
相关产品推荐

