Разница в определении переменной - PullRequest
0 голосов
/ 04 ноября 2019

Я хотел бы определить новый объект, и я не знаю, что может быть лучшим подходом. Я знаю, что let используется для локальных переменных, и это должно быть основным отличием. Я создаю список в NetLogo, в котором хранятся элементы с некоторыми атрибутами / свойствами. Поскольку позже мне нужно будет выбрать один из этих элементов из созданного списка, что мне нужно будет понять, если мне нужно создать объект как переменную local или переменную global (turtle’s own), чтобы сделать это,Возможны два варианта:

1) Создать объект как глобальная переменная:

globals [object
         attribute] 
turtles-own[
    my-list]

to setup 
create-turtles 5
ask turtles [
set my-list []
]
end

to-go

ask one-of turtles[
set attribute 5
set my-list lput object my-list]
end

2) Создать объект как локальная переменная:

turtles-own[
my-list]

to setup 
create-turtles 5
ask turtles [
set my-list []
]
end

to-go

ask one-of turtles[
let object “New object”
let attribute 5 ; this should be assigned to object
set my-list lput object my-list]
end`

Тамдолжен быть и другой случай, то есть объект и атрибут, определенные в turtles-own (это тот случай, который я бы предпочел):

turtles-own[
object 
attribute 
my-list]

to setup 
create-turtles 5
ask turtles [
set my-list []
]
end

to-go

ask one-of turtles[
set object “New object”
set attribute 5 ; this should be assigned to object
set my-list lput object my-list]
end

Мне нужно реализовать следующее:

  1. Черепахи, чьи объекты хранятся в списке
  2. Объекты, у которых есть атрибуты (или вы также можете интерпретировать их как черепах, которые создают объекты с атрибутами)
  3. Черепахи, которые можно выбрать, чтобы выбратьобъект из этого списка в зависимости от атрибута. (Это самый важный момент, так как позже мне нужно поработать с объектом и его атрибутами).

Не могли бы вы помочь мне понять, как мне нужно его реализовать?

Я хотел бы избежать штриховки или создать породу для объекта, потому что я не уверен, что смогу управлять им по всему коду. Однако, если это единственный правильный путь, я сделаю это.

Спасибо за ваше время.

1 Ответ

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

Val, я понимаю, что вы изначально спрашивали: «Я хотел бы спросить вас о разнице в использовании let и set». но позже вы объясните, что вам нужно реализовать, на что я и ответил. Итак, название этого вопроса не очень точное.

Я не уверен, что это единственный путь, но я пытался решить вашу проблему, насколько я понимаю, используя две породы (людей и предметы). Я надеюсь, что из приведенного ниже кода вы увидите, как это сделать - просто нигде не используйте «Ask-Turtles», если вы не хотите воздействовать как на людей, так и на объекты. в проблемы.

Рабочий код приведен ниже.

Как я интерпретировал ваш вопрос,

  • объекты являются постоянными и глобальными,
  • изменяется наатрибуты объекта кем-либо в любое время обновят значение этого атрибута для этого объекта в my-list каждого агента
  • каждый человек имеет свой собственный список my-list, возможно, пустой.
  • my-списки разных агентов будут отличаться
  • каждый человек может искать один из объектов из своего списка, основываясь на атрибуте, и я сохраняю полученный объект, если он есть, в их текущем выборе.
  • каждый человек должен иметь возможность выбрать любой из объектов и добавить этот объект в свой my-list

Выбор дизайна реализации:

  • Используйте дваo породы, «люди» и «объекты», которые имеют разные переменные.
  • Каждый объект обладает атрибутом и типом объекта (например, «яблоко» или «апельсин»)
  • Каждый человеквладеет моим списком и текущим выбором. my-list - это список, а current-choice - агент (возможно = nobody )

Особенности кода ниже

  • Код создает 5 человек и 6 объектов для тестирования. Все они просто остаются сидящими в начале координат на дисплее.

  • На каждой итерации шага "go", случайный человек выбирает два случайных объекта и добавляет их в свои my-list, а затем находит один из них на основе значения атрибута.

  • код создает список из всех объектов в my-list, имеющих требуемый атрибут,который может иметь ноль, один или несколько объектов в нем, и делает что-то разумное в зависимости от длины списка.

  • ни один элемент не был удален из моего списка или проверен, чтобы убедиться, что он там уже есть.

  • , это все, что он делает. Запустите программу установки, запустите go (один раз) и проверьте результаты.

Надеюсь, это полезно. Дайте мне знать, если я не ответил на ваш вопрос.

Wade

;; this is the second version of the code. It has some comments removed or
;; corrected, and initializes current-choice to nobody instead of []

globals [found?]      ;; keep track of whether we found an object  

breed [objects object]
breed [people person]


objects-own [
  object-type      ;  say "apple" or "orange" or "widget"
  attribute        ;  user defined, apparently an integer
]

people-own[
current-choice    ; an agent  
  my-list]        ; a list of objects 


to setup 
  clear-all
  make-people
  make-objects
  reset-ticks
end

to go

  ;; for debugging we'll push two objects onto the my-list for a random agent
  ;; then find one of them with the right attributes and pull it into current-choice

ask one-of people[
    ;; select a random apple, set its attribute to 111, 
    ;; and push it onto this turtle's my-list  

    set current-choice one-of objects with [object-type = "apple"]   
    ask current-choice [set attribute 111 ]              
    set my-list ( lput  current-choice my-list )    

    ;; select a random orange, set its attribute to 222, 
    ;; and push it onto this turtle's mylist  

    set current-choice one-of objects with [object-type = "orange"]    
    ask current-choice [set attribute 222 ]               
    set my-list ( lput  current-choice my-list )     

    ;; ok, let's see if we can find an object in my-list with attribute 111

    let want-attribute 111    ;; for debugging purposes


    ;; make a list of ALL objects on the list with the desired attribute
    ;; as far as we know,there may be many, one, or zero objects with this attribute

    let found-list filter   [ i -> want-attribute =[attribute] of i ]   my-list


    if-else length found-list > 0     
    [ ;; we found at least one match
      set found? true

      ;;  pick a random object from the list of objects which have the desired attribute

      set current-choice one-of found-list
    ]
    [ ;; we didn't find any matches
       set current-choice nobody
       set found? false
      ;; do whatever you do when there is no matching object
    ]

     ;; if desired, check out how things ended up by uncommenting the next
     ;; two lines:
     ;;  inspect current-choice  
     ;;  inspect self

   ]
tick  ;; update the tick counter
end

to make-people
  create-people 5    
   [
    set current-choice nobody
    set my-list []
] 
end

to make-objects
create-objects 3    ; create 3 apples
  [ set object-type "apple"
    set attribute 333 ]

 create-objects 3    ; create 3 oranges
  [ set object-type "orange"
    set attribute 555 ]
end

;; Above code was created by Wade Schuette,  3-November-2019
;; modified sightly 4-November-2019
;; No copyright is claimed.  Enjoy!
...