Мне очень нравится ответ Джен, но просто для забавы, я хотел бы предложить альтернативный способ решения проблемы, который использует идею Джен трактовать 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
являются отличным инструментом для достижения такого рода модульности.