Добавление атрибутов к элементам списка - PullRequest
0 голосов
/ 28 октября 2019

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

ask one-of turtles ;; turtles have cars
[ set attribute_1 ;; cars' attribute
  set attribute_2 ;; cars' attribute

  set mylist fput car mylist
]

Я бы хотел что-то вроде этого [car1 attribute_1 attribute_2, car2 attribute_1 attribute_2, car3...]. На данный момент у меня есть [car1 car2 car3...]. После привязки атрибутов к элементам мне нужно будет выбрать элемент с наибольшим значением из списка. Пользователь Omarito предоставил мне возможное решение: Как выбрать элемент с наибольшим значением в списке , но мне не совсем понятно, как подобрать элемент.

Я хотел бы спросить вас, возможно ли иметь что-то вроде [car1 attribute_1 attribute_2, car2 attribute_1 attribute_2, car3...] или я могу иметь что-то вроде

[car1 car2 car3...]

или [[attribute_1 attribute_2] [attribute_1 attribute_2] ...]. Если я пишу set mylist fput [(list attribute_1 attribute_2)], я получаю сообщение об ошибке: ожидается буквальное значение.

Надеюсь, вы мне поможете. Спасибо

ОБНОВЛЕНИЕ: После ответа Николаса я отредактировал код следующим образом:

 ask one-of turtles
     [
        hatch-cars 1[ ;; buy a new car 
        set attribute_1 random-float 1
        set attribute_2 random-float 1
        ]
        let this-car self
        set my-list fput this-car my-list

 ; ask turtles [show my-list]
        set new_car? true
        set old_car? false

        set new_car new_car + 1 ;; how could I update it after the change?
  ]

Я что-то упустил?

1 Ответ

1 голос
/ 28 октября 2019

Есть много способов решения этой проблемы, но я дам вам два.

Давайте начнем с того, который ближе всего к тому, что вы сейчас пытаетесь сделать.

turtles-own [ my-list ]

to setup
  clear-all
  create-turtles 3 [
    set my-list [] ; start with empty list
    foreach range 5 [ car -> ; let's pretend cars are just numbers
      let attribute-1 precision (random-float 1) 2
      let attribute-2 precision (random-float 1) 2
      set my-list fput (list car attribute-1 attribute-2) my-list
    ]
  ]
  ask turtles [
    show my-list
    print "  Best car by attribute 1:"
    let best-by-1 last sort-by [ [a b] -> item 1 a < item 1 b ] my-list
    print word "    Sublist:    " best-by-1
    print word "    Car number: " item 0 best-by-1
    print "  Best car by attribute 2:"
    let best-by-2 last sort-by [ [a b] -> item 2 a < item 2 b ] my-list
    print word "    Sublist:    " best-by-2
    print word "    Car number: " item 0 best-by-2
    print "--------"
  ]
end

Большая часть этого кода предназначена для создания черепах и отображения результата, но две ключевые строки:

set my-list fput (list car attribute-1 attribute-2) my-list

для добавления подсписков в основной список и:

let best-by-1 last sort-by [ [a b] -> item 1 a < item 1 b ] my-list

для сортировки основного списка по определенному атрибуту, взятому из подсписка. Затем вы можете использовать item 0 best-by-1, чтобы получить сам автомобиль.

При этом, если вы хотите использовать NetLogo в полной мере, вам, вероятно, следует создать автомобильную породу:

breed [ cars car ]
cars-own [
  attribute-1
  attribute-2
]

breed [ agents an-agent ]
agents-own [ my-list ]

to setup
  clear-all
  create-agents 3 [
    set my-list [] ; start with empty list
    hatch-cars 5 [
      set attribute-1 precision (random-float 1) 2
      set attribute-2 precision (random-float 1) 2
      let this-car self
      ask myself [ set my-list fput this-car my-list ]
    ]
  ]
  ask agents [
    show my-list
    print "  Best car by attribute 1:"
    let best-by-1 max-one-of turtle-set my-list [ attribute-1 ]
    print (word "    " best-by-1 ", attribute-1 = " [ attribute-1 ] of best-by-1)
    print "  Best car by attribute 2:"
    let best-by-2 max-one-of turtle-set my-list [ attribute-2 ]
    print (word "    " best-by-2 ", attribute-1 = " [ attribute-2 ] of best-by-2)
  ]
end

Примитив max-one-of позволяет легко выбрать лучший автомобиль, и все остальное, вероятно, также будет проще, если вы работаете с агентами вместо списков.

...