NetLogo模型中雌龟交配条件失效问题求助及解决说明
NetLogo模型中雌龟交配条件失效问题求助及解决说明
Edit: I solved this issue. The problem was that I had set adult = true while creating females.
问题背景
我刚接触NetLogo,遇到个棘手的问题,网上搜了一圈没找到答案,来求助各位!
我做了一个包含雌雄群体的模型:雄性体型固定为10,雌性体型由正态分布随机生成。我的需求是只让体型≥10的雌性参与交配,但运行模型时发现所有雌性(哪怕体型小于10的)都在进行交配操作。麻烦帮忙看看我的代码哪里出错了?以下是相关代码片段(模型还在开发中,只贴关键部分):
colonies-own [Avg-primary-sex-ratios Adult-sex-ratios colony-size] males-own [Sperm-sex-ratios body-size home-colony num-of-children adult? genotype] females-own [primary-sex-ratios mating-status? body-size home-colony num-of-exes num-of-children adult?] to make-females ask colonies [hatch-females round ((initial-colony-size * 90) / 100) [ set shape "spider" set color yellow set home-colony myself set size 0.8] ] ask females [ set body-size mean (list 6 (random-normal 10 2) 14) set num-of-exes 0 set num-of-children 0 set adult? True set mating-status? False ] end to-report initial-colony-size report mean (list 20 (random-normal 60 5) 120) end to go make-male-adults make-female-adults make-sperm mate-with-an-adult-female tick end to make-male-adults ask males [ if body-size >= 10 [set adult? True] ] end to make-female-adults ask females [ if body-size >= 10 [set adult? True] ] end to make-sperm ; males make a range of sperm-sex ratios ranging from 50:50 to 100:0 female:male sperm ask males [if adult? [set sperm-sex-ratios mean (list (random-float 101)) ] if sperm-sex-ratios <= 50 [set color black] if sperm-sex-ratios > 50 and sperm-sex-ratios <= 70 [set color violet] if sperm-sex-ratios > 70 [set color orange] ] end to mate-with-an-adult-female ask males [ if adult? [ ask females [ if adult? and num-of-exes <= 4 [ set mating-status? True set num-of-exes num-of-exes + 1 set color white] ] ] ] end
问题分析&修正方案
你的问题根源非常明确:在make-females过程中,你直接给所有雌性设置了set adult? True,这完全跳过了make-female-adults里的体型筛选逻辑!不管雌性体型多大,刚创建就被标记为成年,自然所有雌性都能满足交配条件里的adult?判断。
修正步骤很简单:
- 在
make-females的雌性初始化代码中,把set adult? True改成set adult? False,让雌性初始状态为未成年:
ask females [ set body-size mean (list 6 (random-normal 10 2) 14) set num-of-exes 0 set num-of-children 0 set adult? False ; 初始设为未成年,后续由体型判断是否成年 set mating-status? False ]
- 保留
make-female-adults过程的逻辑,它会在go过程中被调用,自动将体型≥10的雌性标记为成年,这样只有符合体型要求的雌性才会参与交配。
另外提个小建议:你的mate-with-an-adult-female过程中,成年雄性会遍历所有雌性,只要符合条件就修改状态,这样可能会导致同一个雌性被多个雄性同时选中,num-of-exes被多次累加。后续可以优化成让雄性寻找单个符合条件的雌性(比如附近的),避免重复触发状态改变。
自我解决确认
你自己后来也找到了问题所在——就是创建雌性时直接设置了adult = true,确实是这个细节导致了筛选条件失效!
备注:内容来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

