Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何使一只海龟能够在Netlogo中保存其他海龟的ID?_Loops_Netlogo_Agentset - Fatal编程技术网

Loops 如何使一只海龟能够在Netlogo中保存其他海龟的ID?

Loops 如何使一只海龟能够在Netlogo中保存其他海龟的ID?,loops,netlogo,agentset,Loops,Netlogo,Agentset,以下是我想做的: 我想要一个由三只海龟组成的小组 所有海龟都需要将自己的ID和队友SID存储在名为队友SID的变量中。(假设你想创建一个组,你会把你的名字和你朋友的名字放在一个列表中,这就是为什么这个变量需要存储ownID,我不擅长解释东西。) 我需要他们能够显示所有队友的ID,而不是仅仅显示(agentset,3只海龟) 在他们收集了所有3名成员后,他们将获得团队ID 这里的问题是我不知道如何让这些海龟将自己的ID和队友SID存储在名为队友SID的变量中。在一个小组中,他们应该有三个不同的成员

以下是我想做的:

  • 我想要一个由三只海龟组成的小组

  • 所有海龟都需要将自己的ID和队友SID存储在名为队友SID的变量中。(假设你想创建一个组,你会把你的名字和你朋友的名字放在一个列表中,这就是为什么这个变量需要存储ownID,我不擅长解释东西。)

  • 我需要他们能够显示所有队友的ID,而不是仅仅显示
    (agentset,3只海龟)

  • 在他们收集了所有3名成员后,他们将获得
    团队ID

  • 这里的问题是我不知道如何让这些海龟将自己的ID和队友SID存储在名为队友SID的变量中。在一个小组中,他们应该有三个不同的成员。这些队友不是来自同一组的。以及如何给予他们
    团队ID
    他们获得所有成员后

    这是我的代码:

    global
    [ teamID]
    
    turtles-own
    [
      myID
      teammatesID
    ]
    
    to setup
      clear-all
      set-default-shape turtles "arrow"
      create-turtles 10
    
      ask turtles [ set myID who]
      reset-ticks
      setup-group
    end
    
    to setup-group
    
       set teamID []
       let agent one-of other turtles
       let  nearestNeighbor one-of other turtles in-radius 1 
       set teamID = 0
       ask agent with [ teammatesID < 3]
       [ ask nearestNeighbor with [teammatesID < 3]
         [ ;set teammatesID = myID ; here is the problem, I need to make sure they did not save the same turtle in one group.
           show teammatesID]]
    
           ask agent with [teammatesID > 3]
           set teamID fput teamID teamID
            end
    
    全局
    [团队ID]
    乌龟自己的
    [
    粘虫
    队友席德
    ]
    设置
    清除所有
    设置默认形状海龟“箭头”
    创造海龟10
    问海龟[设置myID谁]
    重置滴答声
    设置组
    终止
    设置组
    设置团队ID[]
    让探员找一只海龟
    让最靠近的一只海龟在半径1内
    设置teamID=0
    向代理询问[SID<3]
    [与[Sid<3]一起询问最近的邻居]
    [;set teambersid=myID;问题是,我需要确保他们没有在同一组中拯救同一只海龟。
    显示SID]]
    用[SID>3]询问代理
    设置teamID fput teamID teamID
    终止
    

    我很感激你在这里的额外时间。谢谢。

    如果团队是随机的,我认为您不需要为此循环,因为
    ask
    将以随机顺序调用海龟

    我认为您仍然应该使用agentsets,因为它使某些事情变得更容易。例如,一旦海龟知道了它们的
    (agentset,3只海龟)
    ,您就可以轻松地查询该agentset以获得
    myID
    s或任何您想要的变量

    我不完全清楚
    teamID
    的目的,因此我可能在这里偏离了基准,但如果
    teamID
    s对于每组三只海龟都是唯一的,我认为您不希望它成为一个全局变量。您可能希望它也是turtles自己的
    变量

    下面是一个包含上述思想的示例。使用此设置:

    turtles-own [ myteamset teamID myID teammatesID ]
    
    to setup 
      ca
      crt 10 [
        set myID who
        set myteamset nobody 
        set teammatesID [ ]
      ]
      setup-groups
      print remove-duplicates [teammatesID] of turtles
      print sort [teamID] of turtles
      reset-ticks
    end
    
    以及
    设置组
    程序(更多详细信息请参见备注):

    如果这是你想要的,请告诉我,希望有帮助

    编辑-根据您的评论:

    要获得连续的团队编号,您可以使用一个简单的计数器,该计数器分配给一个团队,然后为下一个团队递增-修改后的
    设置组
    如下所示:

    to setup-groups
      ; Create a temporary variable to use as a counter
      let teamCounter 1
      ask turtles [
        if myteamset = nobody [
          let possible-teammates other turtles with [ myteamset = nobody ]
          ifelse count possible-teammates > 1 [
            set myteamset ( turtle-set self n-of 2 possible-teammates )
            let ids sort [myID] of myteamset
            let teammmembers myteamset
    
            ; Assign the current teamCounter as team number, then 
            ; increment it by one for the next team
            let tempteam teamCounter
            set teamCounter teamCounter + 1
            ask myteamset [
              set teammatesID ids
              set myteamset teammmembers
              set teamID tempteam
            ]
          ] [
            show "Not enough turtles to make a new team!"
          ]
        ]
      ]
    end
    
    第二个问题本身可能值得提出一个新问题,这取决于您希望获得的深度,但这里有一个非常简单的方法,您只需获得所有独特的团队ID,并拥有一个具有该ID的海龟,让他们的团队一起移动:

    to move-in-groups
      ; Get the unique team IDs
      let teamNumbers remove-duplicates [teamID] of turtles 
    
      ; Get one member of each team to ask all members
      ; of its team (itself included) to move 
      foreach teamNumbers [
        tn ->
        ask one-of turtles with [ teamID = tn ] [
          let newHeading heading + random 60 - 30
          if myteamset != nobody [
            ask myteamset [
              set heading newHeading
              fd 1
            ]
          ]
        ]
      ]
    end
    
    编辑2:NetLogo 5友好版

    to move-in-groups
      ; Get the unique team IDs
      let teamNumbers remove-duplicates [teamID] of turtles
    
      ; Get one member of each team to ask all members
      ; of its team (itself included) to move
      foreach teamNumbers [
        ask one-of turtles with [ teamID = ? ] [
          let newHeading heading + random 60 - 30
          if myteamset != nobody [
            ask myteamset [
              set heading newHeading
              fd 1
            ]
          ]
        ]
      ]
    end
    

    如果团队是随机的,我认为你不需要一个循环,因为
    ask
    无论如何都会以随机顺序调用海龟

    我认为您仍然应该使用agentsets,因为它使某些事情变得更容易。例如,一旦海龟知道了它们的
    (agentset,3只海龟)
    ,您就可以轻松地查询该agentset以获得
    myID
    s或任何您想要的变量

    我不完全清楚
    teamID
    的目的,因此我可能在这里偏离了基准,但如果
    teamID
    s对于每组三只海龟都是唯一的,我认为您不希望它成为一个全局变量。您可能希望它也是turtles自己的
    变量

    下面是一个包含上述思想的示例。使用此设置:

    turtles-own [ myteamset teamID myID teammatesID ]
    
    to setup 
      ca
      crt 10 [
        set myID who
        set myteamset nobody 
        set teammatesID [ ]
      ]
      setup-groups
      print remove-duplicates [teammatesID] of turtles
      print sort [teamID] of turtles
      reset-ticks
    end
    
    以及
    设置组
    程序(更多详细信息请参见备注):

    如果这是你想要的,请告诉我,希望有帮助

    编辑-根据您的评论:

    要获得连续的团队编号,您可以使用一个简单的计数器,该计数器分配给一个团队,然后为下一个团队递增-修改后的
    设置组
    如下所示:

    to setup-groups
      ; Create a temporary variable to use as a counter
      let teamCounter 1
      ask turtles [
        if myteamset = nobody [
          let possible-teammates other turtles with [ myteamset = nobody ]
          ifelse count possible-teammates > 1 [
            set myteamset ( turtle-set self n-of 2 possible-teammates )
            let ids sort [myID] of myteamset
            let teammmembers myteamset
    
            ; Assign the current teamCounter as team number, then 
            ; increment it by one for the next team
            let tempteam teamCounter
            set teamCounter teamCounter + 1
            ask myteamset [
              set teammatesID ids
              set myteamset teammmembers
              set teamID tempteam
            ]
          ] [
            show "Not enough turtles to make a new team!"
          ]
        ]
      ]
    end
    
    第二个问题本身可能值得提出一个新问题,这取决于您希望获得的深度,但这里有一个非常简单的方法,您只需获得所有独特的团队ID,并拥有一个具有该ID的海龟,让他们的团队一起移动:

    to move-in-groups
      ; Get the unique team IDs
      let teamNumbers remove-duplicates [teamID] of turtles 
    
      ; Get one member of each team to ask all members
      ; of its team (itself included) to move 
      foreach teamNumbers [
        tn ->
        ask one-of turtles with [ teamID = tn ] [
          let newHeading heading + random 60 - 30
          if myteamset != nobody [
            ask myteamset [
              set heading newHeading
              fd 1
            ]
          ]
        ]
      ]
    end
    
    编辑2:NetLogo 5友好版

    to move-in-groups
      ; Get the unique team IDs
      let teamNumbers remove-duplicates [teamID] of turtles
    
      ; Get one member of each team to ask all members
      ; of its team (itself included) to move
      foreach teamNumbers [
        ask one-of turtles with [ teamID = ? ] [
          let newHeading heading + random 60 - 30
          if myteamset != nobody [
            ask myteamset [
              set heading newHeading
              fd 1
            ]
          ]
        ]
      ]
    end
    

    我同意Luke的观点,与团队打交道最合适的方式是作为代理集,而不是复杂的标识符分配。这就是代码执行此操作的方式。请注意,我没有提到你问题中的动作部分

    globals [max-teamsize]
    
    turtles-own
    [ teamID
      teammates
    ]
    
    to testme
      clear-all
      create-turtles 100
      [ setxy random-xcor random-ycor
        set teamID 0
        set teammates nobody
      ]
      set max-teamsize 3
      setup-groups
      reset-ticks
    end
    
    to setup-groups
      ; assign turtles to team by allocating a team number
      let counter 1
      ask turtles
      [ if teamID = 0
        [ set teamID counter
          let potential-teammates turtles with [teamID = 0]
          ask n-of min (list (max-teamsize - 1) (count potential-teammates)) potential-teammates
          [ set teamID counter
          ]
          set counter counter + 1
        ]
      ]
      ; store teammates as agentset of other turtles in team
      ask turtles
      [ set teammates other turtles with [teamID = [teamID] of myself]
      ]
    end
    

    我同意Luke的观点,与团队打交道最合适的方式是作为代理集,而不是复杂的标识符分配。这就是代码执行此操作的方式。请注意,我没有提到你问题中的动作部分

    globals [max-teamsize]
    
    turtles-own
    [ teamID
      teammates
    ]
    
    to testme
      clear-all
      create-turtles 100
      [ setxy random-xcor random-ycor
        set teamID 0
        set teammates nobody
      ]
      set max-teamsize 3
      setup-groups
      reset-ticks
    end
    
    to setup-groups
      ; assign turtles to team by allocating a team number
      let counter 1
      ask turtles
      [ if teamID = 0
        [ set teamID counter
          let potential-teammates turtles with [teamID = 0]
          ask n-of min (list (max-teamsize - 1) (count potential-teammates)) potential-teammates
          [ set teamID counter
          ]
          set counter counter + 1
        ]
      ]
      ; store teammates as agentset of other turtles in team
      ask turtles
      [ set teammates other turtles with [teamID = [teamID] of myself]
      ]
    end
    

    你能澄清一下你所说的“这些队友不应该来自同一个团队吗?这里的团队和团队是不同的吗?根据我的编码,条件是”海龟少于3名成员需要找到其他成员“。例如,乌龟1和乌龟2创建了一个团队,因此在乌龟1的队友中,SID应该有他的ID和乌龟2的ID,乌龟2也有,它有自己的ID和乌龟1的ID。但是,这两个团队仍然需要再找到一个成员,并且