我真的需要你的帮助来解决我的代码问题。不幸的是,一旦一个条件得到满足,我很难更新海龟的状态。
这是一个病毒传播问题:每个节点,称为人类,有自己的‘袋’,其中包含不同的项目(病毒和药品)。这个袋子是由邻居的物品组成的,这些物品都是与被选中的海龟相连的。病毒可能来自僵尸在开始(t=0),并从海龟转移到海龟,这取决于他们决定做什么。如果一只海龟感染了病毒(传播行为),它就会被感染。给我带来一些问题的代码部分如下:
to spreading
ask one-of humans
[ let choice one-of out-link-neighbors
ifelse empty? bag
[ ifelse random-float 1 < p
[action1 set bag lput act1 bag print "act1"]
[action3 print "act3"]
]
[spread set bag lput spreadvirus bag print "spreadvirus"
if [infected?] of choice
[become-infected] ]
]
]
end更具体地说,部分与蔓延。这部分代码应该做的是为每只随机选择的海龟建造一个由邻居包中的所有“物品”组成的袋子,并根据海龟的选择来转换它。
例如,如下图所示,在起始节点2、5和7可能受到感染,因为它们被链接到僵尸。每只海龟都能“看到”它的所有物品,再加上它的邻居袋子里的所有物品(例如,7只海龟可以看到-而且有可能选择-所有的物品都是从Z到8的-在这种情况下,它的袋子是空的-而且是从它自己的袋子里-即过去的选择-制成的。假设7从僵尸中提取病毒(动作2,即传播)并感染。节点5可以看到节点4和7列表中包含的所有项目,它也可能受到感染,这取决于节点选择的内容。如果5喜欢4中的一个项目,即一个节点没有被感染,因为在它自己的列表中只有未受感染的项,它就会变得易受感染。如果它从7中选择受感染的项目,它也会被感染。等等..。
我怀疑这些袋子并没有像我想要的那样从邻居那里储存信息。这就解释了为什么没有人会从ifelse语句中感染,而只会受到感染,而且他们会根据自己的选择以白色和蓝色改变颜色。
我没有从代码中得到任何错误,所以我很难理解我到底做错了什么。我还打印了一些印刷品,看看哪些是不起作用的,而且似乎代码的一部分以扩展为操作是问题所在。
我应该期待的是一个清单,其中包含海龟的邻居的所有物品。在每一个滴答,海龟可以选择如何处理这些项目(action1,扩散,action3),通过添加一个新的项目,从邻居选择一个项目,或什么都不做。这个选择应该加到海龟袋里。这意味着,应在每个勾号处更新清单,同时考虑到邻居的所有元素,再加上海龟选定的行动/元素。但是,只有当海龟选择(传播)不是来自邻居的药物,而是病毒时,它才会被感染。
更新后的JenB答案,并更好地解释人类的品种应该如何被感染:
每个袋子中可能含有的物品是新药、来自同一只海龟或邻居的药物和/或人类的病毒;只有僵尸的病毒--我不需要在僵尸袋中添加元素。为了更好的澄清:一旦一只海龟和另一只海龟之间有了联系,这些海龟就可以分别获得它们包里的所有物品。当选择行动时,海龟可以获得自己的袋子,里面有从邻居的袋子中储存的所有物品,因为袋子是由所有与选定的海龟相连的海龟的物品(药物和病毒)组成的。然而,只有当海龟决定选择传播的行动,并从邻居的袋子中选择一个被感染的物品时,它才会被感染。在选择之后,选择的元素被添加到它自己的袋子中。我编辑了部分代码。我所做的是为僵尸创建一个新的包,只使用“病毒”初始化;此外,我编辑了关于‘传播’的代码部分如下:
to spread
set action1? false
set spread? true
ifelse any? out-link-neighbors with [infected?]
[ print "Virus!"
set spreadvirus spreadvirus + 1
become-infected]
[ print "Medicine from neighbour"
set spreadvirus spreadvirus + 1
become-susceptible]
end但以这种方式,我没有被感染的人类。我认为,我想要建造的袋子并不是把海龟邻居的所有物品都储存起来。这也解释了为什么海龟不会被感染。
我希望你能帮助我理解我做错了什么。谢谢你的时间,努力和帮助。
发布于 2019-09-14 08:57:25
这是一个更清楚的解释,应该发生什么,但你仍然没有告诉我们发生了什么。例如,您在其中有print语句,是否打印了适当的输出(因此代码正在到达该部分),还是代码中的那个部分没有被选中?你收到错误消息了吗?这些名单中的一个是什么样子的?
我认为你的意思是逻辑不起作用。我建议你在选择了人类之后,再在上面放一些诊断指纹:
ask one-of humans
[ type "Neighbour count: " print count out-link-neigbors
type "Bag at start: " print bag
ifelse...然后您可以看到为什么要选择所选的路径。它还会让您知道变量内容是否与您所期望的不同。
您有一个注释,即行set bag lput spreadvirus bag不起作用。因此,替换:
[ show one-of bag
set bag lput spreadvirus bag ;; NOT WORKING
print "spreadvirus" ]使用
[ show bag
set bag lput spreadvirus bag
show bag
print "spreadvirus" ]看看它在做什么。
调试时可以做的另一件事是将ask one-of human替换为“询问人10”(或其他一些特定的人)。找到不同情况的人--例如,只有一个邻居的人,然后尝试一下。
更新以响应评论
6 2是袋子里的东西。当你把act1或者电子病毒或者其他什么东西放进袋子里时,你就把一个数字放进了袋子里。这是因为act1和电子表格病毒是数字。它们从0开始,然后在代码中的各个点向它们添加1。
在我看来,你把错误的东西放进包里了。如果你想让一个人从袋子里取出一个被感染的物品,那么这个袋子需要包含被感染和未感染的物品,而不是数字。
https://stackoverflow.com/questions/57897768
复制相似问题