NetLogo中如何用循环调用列表下一项实现医生预约匹配
优化方案
核心逻辑调整思路
- 直接以「预约总数达到总容量」作为核心终止条件,替换原来固定次数的repeat逻辑
- 用单指针遍历患者列表,无需嵌套多层ifelse手动写i+1、i+2的递进逻辑,每次遍历到下一位患者自动检查预约条件
- 可以根据业务需求选择是否允许多轮遍历患者:如果医生配额是逐步释放的,多轮遍历可以充分利用所有容量;如果患者仅允许尝试一次,遍历完一次列表就自动终止
优化后代码
首先提前初始化两个全局变量:
patient-ptr:患者列表遍历指针,初始值为0total-capacity:总预约配额,值为injection-capacity * count doctors
set patient-ptr 0 set total-capacity injection-capacity * count doctors ;; 循环终止条件:约满 或 所有患者遍历完成 while [count appointments < total-capacity and patient-ptr < count patientslist] [ ask item patient-ptr patientslist [ if appointment? = true and [available?] of my-doctor = true [ create-appointment-with my-doctor set color black ] ] ;; 移动到下一位患者 set patient-ptr patient-ptr + 1 ;; 若需要允许多轮遍历患者(比如后续医生释放配额后可再给之前没约上的患者预约),取消下面这行的注释 ; if patient-ptr >= count patientslist [ set patient-ptr 0 ] ]
该方案彻底解决了原代码嵌套冗长的问题,会自动遍历所有符合条件的患者,能充分利用所有医生的可用配额,完全符合需求的终止规则。
内容的提问来源于stack exchange,提问作者Julian Westerveld
相关产品推荐
相关产品推荐

