получить доступ ко всем элементам таблицы netlogo - PullRequest
0 голосов
/ 13 декабря 2018

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

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

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

Кто-нибудь знает, как это можно легко сделать?или таблицы просто не разработаны таким образом?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Существует открытая проблема в расширении table, предлагающая добавить table:map процедуру, которая будет делать именно то, что вам нужно, здесь: https://github.com/NetLogo/Table-Extension/issues/6.

В этом выпуске Брайан Хэд предлагает NetLogoреализация такого примитива:

to-report table-map [ tbl fn ]
  report table:from-list map [ entry ->
    list (first entry) (runresult fn last entry)
  ] table:to-list tbl
end

В вашем случае он будет использоваться так:

set location-visits table-map location-visits [ visits -> visits - 1 ]

Это может быть или не быть быстрее, чем ваше собственное решение, но это можетстоит попробовать.Основное преимущество заключается в том, что если table:map когда-либо станет реальностью, это будет изменение в один символ (с - до :), чтобы ваш код мог воспользоваться этим.

0 голосов
/ 13 декабря 2018

Хорошо, так и происходит - как это часто бывает, когда вы указываете свою проблему, вы решаете ее.

Это можно сделать, вернув все ключи из таблицы, затем пролистав их с помощью foreach и получив доступ к каждому элементу один за другим.

to decay

    let memory table:keys location-visits

    foreach memory
    [
        x -> let visits table:get location-visits x
        table:put location-visits x (visits - 1)
    ]

end

Моя реальная версия также проверяет, чтобы посещения никогда не опускались ниже нуля.

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

Надеюсь, это кому-нибудь пригодится - сейчас я чувствую себя довольно глупо.

Приветствия

...