如何创建NetLogo公交模型?新手求助巴士停靠与乘客登车实现
NetLogo 公交登车模拟实现方案
核心问题拆解与解决思路
你遇到的问题集中在巴士的移动停靠逻辑和**乘客登车触发(die不执行)**两部分,核心原因大概率是未明确区分巴士与乘客的角色,以及状态触发条件设置不当。下面分模块给出具体实现方案:
1. 巴士的移动与停靠实现
通过状态变量控制巴士的"移动-停靠-离开"流程:
- 用布尔变量
has-arrived?标记巴士是否已停靠站台 - 用数值变量
wait-timer控制停靠时长(按NetLogo的tick计数) - 逐步移动到站台,到达后启动倒计时,时间到后离开
2. 乘客登车与die触发逻辑
确保乘客仅在巴士停靠时移动,到达巴士位置后执行die:
- 用
breed明确区分巴士(buses)和乘客(passengers),避免角色混淆 - 只有当巴士处于停靠状态时,乘客才向巴士移动
- 当乘客距离巴士足够近时,触发
die模拟登车
完整示例代码
全局变量与角色定义
globals [ bus-stop-x bus-stop-y ] ; 明确区分巴士和乘客角色 breed [buses bus] breed [passengers passenger]
初始化(setup)
to setup clear-all ; 设置站台坐标(可自行调整) set bus-stop-x 0 set bus-stop-y 0 ; 绘制蓝色站台 ask patch bus-stop-x bus-stop-y [ set pcolor blue ] ; 创建巴士:初始在右侧远处,设置状态变量 create-buses 1 [ set shape "bus" set size 3 ; 放大巴士便于识别 setxy 20 0 set color red set has-arrived? false set wait-timer 30 ; 停靠30个tick(可调整时长) ] ; 创建5名等候乘客,站在站台旁 create-passengers 5 [ setxy bus-stop-x (bus-stop-y + 1 + random 2) set color yellow ] reset-ticks end
主循环(go)
to go ; 巴士逻辑:移动-停靠-离开 ask buses [ if not has-arrived? [ ; 距离站台大于1时,持续向站台移动 if distance patch bus-stop-x bus-stop-y > 1 [ face patch bus-stop-x bus-stop-y fd 1 ] else [ ; 到达站台,标记状态 set has-arrived? true ] ] else [ ; 停靠倒计时 set wait-timer wait-timer - 1 if wait-timer <= 0 [ ; 时间到,离开站台返回初始方向 facexy 20 0 fd 1 ; 回到初始位置后重置状态,可循环运行 if xcor > 19 [ set has-arrived? false set wait-timer 30 ] ] ] ] ; 乘客登车逻辑 ask passengers [ ; 仅当有巴士停靠时,执行登车动作 if any? buses with [has-arrived?] [ let target-bus one-of buses with [has-arrived?] ; 距离巴士大于0.5时,向巴士移动 if distance target-bus > 0.5 [ face target-bus fd 0.5 ] else [ ; 到达巴士位置,触发die模拟登车 die ] ] ] tick end
排查die不执行的常见原因
- 角色混淆:未用
breed区分巴士和乘客,误在ask buses中执行die(导致巴士消失而非乘客) - 触发条件不满足:巴士的
has-arrived?未正确设为true,或乘客与巴士的距离阈值设置过小,无法触发die - 代码位置错误:乘客的登车逻辑未放在主循环中,或被条件判断阻断,未被执行
内容的提问来源于stack exchange,提问作者Dwayne Johnson
相关产品推荐
相关产品推荐

