NetLogo模型中故障车辆剩余配送任务调度实现求助
解决NetLogo备用车辆接管故障配送任务的问题
我来帮你搞定这个备用车辆接管的逻辑!咱们一步步来完善你的NetLogo模型:
1. 调整变量定义
首先,我们需要添加故障状态标记、最大配送数的全局变量,同时优化海龟属性:
globals[ route-vector max-delivery-count ; 对应滑块的单辆车最大配送数 ] breed [carr car] breed [spare spares] breed [hous housess] breed [spawns spawn] carr-own [ route route-counter spawn-target target route-complete? crash? ; 标记车辆是否故障 ] spare-own[ route route-counter spawn-target target route-complete? has-assigned-tasks? ; 标记备用车是否已接管任务 ]
2. 添加界面元素
在NetLogo界面里配置以下组件:
- 滑块:命名为
max-delivery-count,范围设为1到5(可根据住宅数量调整),默认值设为3 - 按钮:命名为
reschedule,关联到我们后续编写的reschedule过程
3. 初始化变量(修改setup相关过程)
更新车辆初始化逻辑,给新变量赋初始值,同时限制单辆车的配送任务不超过滑块设定值:
to create-carros create-carr 2 [ set color green set size 1.5 setxy random-xcor random-ycor set route-counter 0 set target nobody set route [] set route-complete? false set crash? false ; 初始状态无故障 pd ; 明确生成并绑定起点标记 hatch 1 [ set breed spawns ht ] set spawn-target one-of other turtles-here with [ breed = spawns ] ] end to create-carspare create-spare 1 [ set color blue set size 1.5 setxy random-xcor random-ycor set route-counter 0 set target nobody set route [] set route-complete? false set has-assigned-tasks? false ; 初始未接管任何任务 pd ] end to path set route-vector [4 7 6 3 5 0 1 1 0 1] let houses sublist route-vector 0 (length route-vector / 2 ) let carlist sublist route-vector (length route-vector / 2 ) (length route-vector) ; 限制每辆车的配送任务数不超过max-delivery-count (foreach carlist houses [ [the-car the-house] -> let current-car car the-car if length [route] of current-car < max-delivery-count [ ask current-car [ set route lput ( housess the-house ) route ] ] ] ) end
4. 修改go过程,添加故障触发与故障车行为
在go中加入ticks=25时的自动故障触发逻辑,同时处理故障车辆返回起点的行为:
to go ; 自动触发故障:ticks=25时随机选择一辆正常运行的车辆标记故障 if ticks = 25 [ let healthy-cars carr with [not crash? and not route-complete?] if any? healthy-cars [ ask one-of healthy-cars [ set crash? true set target spawn-target ; 立即转向起点 set color red ; 变红色直观标记故障 print (word "车辆" who "发生故障,正在返回起点") ] ] ] ; 正常配送车辆的行为(排除故障车辆) ask carr with [ not route-complete? and not crash? ] [ if route = [] [ set target spawn-target ] if target = nobody [ set target item route-counter route ] face target ifelse distance target > 1 [ fd 1 ] [ move-to target ifelse target != spawn-target [ set route-counter route-counter + 1 ; 检查是否完成所有任务 if route-counter >= length route [ set route-complete? true set target spawn-target ] ] [ set route-complete? true ] set target nobody ] ] ; 故障车辆返回起点的行为 ask carr with [crash?] [ face spawn-target ifelse distance spawn-target > 1 [ fd 1 ] [ move-to spawn-target print (word "车辆" who "已返回起点,停止运行") ] ] ; 备用车辆的配送行为(仅当已接管任务时) ask spare with [has-assigned-tasks? and not route-complete?] [ if target = nobody [ set target item route-counter route ] face target ifelse distance target > 1 [ fd 1 ] [ move-to target set route-counter route-counter + 1 if route-counter >= length route [ set route-complete? true set target nobody print "备用车辆已完成所有接管任务" ] set target nobody ] ] tick end
5. 实现reschedule过程:备用车接管剩余任务
这个过程的核心是提取故障车辆的未完成任务,分配给备用车并启动配送:
to reschedule ; 筛选已返回起点的故障车辆 let broken-cars carr with [crash? and distance spawn-target <= 1] if any? broken-cars [ ask one-of broken-cars [ ; 获取剩余未完成的任务:从当前进度点到任务列表末尾的住宅 let remaining-tasks sublist route route-counter (length route) if length remaining-tasks > 0 [ ; 将任务分配给未接管任务的备用车 ask spare with [not has-assigned-tasks?] [ set route remaining-tasks set route-counter 0 set has-assigned-tasks? true set route-complete? false set target item 0 route ; 立即前往第一个剩余任务点 print (word "备用车辆接管了" length remaining-tasks "个剩余配送任务") ] ] else [ print "故障车辆已完成所有任务,无需接管" ] ; 标记故障车辆任务彻底结束 set route-complete? true ] ] else [ print "没有已返回起点的故障车辆,无法调度" ] end
测试流程
- 点击
setup初始化模型,确认max-delivery-count滑块设为3 - 点击
go运行模型,当ticks=25时,会有一辆绿色车辆变红并返回起点 - 等故障车辆回到起点后,点击
reschedule按钮,蓝色备用车辆会自动开始完成剩余配送任务
这样就完整实现了你需要的故障触发、剩余任务接管逻辑啦!
内容的提问来源于stack exchange,提问作者Filipe Alves
相关产品推荐
相关产品推荐

