基于GIS的NetLogo模型:时间、速度、距离与Patch、Ticks的关联代码优化
问题修正方案:NetLogo模型中时间、速度、Patch与Tick的关联适配
核心问题梳理
现有代码的关键错误在于速度转换逻辑与实际Tick时长不匹配:原calculate-speed假设1 Tick = 1小时,但实际根据推导,1 Tick = 18秒(0.005小时),且代码中存在变量引用笔误(car-type = car-type),导致距离计算和统计完全偏离预期。
具体代码修改步骤
1. 修正速度转换函数(calculate-speed)
将原函数的时间基准从1小时改为18秒(0.005小时),实现km/h到「每Tick行驶Patch数」的正确转换:
to-report calculate-speed [km-per-hour] ; 逻辑:km/h → 米/小时 → 米/18秒 → Patch数(50m/Patch) let meters-per-hour km-per-hour * 1000 let meters-per-tick meters-per-hour * 0.005 ; 18秒=0.005小时 report meters-per-tick / 50 ; 转换为Patch数,需整数可加round end
2. 修正每Tick行驶距离的计算
原代码直接将speed作为distance_this_tick,单位逻辑混乱,需改为基于Tick时长的正确计算:
; After setting speed (km/h) and before moving, calculate distance let meters-per-tick (speed * 1000) * 0.005 ; 速度转米/小时 × 每Tick小时数 let distance_this_tick meters-per-tick set distance-traveled distance-traveled + distance_this_tick ; 累计总行驶米数 ; 转换为公里用于后续统计(可选,也可在Reporter中统一转换) let distance_traveled_km distance-traveled / 1000
3. 修复report-average-distances中的变量引用错误
原代码中car-type = car-type是无效判断,需替换为当前遍历的车型变量car-typology:
to report-average-distances ;; 全车型平均距离计算(原逻辑保留,单位已修正) let total_distance_all sum [distance-traveled] of turtles let count_all count turtles let average_distance_all 0 if count_all > 0 [ set average_distance_all total_distance_all / count_all ] let average_distance_all_km average_distance_all / 1000 ;; 各车型平均距离计算(修复变量引用错误) let car_typologies ["ev" "combustion-old" "combustion-middle" "combustion-new" "hybrid"] foreach car_typologies [ car-typology -> let total_distance_type sum [distance-traveled] of turtles with [car-type = car-typology] let count_type count turtles with [car-type = car-typology] let average_distance_type 0 if count_type > 0 [ set average_distance_type total_distance_type / count_type ] let average_distance_type_km average_distance_type / 1000 ; 可添加代码将结果存入全局变量或输出,方便UI展示 ] end
4. 验证Reporter逻辑(无需修改,确认单位一致性)
现有average-distance-all-cars-km及各车型Reporter的逻辑正确,只需确保distance-traveled的单位是米,即可通过/1000正确转换为公里。
适配10-120km/h区间的使用说明
在设置车辆速度时,调用修正后的calculate-speed函数即可自动适配Tick时长:
; 示例:给车辆设置60km/h的速度(转换为每Tick行驶的Patch数) set speed-patches calculate-speed 60 ; 若需要直接使用米数计算距离,可跳过Patch转换,直接用meters-per-tick的逻辑
内容的提问来源于stack exchange,提问作者Tanyta
相关产品推荐
相关产品推荐

