NetLogo 如何实现生成海龟间隔5个patch且避开棕色patch
NetLogo海龟间距控制调整方案
问题根源
原有代码直接随机抽取绿色patch生成海龟,没有对生成位置的距离做校验,因此无法保证不同个体之间满足5个patch的间距要求。
实现逻辑
保留原有地图生成逻辑(全图初始为绿色、随机设置100个棕色patch),将原本直接n-of随机sprout海龟的逻辑,替换为逐点校验的位置选取规则:每选定一个候选绿色patch,必须同时满足两个条件才可以生成海龟:
- patch上没有已经放置的海龟
- patch距离当前已经存在的所有海龟的直线长度≥5个patch
满足条件的候选位置才会被选中放置对应类型的海龟,从机制上保证所有个体的间距符合要求。
调整后的完整实现代码
breed [ humans person ] breed [ zombies zombie ] to setup_world clear-all reset-ticks ;; 原有地图生成逻辑保持不变 ask patches [set pcolor green] ask n-of 100 patches [set pcolor brown] ;; 预先划定所有可生成海龟的合法绿色patch范围 let safe-green-patches patches with [pcolor != brown] ;; 生成15个满足间距要求的人类 repeat 15 [ ;; 筛选当前所有符合间距要求的合法位置 let valid-spots safe-green-patches with [ count turtles-here = 0 and count turtles with [distance myself < 5] = 0 ] ;; 存在合法位置时,随机选位生成人类 if any? valid-spots [ ask one-of valid-spots [ sprout-humans 1 [ set size 5 set color blue set shape "person" ] ] ] ] ;; 生成5个满足间距要求的僵尸,校验逻辑和人类一致 repeat 5 [ let valid-spots safe-green-patches with [ count turtles-here = 0 and count turtles with [distance myself < 5] = 0 ] if any? valid-spots [ ask one-of valid-spots [ sprout-zombies 1 [ set size 4 set color red set shape "person" ] ] ] ] end
实用说明
- 该逻辑同时覆盖同种类、跨种类海龟的间距校验,无论人类之间、僵尸之间,还是人类和僵尸之间,都会保证至少间隔5个patch的距离。
- 如果模型世界尺寸过小,或是设置的海龟数量过多、间距要求过高,可能出现找不到足够合法位置的情况,可适当放大世界尺寸、减少海龟生成数量,或是调低间距要求。
- 代码中
distance原语计算的是两个个体之间的欧氏直线距离,如果需要的是网格行走的曼哈顿距离,可将距离判断条件替换为对应路径计算逻辑。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

