混合公交网络模型多条件ifelse逻辑异常问题排查求助
问题分析与修复方案
核心问题1:载客触发条件逻辑完全写反
你设定的离开条件是「载客率≥80% 或 等待时长≥500 ticks」,但原代码的判断逻辑完全颠倒:
ifelse first-station = [who] of current_node and (occupation_rate_vehicle < 80 or timer_hybrid_buses <= 500)
该条件表示「在始发站,且(载客率不足80% 或 等待时间未到500 ticks)」时继续等待,直接导致巴士必须等到500 ticks才会离开,完全忽略了载客率达标即可离开的规则。
核心问题2:同线路始发站单巴士载客规则未正确实现
原代码中target的判断逻辑混乱,没有真正限制同线路巴士在始发站的载客权限,无法保证每条线路同一时间仅一辆巴士载客。
修复后的代码
修改后的go.hybrid.buses过程
to go.hybrid.buses ask buses with [bus_lines_stations_buses < 200] [ ifelse state = 0 [ drop.clients.bus ; 优化多层嵌套ifelse:通过字符串拼接调用对应线路的选站过程 let station-proc (word "choose.station.bus." bus_lines_stations_buses) run station-proc pick.up.clients.hybrid.bus set timer_hybrid_buses 0 ; 切换状态为始发站等待载客 set state 1 ] [ if first-station = [who] of current_node [ ; 检查当前始发站是否已有同线路巴士在等待/载客 let same-line-bus-active? any? other buses-here with [ bus_lines_stations_buses = [bus_lines_stations_buses] of myself and waiting? = 1 ] if not same-line-bus-active? [ ; 正确的离开触发条件:载客率≥80% 或 等待时长≥500 ticks ifelse (occupation_rate_vehicle >= 80 or timer_hybrid_buses >= 500) [ circulate.bus set waiting? 0 ; 重置状态,准备下一轮运营循环 set state 0 ] [ set waiting? 1 set timer_hybrid_buses timer_hybrid_buses + 1 pick.up.clients.hybrid.bus ] ] ; 若有同线路巴士在运营,当前巴士保持排队不操作 ] else [ ; 不在始发站时,继续执行线路循环 circulate.bus set waiting? 0 ] ] ] end
额外优化说明
- 简化多层嵌套:用字符串拼接+
run命令替代原代码中大量嵌套的ifelse,大幅简化线路选站的代码结构。 - 补全状态闭环:明确
state变量的切换逻辑,确保巴士在完成下客、选站后进入等待状态,离开始发站后重置状态,形成完整的运营流程。 - 明确排队规则:新增
same-line-bus-active?判断,严格限制同线路巴士在始发站的载客权限,符合你设定的规则。
内容的提问来源于stack exchange,提问作者htmdz
相关产品推荐
相关产品推荐

