创建一个新项目并将其添加到我的邻居列表中

Create a new item and add it to my neighbours's lists

我想问一下如何将一只海龟创建的元素添加到它自己的列表和它邻居的列表中。 我创建了一个局部变量 neighbours,定义为 turtle-set in-link-neighbors with [breed=breed1]。然后我请邻居添加创建的元素 (new_elem),按照本论坛用户提供的答案。

密码是:

to create_elements
 create-elements 1[
    set person one-of turtles with [breed = breed1 or breed = breed2]
    ifelse [breed = breed1] of person
    [
      set attribute1 random-float 1
      set attribute2 random-float 1

      set function1 (1 + attribute1)
    ]
    [
      set attribute1 random-float 1
      set attribute2 random-float 1

      set function2 (1 - attribute1)
    ]

  let neighbours (turtle-set self in-link-neighbors with [breed = breed1] of person)
      ask neighbours
      [set my-list fput new_elem my-list]
    ]
  ]
end

我知道 let neighbours (turtle-set self in-link-neighbors with [breed = breed1] of person)... 中有错误,但在将元素放入列表中时也有错误,因为我认为新元素是在品种 elements 中定义的。事实上,错误消息说

elements breed does not own variable my-list

是否可以指定 turtle-set 的品种?我需要的是只考虑 breed1breed2,而不是 elements 品种。 例如,由于我正在考虑 person 作为元素的创建者,所以写

是否正确
let neighbours (turtle-set person in-link-neighbors with [breed = breed1] of person)
          ask neighbours
          [set my-list fput new_elem my-list] 

如果它是正确的,我如何将一个新元素作为 "New element" 添加到列表中,同时考虑其属性以供进一步考虑。

例如:set my-list fput (list attribute1 attribute2) of elements my-list) returns 我的值列表,如 (0.134531 0.14141) (0.91844 0.42176) ...有什么建议可以让您看到更好看但信息相同的东西吗?我将需要在接下来的步骤中跟踪这些值。

希望您能指出我做错了什么。

谢谢

Val,这里有一些工作代码可以创建新元素并更新每个人的我的列表。

这可能不是您想要的,但我希望它能提供一些帮助。 你没有包括所有关于品种和谁拥有什么的信息,所以我下注了。

我将更复杂的命令分解为多个更短的命令,以便调试正在发生的事情以及发生故障的位置。我添加了一些打印语句。

如果你加载它,运行 设置,然后点击 "go" 一次,你可以看到网络中的代理与他们旁边的 "who" 号码相关联,这样你就可以轻松地检查你的那些 想。 my-list 的值也打印在命令部分。

"go" 步骤再重复两次应该可以验证它们是否输出了您想要的内容。

我不知道你是否希望 new_elem 只在 create_elements 部分本地,或者你是否希望它在全球范围内可用,所以我在两个地方都添加了注释。

希望对您有所帮助!代码本身有更多注释。特别注意你必须将my-list初始化为一个空列表,否则它默认为数字零,你的fput语句将失败并显示关于期望列表并找到零的评论。

globals [   
     ;;new_elem   ;; might be needed as a global ??
  ]

;; ///////////////////// note that there is no breed required called "people"

breed  [ elements element]
breed  [ breed1 lion ]
breed  [ breed2 tiger ]

;; ///////////////////// i punted on which entity owned "function1 and function2

breed1-own [ attribute function1 function2 my-list]
breed2-own [ attribute function1 function2 my-list]

to setup
  clear-all

  ;; make some turtles with breed = breed1 (say, red lions)
   create-breed1 2 [ set size 2 set shape "circle"   set color red
    setxy random-xcor random-ycor
   ]

  ;; make some turtles with breed = breed2  (say, green tigers)
  create-breed2 2 [ set size 2 set shape "circle"   set color green
    setxy random-xcor random-ycor
   ]

  ;; //////////////////////////////////////////////////////////////////////////
  ;;  NOTE!!!   If you don't initialize my-list to an empty LIST type,
  ;;            fput will generate an error when you try to fput a new element onto it

  ;; this is ugly but fast:
  ask breed1 [create-links-with other breed1
    set my-list [] ]
  ask breed1 [create-links-with breed2
    set my-list [] ]

  ask breed2 [create-links-with other breed2
    set my-list [] ]
  ask breed2 [create-links-with breed1
    set my-list [] ]

  ask turtles [set label who]  ;; ///////////////////////// for debugging

 ;; set new_elem nobody          ;; this could be a global so it can persist 
                                 ;; outside create_element, in which case 
                                 ;; initilize it here

  reset-ticks
end

to go
  create_elements
  tick
end

to create_elements    


  ;; declare the local variables, all agent-sets of some type

  let new_elem nobody  ;; declare this locally if we don't need to persist it
                       ;; outside the create_elements context
                       ;; and remove the declaration in [ globals ]
                       ;; and initializtion in setup

  let personx nobody
  let xx-neighbors nobody

  ;; do just this creation here in order to see what's going on more easily
  ;; than combining multiple operations into a long complex command


  create-elements 1 [ set new_elem self ]
   type "new element is this agentset " show new_elem

  set personx one-of turtles with [breed = breed1 or breed = breed2]

  ifelse [breed = breed1] of personx
     [ ;; if it is breed1
       ask personx [
       set attribute random-float 1
       set function1 (1 + attribute)
       ]
    ]
    [  ;; else, it must be  breed2
       ask personx [
       set attribute random-float 1
       set function2 (1 - attribute)
       ]
     ]

    ;;//////////////////////////////////////// for debugging
    type "the personx we defined above is " print personx

    ask personx [set xx-neighbors (turtle-set self in-link-neighbors  )]

    if-else xx-neighbors != nobody    ;; If it has any members, which should
                                      ;; always be true since we added self to the set
    [
       ask xx-neighbors  
        [
          set my-list fput  new_elem  my-list

          ;; ////////////////////////////////////for debugging
          type "here's the resulting my-list: " show my-list
        ]
    ]
    [ print "ERROR didn't find any neighbors or self" ]

end