Создать новый предмет и добавить его в списки моих соседей - PullRequest
2 голосов
/ 06 ноября 2019

Я хотел бы спросить, как я могу добавить элемент, созданный одной черепахой, в свой список и списки соседей. Я создал локальную переменную 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. Фактически, в сообщении об ошибке говорится, что

элементы породы не имеют собственной переменной my-list

Можно ли указать породу turtle-set? Что мне нужно, так это рассмотреть только breed1 и breed2, а не elements породы. Например, поскольку я рассматриваю человека как создателя элемента, правильно ли написать

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

И если это будет правильно, как я могу добавить новый элемент как «Новый элемент» в списокс учетом его атрибута для дальнейшего рассмотрения.

Например: set my-list fput (list attribute1 attribute2) of elements my-list) возвращает мне список значений, например (0.134531 0.14141) (0.91844 0.42176) ... Есть предложения, чтобы было что-то более приятное для просмотра, но с той же информацией? Мне нужно будет отслеживать эти значения в следующих шагах.

Надеюсь, вы сможете пролить свет на то, что я делаю неправильно.

Спасибо

1 Ответ

1 голос
/ 07 ноября 2019

Val, вот некоторый рабочий код, который создает новый элемент и обновляет мой личный список.

Возможно, это не совсем то, что вы хотели, но я надеюсь, что в любом случае это поможет. Вы не включили всю информацию о породах и о том, кому принадлежит, что я наказал.

Я разбил более сложные команды на несколько более коротких, чтобы отладить то, что происходило и где оно ломалось. Я добавил несколько операторов печати. ​​

Если вы загрузите это, запустите программу установки и нажмете «go» один раз, вы увидите агентов в сети, связанных с их номерами «кто», кроме них, чтобы вы могли легко проверитьте, которые вы хотите. Значения 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
...