NetLogo补丁细胞复制模型:适配度驱动替换概率实现求助
问题描述
- 开发仅使用补丁(patches)的NetLogo细胞复制模型,核心指标为适配度(fitness),代表细胞替换邻接细胞的竞争力。
- 初始状态:所有细胞适配度固定为100,不同颜色对应不同细胞类;后续引入适配度90-110的突变细胞。
- 需实现动态概率复制逻辑:例如适配度100的细胞替换适配度95的细胞概率为75%,概率需随90-110区间内的适配度差异动态调整。
- 当前
go过程无法正确引入概率参数,了解rnd函数可处理概率但仅见过海龟(turtles)中的用法,寻求解决方案。
解决方案
核心概率逻辑推导
根据需求构建线性映射关系:
- 适配度差值范围为0(相同适配度)到20(110 vs 90)
- 适配度差为5时,高适配度细胞替换低适配度细胞的概率为75%
- 推导公式:设邻居适配度为
neighbor-fitness,当前补丁适配度为my-fitness,邻居替换当前补丁的概率为:replace-probability = 0.5 + 0.05 * (neighbor-fitness - my-fitness)- 适配度差为5时,概率=0.5+0.05*5=0.75(符合示例要求)
- 适配度相同时,概率为50%
- 最大适配度差(20)时,概率为100%
- 用
clamp函数确保概率始终在0-1区间内
修改后的完整代码
patches-own [ fitness ] to setup clear-all setup-patches reset-ticks end to setup-patches ask patches ;; 随机设置补丁颜色 [ set fitness 100 set pcolor (random colors) * 10 + 5 if pcolor = 75 ;; 75与其他颜色太接近,改为125 [ set pcolor 125 ] ] end to go if (variance [pcolor] of patches) = 0 [ stop ] ask patches [ let target-neighbor one-of neighbors let my-fitness fitness let neighbor-fitness [fitness] of target-neighbor ;; 计算邻居替换当前补丁的概率 let fitness-diff neighbor-fitness - my-fitness let replace-probability 0.5 + 0.05 * fitness-diff ;; 确保概率在0-1范围内 set replace-probability clamp replace-probability 0 1 ;; 根据概率判断是否被邻居替换 if random-float 1 < replace-probability [ set pcolor [pcolor] of target-neighbor set fitness neighbor-fitness ] ;; 适配度>100的突变细胞标记为特定颜色 if fitness > 100 [ set pcolor 65 ] ] tick end to mutate ask patches [ if random-float 1 < 0.05 [ set pcolor 65 set fitness (random 20) + 90 ] ] end
可选:使用rnd扩展实现权重选择
若希望用rnd扩展按适配度权重选择被复制的邻居,可修改go过程如下(需先在模型设置中添加rnd扩展):
to go if (variance [pcolor] of patches) = 0 [ stop ] ask patches [ ;; 按适配度权重选择邻居,适配度越高被选中概率越高 let target-neighbor rnd:weighted-one-of neighbors [fitness] set pcolor [pcolor] of target-neighbor set fitness [fitness] of target-neighbor if fitness > 100 [ set pcolor 65 ] ] tick end
内容的提问来源于stack exchange,提问作者Master
相关产品推荐
相关产品推荐

