如何在NetLogo中使不同通勤方式的智能体沿路径变速移动?
问题:NetLogo中不同通勤方式智能体的变速移动实现
我在NetLogo中模拟步行、骑行、驾车三种通勤人群,用nw:path-to查找家到工作地点的最短路径,引导智能体沿路径移动。步行者每tick移动一个路段正常,但想让骑行者和驾车者更快。
没使用fd 1是因为智能体并非始终沿单一方向移动。尝试让骑行者每tick重复2次移动过程、驾车者重复4次,期望速度分别达到步行者的2倍和4倍,但实际速度仍一致,求解决办法。
相关变量定义
path-to-goal ;; 起点到终点的路段列表 dist-goal ;; 起点到终点的路段列表长度 mynode ;; 初始时距离智能体最近的节点 destination ;; 所有智能体的共同目标位置 actual-choice ;; 智能体选择的通勤方式(walk、bike或car)
路径设置代码
ask people [ ask mynode [ let shortest-path-to-goal nw:path-to ndestination ask myself [ set path-to-goal shortest-path-to-goal set dist-goal length path-to-goal ] ] ]
路径移动代码
to move-people ifelse length path-to-goal = 0 [ ;; 到达目的地后停止移动 if distance destination < 1 [ set got_to_destination 1 print "goal reached!" ] ] [ let current item 0 path-to-goal let new-location 0 ;; 根据当前路段确定下一位置 ifelse ([end1] of current = mynode) [ set new-location [end2] of current ] [ set new-location [end1] of current ] ;; 移动至新位置 move-to new-location set mynode new-location ;; 移除路径中的当前路段 set path-to-goal remove-item 0 path-to-goal ;; 重新计算从新位置到目的地的路径 set path-to-goal nw:path-to destination if path-to-goal = false [ set path-to-goal [] ] ] end
尝试的变速实现代码
to move-to-work ask people [ if actual-choice = "walk" [ move-people ] if actual-choice = "bike" [ set shape "bike" set size 4 repeat 2 ;; bike_speed [ move-people ] ] if actual-choice = "car" [ set shape "car" set size 4 repeat 4 ;; car_speed [ move-people ] ] ] end
解决方案
问题核心:每次调用move-people时,最后都会重新执行nw:path-to destination生成全新路径,导致重复执行时,每次移动后路径被重置,相当于每轮重复只走了一个路段,无法实现变速。
修改步骤
- 调整
move-people的路径逻辑:移除每次移动后重新计算路径的代码,仅在路径为空且未到达终点时才重新规划路径。 - 保留重复移动逻辑:让骑行/驾车智能体在一个tick内连续沿已有路径前进多个路段。
修改后的move-people代码
to move-people ifelse length path-to-goal = 0 [ ;; 到达目的地后停止移动 if distance destination < 1 [ set got_to_destination 1 print "goal reached!" ] else [ ;; 仅当路径为空且未到终点时,重新计算路径 ask mynode [ let shortest-path-to-goal nw:path-to ndestination ask myself [ set path-to-goal shortest-path-to-goal ] ] ] ] [ let current item 0 path-to-goal let new-location 0 ;; 根据当前路段确定下一位置 ifelse ([end1] of current = mynode) [ set new-location [end2] of current ] [ set new-location [end1] of current ] ;; 移动至新位置 move-to new-location set mynode new-location ;; 移除路径中的当前路段 set path-to-goal remove-item 0 path-to-goal ] end
优化方案(可选)
给不同通勤方式设置全局速度变量,动态控制重复次数,代码更易维护:
全局变量设置
globals [ walk-speed bike-speed car-speed ] to setup set walk-speed 1 set bike-speed 2 set car-speed 4 ;; 其他初始化逻辑... end
调整move-to-work代码
to move-to-work ask people [ let speed 1 if actual-choice = "walk" [ set speed walk-speed move-people ] if actual-choice = "bike" [ set shape "bike" set size 4 set speed bike-speed repeat speed [ move-people ] ] if actual-choice = "car" [ set shape "car" set size 4 set speed car-speed repeat speed [ move-people ] ] ] end
这样后续调整速度只需修改全局变量,无需改动重复次数的硬编码。
内容的提问来源于stack exchange,提问作者viheleha
相关产品推荐
相关产品推荐

