从另一个代理程序集中删除代理程序集(第一组中的代理程序也存在于第二组中)

时间:2017-12-15 21:52:02

标签: netlogo agentset

在我的netlogo代码中我有一个公司网络(这是我的品种)。我想让公司与他们的邻居和他们的邻居等共享信息,这是有效的(参见下面的代码,代理集是b,c和d)。

然而,当我询问有关第三级邻居的信息时,我的agentset还包括第一级邻居(显然因为它需要所有邻居进入acount),所以我想从第三级邻居代理集中删除这些第一级邻居。在代码中,这意味着我要删除D中存在的代理,这些代理也存在于B

但是我找不到这样做的方法,other不起作用,因为它不是代理要求必须删除的。并且remove似乎也没有做到这一点。我还尝试!=不等于第一级但报告了truefalse,我只是想从第三级代理集中删除这些代理,因此我不会重复计算它们。< / p>

ask companies [
  let i who
  let b link-neighbors
    ask b [ let c link-neighbors
     ask c [ let d link-neighbors

      ask companies with [who = i] [ 
        set iburen [who] of b
        set iiburen [who] of other c
        set iiiburen [who] of d
     ]
   ]
 ]
]

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

我认为你想要的是member?原语。如果D和B是代理集,则以下内容应该为您提供不属于B的成员D.

let DminusB D with [not member? self B]

答案 1 :(得分:2)

这里有很多话要说:

  1. 查尔斯&#39;答案在技术上是正确的。
  2. 如果ab是代理商集,则a with [ not member? self b ]会向a的代理商提供尚未加入b的代理商。

    但我认为有更好的方法来完成你想要做的事情。我将回过头来看,但首先是一条建议:

    1. 不要使用who
    2. who原语具有一些(极少数)合法用法,但它主要是邪恶的。它往往导致脆弱,低效的代码。例如,当你这样做时:

      let i who
      ; ...
      ask companies with [who = i] [ ... ]
      

      NetLogo必须扫描所有公司,以找到具有该特定who号码的公司。

      NetLogo可以直接存储代理引用。改用它!例如:

      let this-company self
      ; ...
      ask this-company [ ... ]
      
      1. 特别是不要使用who个数字列表!
      2. NetLogo足以操纵列表,但其非常棒用于操作代理集。如果您这样做:

        set iburen [who] of b
        set iiburen [who] of other c
        set iiiburen [who] of d
        

        你丧失了代理集的力量。我不知道为什么你要分别存储这三个不同的级别,但假设将所有邻居存储在一起可以做到:

        set my-neighbors other (turtle-set b c d)
        

        other的使用将排除原始公司,turtle-set将确保集合中的每个代理都是唯一的(因为代理集无论如何都只能包含唯一代理)。

        如果您真的想要三个单独的变量,请使用Charles&#39;回答,但请确保存储代理集,而不是who数字列表!

        但是,如果您不需要单独的变量,我认为最好的解决方案是:

        1. 使用nw:turtles-in-radius
        2. NetLogo的网络扩展程序有a primitive that does exactly what I think you want to do

          ask companies [ set my-neighbors nw:turtles-in-radius 3 ]
          

          那就是它。