Netlogo:将一种海龟放置到另一种类型

Netlogo: Placing one type of turtle to other type

我是 NetLogo 的新手。我需要你的帮助来设置海龟。我有两种品种:房屋和人类。我设置的房子如下:

create-houses 10[
    
    setxy random-xcor random-ycor
    set shape "house"
    set size 3
    
  ]

现在我有 n 个人工代理,我想设置他们的 XY,使人工代理应该放在内部代理的顶部。位于任何房屋代理之上的人类代理会假定此人属于该房屋。 我使用以下代码将人工代理置于房屋代理之上:

 create-humans n-numbers
  [
    setxy random-xcor random-ycor
    set xcor [xcor] of min-one-of houses [distance myself]
    set ycor [ycor] of min-one-of houses [distance myself]
]

上述方法的问题在于,我仍然很少有人类代理人没有被放置在任何房屋代理人之上。我不希望任何特工无家可归。有什么办法可以解决这个问题吗?换句话说,我想(随机地)将 n 个人工代理分配给 10 个内部代理。

这里在概念上有两个不同的问题。

  1. 使用space表示所有权。所以一旦你把人和房子放在同一个地方,那么你可能会编写代码,意思是“在我所在的同一个地方找到房子”。在 NetLogo 中,一个更好的方法是使用代理变量将房子分配给一个人,再将一个人分配给房子。
  2. 搬到选定的房子。

这是一个使用所有权概念的完整模型。每个房子和人都有一个属性来标识其合作伙伴(解决问题 1)。请注意,还有其他方法可以做到这一点,例如使用链接。然而,下面的方法引入了最少的新思想,也是理解 turtle 属性的好方法,这是 NetLogo 中的一个基本概念。

对于问题2,当你有一个像乌龟这样的目标时,你可以使用move-to

breed [houses house]
houses-own [my-humans]

breed [humans human]
humans-own [my-house]

to setup
  clear-all
  create-houses 10
  [ setxy random-xcor random-ycor
    set shape "house"
    set size 3
    set my-humans nobody
  ]
  create-humans 50
  [ set my-house one-of houses
    move-to my-house
    ask my-house [set my-humans (turtle-set my-humans myself)]
  ]
end

除了我发现的问题外,此代码还使用了 withmyselfwith 很简单,它只是创建一个满足条件的海龟代理集。 myself 有点令人困惑——它指的是乌龟在问。所以乌龟要求房子设置它的“我的人”变量。每当您在代码中使用 myself 时,最好检查代码是否完成了您认为的操作。在这种情况下,您可以为房子和人打开 inspect window,并确保这对变量匹配。

编辑了代码以允许每个房子有多个人。这需要为每个房屋明确构建人类代理集。它从一个空的代理集开始(使用特殊代理 nobody),然后将之前的代理集和新的人合并(使用 turtle-set)。