NetLogo: создание случайного массива для глобальной переменной

58
4

Я пытаюсь создать модель, в которой вопрос ставится на черепах. Каждая черепаха представляет собой уникальную область знаний (1, 2, 3, 4, 5...), и каждый вопрос содержит случайное подмножество доменов, например (3 5 8).

Затем я хочу спросить черепах с идентификаторами, которые содержатся в вопросе, чтобы ответить на него. Я надеюсь получить совет:

как создать случайный массив для вопроса (глобальная переменная) и; как сравнить это с идентификаторами черепах.

Это мой первый опыт использования NetLogo, поэтому я прошу прощения за незнание. И я определенно не прошу вас написать proc для меня, но я мог бы использовать некоторые советы в правильном направлении/командах, чтобы попробовать.

Для сравнения, я написал следующее, но я не уверен, что это сработает. Я беспокоюсь, если он ищет точное совпадение массива вопросов с идентификатором черепахи, совпадение никогда не будет найдено. То, что я намереваюсь, если идентификатор черепахи ЛЮБИМОСТЬ в массиве, THEN [set expert? 2]:

to give-an-answer
foreach question [
if question = who [set expert? 2]
]
end

Очень ценю любые советы, которые вы можете мне дать!

Спасибо, Джон

спросил(а) 2014-11-04T14:32:00+03:00 6 лет, 1 месяц назад
1
Решение
72

Проще, если вы используете список агентов вместо списка. Использование агентов-наборов, как правило, является хорошим стилем в NetLogo и обычно проще, чем альтернативные подходы.

Вы можете задать свой вопрос с помощью n-of:

set question n-of turtles 10

И тогда черепаха может проверить, если это в вопросе с member? :

if member? self question
[ set expert? 2 ]

Хотя, если вы хотите, чтобы все черепахи были частью вопроса, чтобы поставить expert? до 2, то проще всего сделать это сразу:

ask question [
set expert? 2
]

Готово! Нет необходимости в if или member? или цикл.

Несколько советов:

    В NetLogo это только идиоматично для завершения переменной с вопросительным знаком, если она содержит истинное или ложное значение. Так set expert? 2 set expert? 2 читается странно. Почему бы не set expert? true set expert? true? Если вам действительно нужно использовать целое число здесь, вы должны удалить знак вопроса из имени переменной.

    Лучше всего избегать использования чисел, которые вообще есть. Использование чисел в NetLogo почти всегда делает ваш код сложнее и сложнее писать - редко проще.

ответил(а) 2014-11-04T15:36:00+03:00 6 лет, 1 месяц назад
59

Спасибо за четкий вопрос.

Часть первая может быть выполнена с ошибкой и повторением. Lput добавляет элемент в левую часть списка. Он использует синтаксис

 Set mylist lput value mylist

Значение будет вашей случайной областью знаний. Повторение повторяется так много раз.

 Repeat 10 [thing]

Где есть код, который вы хотите повторить. Поместите его в свой контекст, который вы получите.

Set question lput (random number-of-domains) question

Часть 2. Примитив, который вы ищете, является членом? Он принимает форму

 Member? Value list

Он возвращает true, если значение в списке в противном случае ложно.

ответил(а) 2014-11-04T15:01:00+03:00 6 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема