我正在研究一个模型,在这个模型中,代理代表一个团队,该团队正在处理一个小组项目。安装程序会生成工作量为1的补丁程序和技能从0到1的补丁程序的滑块百分比。当座席遇到工作负荷为!= 0的补丁程序时,系统会要求他们对补丁程序重新着色,他们选择的颜色取决于他们的技能。
预期的操作发生了-员工根据他们的技能重新着色补丁,但问题是他们随机重新着色补丁而没有工作负载。带有"quality_of_work“1、2或3的补丁的总和应该等于”count when work“,但即使有5%或10%的补丁设置了work,我也会让大部分补丁填充颜色。为什么会发生这种情况?
提前感谢您的反馈!
to go
if all? patches [ workload = 0 ] [ stop ]
ask employees [move]
ask leaders [move]
ask employees-on patches with [workload != 0] [recolor]
tick
end
to recolor
ask employees with [skills < 0.3] [
set pcolor sky
set workload 0
set quality_of_work 1
]
ask employees with [skills > 0.3 and skills <= 0.6] [
set pcolor violet
set workload 0
set quality_of_work 2
]
ask employees with [skills > 0.61 and skills <= 1] [
set pcolor red
set workload 0
set quality_of_work 3
]
set whereiswork patches with [workload > 0]
set sloppy count patches with [quality_of_work = 1 ]
set mediocre count patches with [quality_of_work = 2]
set great count patches with [quality_of_work = 3]
end发布于 2020-11-20 07:46:04
问题是,您的限制并不是以您认为的方式应用。您必须:
to go
...
ask employees-on patches with [workload != 0] [recolor]
end
to recolor
ask employees with [skills < 0.3] [
set pcolor sky
set workload 0
set quality_of_work 1
]
...
endgo程序中的ask适用于工作负载为0的补丁上的所有员工。假设您在此标记中有两个这样的员工(称为A和B)。ask指示它们各自运行重新着色过程。假设A首先运行(请注意,ask每次都以随机顺序运行代理集)。因此,员工A跳到重新着色过程,然后找到技能< 0.3的每个员工,并告诉这些员工给他们的补丁着色,以此类推。然后,员工B出现了,并告诉他们所有人都要再做一次。如果您有N个满足条件的员工,那么补丁将在每个刻度中着色N次。
因此,您的重新着色过程应该从单个员工的角度来编写。在这种情况下,它更像是“如果我有技能< 0.3,那么给我的补丁上色天空”。这看起来像是:
to recolor
if skills < 0.3
[ set pcolor sky
set workload 0
set quality_of_work 1
]
...
end这种嵌套的询问问题非常常见,所以我通常建议NetLogo初学者将询问和指令放在同一个过程中。类似于:
to go
...
recolor
end
to recolor
ask employees-on patches with [workload != 0]
[ if skills < 0.3
[ set pcolor sky
set workload 0
set quality_of_work 1
]
...
]
...
end或者,您可以使用技巧来提醒自己重新着色过程是一个海龟过程。您可以对其进行注释(这是在补丁模型库中完成的操作),或者您可以使用一种提醒您的方式来命名该过程(例如NetLogo -my-patch)。
https://stackoverflow.com/questions/64914168
复制相似问题