Доступ к собственным чертам в netlogo с вложенным спросом - PullRequest
0 голосов
/ 24 мая 2018

Это то, что я хочу сделать:

patches-own[
trait1
trait2
trait3
]

let similarityCounter 0

ask one-of patches[

    ask one-of neighbors[

        **for-each trait[

            if neighborTrait = patchTrait**[

                set similarityCounter (similarityCounter + 1)

            ]
        ]
    ]
]

Я не уверен в части между **.Как можно выполнить итерацию по собственным параметрам патча и сравнить их с патчем и соседом?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Мне очень нравится ответ Джен, но просто для забавы, я хотел бы предложить альтернативный способ решения проблемы, который использует идею Джен трактовать true как 1 и false как 0.

Но сначала я думаю, что, в зависимости от остальной части вашей модели, для вас было бы хорошей идеей сохранить ваши черты непосредственно в списке вместо отдельных переменных.В программировании наличие имен переменных с числовым суффиксом, таким как trait1, trait2 и т. Д., Обычно является подсказкой, что вместо этого следует использовать список.

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

to-report traits ; patch reporter
  report (list trait1 trait2 trait3)
end

Получив это, вы можете написать что-то вроде [ traits ] of one-of patches, чтобы получить список черт патча.

Теперь давайте приступим к проблеме превращения true и false в единицы и нули аналогичным образом.Это правда, что NetLogo не обеспечивает этот разговор автоматически (что я считаю хорошим), но для этого легко написать нашу собственную функцию:

to-report bool-to-int [ yes? ]
  report ifelse-value yes? [ 1 ] [ 0 ]
end

Теперь мы готовы написать нашу основную функцию.Мы будем использовать подход Джена по отображению над оператором =, чтобы преобразовать наши списки признаков в список логических (то есть true / false) значений, и затем мы снова будем использовать map для преобразования этого списка.в список 1 и 0.Как только мы получим это, все, что останется, это sum это!Вот и мы:

to-report similarity-with [ other-patch ] ; patch reporter  
  report sum map bool-to-int (map = traits [ traits ] of other-patch)
end

Наличие этого репортера позволяет очень легко получить сходство между двумя патчами.Теперь вы можете сказать что-то вроде:

print [ similarity-with one-of neighbors ] of one-of patches

Обратите внимание, как я подошел к проблеме, создав небольшие кусочки, которые можно объединить.Мне действительно нравится такой способ: он позволяет мне концентрироваться на одной части проблемы за раз, но также легче тестировать и получать код, который я нахожу очень читабельным.Процедуры NetLogo to-report являются отличным инструментом для достижения такого рода модульности.

0 голосов
/ 24 мая 2018

Как насчет создания списка для каждого патча значений их признаков и подсчета совпадений в двух списках?Это выглядело бы примерно так.

to testme
  let similarityCounter 0
  ask one-of patches
  [ let mytraits (list trait1 trait2 trait3)
    let theirtraits [(list trait1 trait2 trait3)] of one-of neighbors
    set similarityCounter length filter [ xx -> xx ] (map = mytraits theirtraits)
  ]
end

Последняя строка немного плотная.Он сравнивает два списка характеристик с помощью функции map с оператором =, который возвращает список значений true и false, указывающих, соответствует ли эта конкретная характеристика.Затем filter создает список только значений true, а length подсчитывает количество этих true значений.

К сожалению, NetLogo не справляется с обработкой true как 1 и false как 0, которые вы видите на некоторых языках, поэтому вы не можете просто sum список результатов матчей.

...