Как создать таблицу, которая связывает собственную переменную turtle с тиками и обновляет это значение после 24 тиков - PullRequest
0 голосов
/ 19 октября 2019

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

Я планирую объединить две вещи:

  • Во-первых, идея заключается в том, что агент отслеживает свою полезность определенного действия (в моей модели это будет утилита, которую агент получаетначисление платы) в определенный час в течение одного дня, а затем использует эту полезную стоимость для будущих решений о начислении платы или оплате. Мой первоначальный подход состоял в том, чтобы создать таблицу, в которой каждая строка представляет один час (всего должно быть 24 строки), а столбец представляет наблюдаемую переменную собственной черепахи (в данном случае: полезность).
  • Во-вторых, значения в столбце должны обновляться после каждого дня (скажем, мы сохранили значение утилиты в понедельник 01:00 (тик # 1), затем через день это значение утилитыдолжно быть обновлено значением утилиты, полученным во вторник 01:00 (тик # 25). Здесь я бы использовал foreach для замены старого значения новым.
turtle-own [utility]

to setup
  __clear-all-and-reset-ticks

  ;; set the start date to January 1, 2020 and link the ticks to one hour
  set start-time time:create "2020/01/01 00:00"
  set current-time time:anchor-to-ticks start-time 1.0 "hour"
  time:anchor-schedule start-time 1.0 "hour"
end

to setup-turtles
ask turtles [
  set utility 0
]
end

to go
ask turtles [
  set utility utility + 1 ; just a placeholder for now - I'm still working on the true utility-function
]
end

Но я борюсь за реализацию первого шага, так как я не могу каждый час связываться с собственной утилитой turtle "утилита".

Любая помощь приветствуется!

1 Ответ

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

Если все, что вам нужно, это чтобы черепаха хранила 24 значения полезности (1 за каждый час), тогда утилита может быть списком, а не одним числом. Вы можете получить доступ к значению соответствующего часа с помощью item, поэтому у вас может быть что-то:

let hours ticks mod 24
let new-value 1 + item hours utility
replace-item hours utility new-value

Обратите внимание, что вам нужно будет иметь значения в вашем списке, прежде чем вы сможете получить к ним доступ. Например, обращение к item 9, когда в вашем списке только 5 значений, приведет к ошибке. Кроме того, NetLogo имеет индекс 0. Это означает, что доступ к первому значению в списке осуществляется с помощью item 0, а не item 1.

. Пара замечаний, как вы упомянули, что вы новичок в NetLogo. Маловероятно, что вам понадобится время для этой модели. Если вы в основном используете постоянный шаг времени в один час, просто используйте tick обычным способом. Даже если вам в конечном итоге потребуется использовать расширение времени, когда вы строите более сложную модель, которая каким-то образом относится к реальному времени, вы можете добавить ее тогда. Вы также упомянули foreach - этот примитив используется для циклического перемещения по списку, что вам не нужно делать. Похоже, что вы просматриваете список значений утилит, чтобы представить изменение во времени - если это так, не делайте этого. Посмотрите на некоторые примеры моделей в библиотеке NetLogo и постарайтесь понять, как работает время. Вы также должны понимать разделение между процедурой настройки и процедурой go в этих моделях, процедура go содержит все, что должно произойти во время шага по времени. Вам понадобятся ticks (текущий шаг по времени) и tick (переход к следующему временному шагу). Я не могу особо подчеркнуть, насколько важно понимать это в любой симуляции.

...