如何根据特定条件更改乌龟的状态?

时间:2019-09-11 22:57:58

标签: netlogo

我真的需要您的帮助来解决我的代码中的问题。 不幸的是,一旦条件满足,我很难更新海龟的状态。

这是一个病毒传播问题:每个节点(称为人类)都有自己的“袋子”,其中装有不同的物品(病毒和药品)。袋子由邻居的物品组成,这些物品与所选的乌龟有关。 该病毒一开始可能来自僵尸(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,即传播)并被感染。可以看到节点4和7列表中包含的所有项目的节点5也可能会受到感染,具体取决于其选择的内容。如果5偏爱4中的某个项目,则表示该节点未受感染,因为在其自己的列表中只有未感染的项目,因此它很容易受到感染。如果从所有7个中选择受感染的项目,它也会被感染。依此类推...

我怀疑是行李袋没有按照我的意愿存储邻居的信息。这就解释了为什么没有人会受到ifelse语句的感染,而只是易受感染,并且他们会根据自己的选择将颜色更改为白色和蓝色。

我没有从代码中得到任何错误,所以我很难理解我真正在做什么错。我还做了一些打印工作,以查看什么不起作用,似乎代码的作用是扩展。
我应该期望的是一个包含所有乌龟邻居物品的清单。在每个滴答处,乌龟都可以通过添加新项目,从邻居中选择一个项目来选择处理这些项目(动作1,传播,动作3),或者什么也不做。此选择应添加到乌龟袋中。这意味着应该在每个刻度上更新列表,同时考虑到邻居的所有元素以及乌龟的选定动作/元素。但是,只有当它选择(传播)的不是邻居的药物而是病毒时,乌龟才会被感染。

在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

但是也这样,我没有感染人类。而且我认为我要制造的袋子没有存放海龟附近的所有物品。这解释了为什么乌龟无法被感染。

希望您能帮助我了解我做错了什么。 谢谢您的时间,精力和帮助。

1 个答案:

答案 0 :(得分:1)

这是应该发生的事情的更清晰的解释,但是您仍然没有告诉我们正在发生的事情。例如,您在其中有打印语句,是否正在打印适当的输出(因此代码到达该部分)还是未选择该代码的那一部分?您收到错误消息了吗?这些列表之一是什么样的?

我认为您的意思是逻辑不起作用。我建议您在选择人员之后将更多的诊断打印品放在顶部:

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。

在我看来,您在袋子里放错了东西。如果您希望人类从袋子中取出受感染的物品而被感染,则袋子需要装有受感染和未感染的物品,而不是号码。