Как выбрать объект, которым поделились мои соседи - PullRequest
0 голосов
/ 08 ноября 2019

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

create-object 1[ hide-turtle set new_object self set chosen? false]

  set selected one-of breed1 
  ask selected [
        set attribute random-float 1
        set my-list fput attribute my-list
      ]

, чтобы поместить его в список, общий для черепахи и ее окрестностей. Теперь я хотел бы рассмотреть другой вариант для той же черепахи, т.е. выбрать один из (старых) предметов, собранных в его списке, на основе атрибута предметов: чем выше значение, тем больше вероятность его выбора. .

 ask one-of breed1 
     let selected-objects objects with [not chosen?]
     let choice rnd:weighted-one-of selected-objects [attribute]
     ask choice [set chosen? true]
     set my-list fput choice my-list
  ]

где

globals [
  chosen?
  new_object ; in alternative to (list attribute in my-list)
]

breed[breed1 breed_1]
breed[objects object]

breed1-own [
  my-list
  my-list?
  attribute
  choice
]

Мои сомнения:

  1. как мне сохранить этот объект в «памяти» / в списке с его атрибутом? Мне нужно было бы сохранить в памяти, так как черепахи (breed1) могут обмениваться / распространять объект / вирус во времени, но потенциально этот объект может изменить значение своего атрибута.
  2. было бы лучше добавить в списокобъект и / или его атрибут?
  3. если бы я хотел изменить его значение, после выбора, как я мог это сделать?

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

1 Ответ

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

ОК, поэтому вы спросили

(1), как я могу сохранить этот объект в «памяти» / в списке с его атрибутом? Мне нужно было бы сохранить в памяти, так как черепахи (breed1) могут обмениваться / распространять объект / вирус во времени, но потенциально этот объект может изменить значение своего атрибута.

Как только вы их создадите, объектыбудет сохраняться, пока вы не убьете их. Это означает, что атрибут, которым владеет каждый объект, также будет сохраняться без каких-либо усилий с вашей стороны.

Глядя на свой код, вы можете отслеживать, какой объект выбран, установив глобальную переменную "new_object" в качестве who номер выбранного вами объекта. .

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

Вы также спросите:

(2) было бы лучше добавить в список объект и / или его атрибут?

Я бы ответил, не ставьте ни объект, ни атрибутобъект в моем списке. Поместите номер who в список my-list. Из номера who вы можете найти объект с тем номером who и из объекта вы можете найти атрибут.

ОК, так что еслиВы делаете это, вы можете отсортировать список по атрибуту? Да, вы можете сделать это с помощью некоторого умного кода. Ключевая строка - это та, которая сортирует список по атрибутам объектов, чьи номера есть в списке my-list.

 let temp2-list sort-on [ attribute ] objects with [ member? who [my-list] of myself ]

Я думаю, что ответ на ваш третий вопрос должен быть ясным сейчас.

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

Вот рабочий код, который должен помочь объяснить этот ответ. Программа установки генерирует один агент и 6 объектов и составляет случайный my-list и соответствующий список атрибутов. Go генерирует отсортированные списки объектов и атрибутов. Объект в списке с наивысшим атрибутом идентифицирован.

Обратите внимание, что объект-собственный [атрибут]. Вы не упоминали об этом.

Пример кода сильно документирован в строке.

globals [
  chosen_object_who
  acting_breed1_who
]

breed[breed1 breed_1]
breed[objects object]

objects-own
[ attribute ]

breed1-own [
  my-list    ;; list of who numbers of objects, initialize to [] or it may fail
  attr-list  ;; list of attributes of the my-list objects, in the same order

  attribute-of-chosen-object
  who-of-chosen-object

   my-list?  ;; unknown
]

to setup
  clear-all

  print "creating 5 objects"
  create-objects 5 [ set attribute random 100 
  print (word "created object " who " with attribute " attribute )
  ]

  create-breed1 1 [
    set my-list []  
    set attr-list []
    set my-list? false      
    set attribute-of-chosen-object -1   
    set  who-of-chosen-object -1        
  ]

    ask one-of breed1 [
    set acting_breed1_who who

    ;; add six random object to my-list then remove duplicates
    repeat 6 [
                  set my-list fput [who] of one-of objects my-list
             ]
    set my-list remove-duplicates my-list      

    ;; create the list of corresponding attributes
    set attr-list map [i -> [attribute] of object i ] my-list

    print (word "at end of setup, here's the my-list: " my-list )
    print (word "here's the corresponding attr-list : " attr-list )

    print ""
    ]    
    reset-ticks    
end

to go 
ask one-of breed1 [  ;; there is only one for this example

 ;; here's the magic command line  
 let temp2-list sort-on [ attribute ] objects with [ member? who [my-list] of myself ]

 ;; print (word "temp2-list: " temp2-list)

 ;; yields a list like [(object 3) (object 1) (object 4) (object 2) (object 0)]   
 ;; it looks like an agent set but it's actually a list of objects in my-list, 
 ;; but sorted into order by ascending attributes.

 ;; generate the new my-list, in the new order
 set my-list map [i -> [who] of i ] temp2-list 
 set attr-list map [i -> [attribute] of i ] temp2-list 
    print "=========== after sort ====================="
    print (word "sorted my-list now is " my-list)
    print (word "matching attr-list is " attr-list )
    print ""

;; You can select the best choice as the last item in the list, giving you the
;; who number of the object which has the highest attribute value
    let best-choice 999

    if-else length my-list > 0
    [ set best-choice last my-list ]
    [ error " my-list is empty! "]

    ;; saved as a global
    set chosen_object_who best-choice

    ;; also save variables in the breed1 we are looking at now
    set attribute-of-chosen-object last attr-list
    set  who-of-chosen-object      last my-list

    print (word "Assuming we want the object with the highest attribute")
    print ""
    print (word " The best choice object-who is " best-choice )
    print (word " the attribute of that choice is " last attr-list )

    print " "
    print " all set to do something with the chosen object "
    print " the choice is known both locally and globally "
    inspect self
   ]

tick

end
...