如何根据特定条件更改乌龟的状态?
How can I change a turtle's status depending on specific conditions?
我真的需要你的帮助来解决我的代码问题。
不幸的是,一旦满足条件,我就很难更新海龟的状态。
这是一个病毒传播问题:每个称为人类的节点都有自己的'bag',其中包含不同的项目(病毒和药物)。这个袋子由邻居的物品组成,这些物品被 link 发送给了所选的乌龟。
病毒可能在一开始(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 可能被感染,因为它们 link 被僵尸感染了。每只乌龟可以 'see' 它的所有物品加上它邻居包中包含的所有物品 (例如,7 可以看到 - 并可能选择 - 来自 Z 的所有物品,来自 8 - 它的包是空的在这种情况下 - 并且来自它自己的包,由历史存储的项目制成,即过去的选择)。假设 7 从僵尸身上挑选病毒(动作 2,即传播)并被感染。可以看到节点 4 和 7 列表中包含的所有项目的节点 5 也可能被感染,具体取决于它的选择。如果 5 更喜欢 4 中的一个项目,那是一个未感染的节点,因为在它自己的列表中只有未感染的项目,它变得易感。如果它从 7 项中选择了受感染的项目,它也会被感染。等等...
我怀疑这些袋子没有按照我的意愿存储来自邻居的信息。这解释了为什么没有人会被 ifelse 语句感染,而只是易感,并且他们会根据自己的选择改变颜色为白色和蓝色。
我没有从代码中得到任何错误,所以我很难理解我真正做错了什么。我还放了一些 print 看看有什么问题,似乎是代码的 spread as action 部分有问题。
我应该期待的是一个包含海龟邻居的所有物品的清单。在每个刻度,乌龟可以选择如何处理这些项目(action1、spread、action3),通过添加新项目、select从邻居那里购买项目,或者什么都不做。这个选择应该加到龟袋里。这意味着列表在每次更新时都应该更新,考虑到来自邻居的所有元素,加上来自海龟的 selected action/element。但是,只有当乌龟选择(传播)的不是邻居的药物而是病毒时,它才会被感染。
在 JenB 回答后更新并更好地解释人类应该如何被感染:
每个袋子可能包含的物品类型是新药,来自同一只海龟或来自邻居 and/or 病毒的药物,用于人类;只有僵尸病毒 - 我不需要向僵尸包中添加元素。
为了更好地阐明:一旦一只乌龟和另一只乌龟之间存在 link,这些乌龟就可以分别访问其包中的所有物品。当需要 select 一个动作时,乌龟可以访问它自己的包,其中包含所有从邻居的包中存储的物品,因为包是由所有乌龟的物品(药物和病毒)组成的linked 到选定的乌龟。
但是,只有当乌龟决定 select 传播该行为,并且 select 从邻居的包中感染一件物品时,乌龟才会被感染。
选择后,将选择的元素添加到自己的包中。
我编辑了部分代码。我所做的是为僵尸创建一个新包,仅使用 "virus" 进行初始化;此外,我编辑了关于 'to spread' 的代码部分如下:
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
但也通过这种方式,我不会让人类被感染。而且我认为我正在尝试构建的袋子并没有存储乌龟邻居的所有物品。这也解释了为什么海龟不会被感染。
我希望你能帮助我理解我做错了什么。
感谢您的时间、努力和帮助。
这是对应该发生的事情的更清晰的解释,但您仍然没有告诉我们发生了什么。例如,您在那里有打印语句,是否打印了适当的输出(因此代码到达了那部分)或者没有选择那部分代码?您是否收到错误消息?这些列表之一是什么样的?
我认为你的意思是逻辑不工作。一旦你选择了人类,我建议你在顶部放置更多诊断打印:
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 或 spreadvirus 或其他任何东西放入包中时,您就是在将一个数字放入包中。这是因为 act1 和 spreadvirus 是数字。它们从 0 开始,然后您在代码中的不同位置将它们加 1。
我觉得你包里放错东西了。如果你想让一个人在从包里拿出受感染的物品时被感染,那么包里需要包含受感染和未感染的物品,而不是数字。
我真的需要你的帮助来解决我的代码问题。 不幸的是,一旦满足条件,我就很难更新海龟的状态。
这是一个病毒传播问题:每个称为人类的节点都有自己的'bag',其中包含不同的项目(病毒和药物)。这个袋子由邻居的物品组成,这些物品被 link 发送给了所选的乌龟。 病毒可能在一开始(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 可能被感染,因为它们 link 被僵尸感染了。每只乌龟可以 'see' 它的所有物品加上它邻居包中包含的所有物品 (例如,7 可以看到 - 并可能选择 - 来自 Z 的所有物品,来自 8 - 它的包是空的在这种情况下 - 并且来自它自己的包,由历史存储的项目制成,即过去的选择)。假设 7 从僵尸身上挑选病毒(动作 2,即传播)并被感染。可以看到节点 4 和 7 列表中包含的所有项目的节点 5 也可能被感染,具体取决于它的选择。如果 5 更喜欢 4 中的一个项目,那是一个未感染的节点,因为在它自己的列表中只有未感染的项目,它变得易感。如果它从 7 项中选择了受感染的项目,它也会被感染。等等...
我怀疑这些袋子没有按照我的意愿存储来自邻居的信息。这解释了为什么没有人会被 ifelse 语句感染,而只是易感,并且他们会根据自己的选择改变颜色为白色和蓝色。
我没有从代码中得到任何错误,所以我很难理解我真正做错了什么。我还放了一些 print 看看有什么问题,似乎是代码的 spread as action 部分有问题。
我应该期待的是一个包含海龟邻居的所有物品的清单。在每个刻度,乌龟可以选择如何处理这些项目(action1、spread、action3),通过添加新项目、select从邻居那里购买项目,或者什么都不做。这个选择应该加到龟袋里。这意味着列表在每次更新时都应该更新,考虑到来自邻居的所有元素,加上来自海龟的 selected action/element。但是,只有当乌龟选择(传播)的不是邻居的药物而是病毒时,它才会被感染。
在 JenB 回答后更新并更好地解释人类应该如何被感染:
每个袋子可能包含的物品类型是新药,来自同一只海龟或来自邻居 and/or 病毒的药物,用于人类;只有僵尸病毒 - 我不需要向僵尸包中添加元素。 为了更好地阐明:一旦一只乌龟和另一只乌龟之间存在 link,这些乌龟就可以分别访问其包中的所有物品。当需要 select 一个动作时,乌龟可以访问它自己的包,其中包含所有从邻居的包中存储的物品,因为包是由所有乌龟的物品(药物和病毒)组成的linked 到选定的乌龟。 但是,只有当乌龟决定 select 传播该行为,并且 select 从邻居的包中感染一件物品时,乌龟才会被感染。 选择后,将选择的元素添加到自己的包中。 我编辑了部分代码。我所做的是为僵尸创建一个新包,仅使用 "virus" 进行初始化;此外,我编辑了关于 'to spread' 的代码部分如下:
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
但也通过这种方式,我不会让人类被感染。而且我认为我正在尝试构建的袋子并没有存储乌龟邻居的所有物品。这也解释了为什么海龟不会被感染。
我希望你能帮助我理解我做错了什么。 感谢您的时间、努力和帮助。
这是对应该发生的事情的更清晰的解释,但您仍然没有告诉我们发生了什么。例如,您在那里有打印语句,是否打印了适当的输出(因此代码到达了那部分)或者没有选择那部分代码?您是否收到错误消息?这些列表之一是什么样的?
我认为你的意思是逻辑不工作。一旦你选择了人类,我建议你在顶部放置更多诊断打印:
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 或 spreadvirus 或其他任何东西放入包中时,您就是在将一个数字放入包中。这是因为 act1 和 spreadvirus 是数字。它们从 0 开始,然后您在代码中的不同位置将它们加 1。
我觉得你包里放错东西了。如果你想让一个人在从包里拿出受感染的物品时被感染,那么包里需要包含受感染和未感染的物品,而不是数字。