Как убрать рандомизацию в Repast Simphony для тестирования?

Я хочу удалить всю рандомизацию из моей модели Repast, чтобы можно было провести рефакторинг с уверенностью, что функциональность не изменится. Однако мне не удалось удалить рандомизацию, установив начальное число с помощью RandomHelper.setSeed(1) в верхней части myBuilder.build() и убедившись, что мое начальное значение параметра «Случайное начальное число по умолчанию» было установлено на 1 в графическом интерфейсе при инициализации.

Итак, я попытался удалить рандомизацию из образца модели JZombies и столкнулся с той же проблемой. Опять же, я установил RandomHelper.setSeed(1) в верхней части JZombiesBuilder.build() и убедился, что случайное начальное число по умолчанию установлено на 1. Иногда результат был идентичным, иногда нет.

В обоих случаях я использую Text Sink для записи постоянного количества тактов агрегированного числа агентов и агрегированных атрибутов агентов в качестве моих данных. Я обнаружил различия в выходных файлах, используя как FC, так и FCIV Windows.

Какие изменения мне нужно внести, чтобы обеспечить детерминированное поведение?

Изменить:

Я получил детерминированное поведение в демонстрационной модели JZombies, также поместив RandomHelper.setSeed(1); в верхней части конструктора каждого класса. То же самое в моей реальной модели делает первый шаг неизменно идентичным. Еще есть отличия от второй галочки. Думаю, проблема в случайном расписании?


person Willow Treeman    schedule 30.05.2020    source источник


Ответы (1)


Вам не нужно устанавливать случайное семя дважды, поэтому я бы начал с удаления вызова RandomHelper.setSeed(1) в вашем конструкторе (и в других местах). Упомянутое случайное начальное число графического интерфейса пользователя устанавливается через файл JZombies_Demo.rs/parameters.xml.

Перейдем к вашему актуальному вопросу. Если вы используете вызовы RandomHelper для всех ваших стохастических элементов в коде, вы должны увидеть воспроизводимые результаты. Если нет, это может указывать на некоторую неучтенную стохастичность, например, использование не-RandomHelper вызова или что-то вроде итерации через HashMap. Например, когда вы выполняете итерацию с использованием цикла for по DefaultContext, итерация происходит по HashSet, но при использовании метода Context.getObjects () внутренняя итерация выполняется по LinkedHashMap, поэтому повторяемость обеспечивается.

person J. Ozik    schedule 30.05.2020
comment
Вы говорите, что для обеспечения детерминированного поведения мне нужно удалить все виды использования HashMap и вместо этого использовать LinkedHashMap? А это значит никогда не делать for (Object obj : context) { //stuff }? - person Willow Treeman; 30.05.2020
comment
Являются ли пространственные запросы MooreQuery () и VNQuery () проблемами по одной и той же причине? Если да, как мне использовать их детерминированным образом? - person Willow Treeman; 31.05.2020
comment
Да for (Object obj : context) { //stuff } потенциально может нарушить воспроизводимость. Вместо этого вы должны использовать Context.getObjects(). Пространственные запросы не должны вызывать проблем с воспроизводимостью, но если вы видите что-то подобное, сообщите нам об этом и, если возможно, предоставьте небольшой пример, который это демонстрирует. - person J. Ozik; 31.05.2020