Select date in calendarSelect date in calendar

Pages: 1
Если результаты прогонов не воспроизводятся
Возможно, кто-то знает иные причины, которые могут мешать воспроизведению результатов запусков модели?
Если результаты прогонов не воспроизводятся
Если мы поставили Fixed Seed, но результаты прогонов эксперимента не воспроизводятся, то нужно проверить следующие моменты:
  1. В модели должны отсутствовать HashMap, HashSet либо не должно быть итерирования по этим коллекциям

    в силу специфики внутренней реализации этих коллекций, порядок итерирования зависит от значений hashCode() объектов. Если у объектов метод hashCode() не переопределён, то он возвращает какое-то неконтролируемое значение (которое может зависеть от адреса в памяти, где сейчас место под объект)

  2. В модели не должно быть вызовов методов object.hashCode() и System.identityHashCode()

    причина такая же, как в п.1

  3. В модели не должно быть влияющих на логику вызовов типа System.currentTimeMillis(), new Date() и т.п.

    эти методы возвращают текующую дату компьютера

  4. Если результаты воспроизводятся только после закрытия окна модели и повторного запуска, но не воспроизводятся после "stop -> run", то это может говорить о том, что каждый прогон модели оставляет "мусор" в пользовательских данных на эксперименте. Частным случаем являются статические переменные, которые могут быть записаны первым прогоном и считаны вторым.

    "мусор" от первого прогона используется вторым прогоном (т.е. у второго прогона другие исходные данные)

  5. Если в модели есть внешние источники данных (текстовый или excel файл, БД,...), то нужно проверить, что с этими данными не будет ситуации как в п.4
  6. В модели не должны использоваться методы с неконтролируемым значением класса Random, например Collections.shuffle() или Math.random(). В таких случаях объект класса Random должен быть заменён на getDefaultRandomGenerator().
  7. Нужно проверить свойства модельного времени на эксперименте: если календарь не используется, то это означает, что стартовая дата в Engine (которая всё равно всегда есть) будет выбрана как "текущая дата/время компьютера". Из-за этого некоторые методы для конвертации таймаутов из человеческих единиц времени в модельные могут, в силу численных ошибок округления, давать разные результаты
  8. Если в модели создаются "свои" параллельные потоки, то нужно проверить, что их выходные данные корректно синхронизованы и упорядочены

    причина: потоки совершенно недетерменированно могут "обгонять" друг друга

  9. Если всё вышеперечисленное не помогло, то попробовать отключить анимацию модели (создать Custom Experiment, например или запустить модель, не переключаясь на Main; выставить фиксированную частоту кадров). Возможно, на динамических свойствах какой-либо из фигур написан вызов функции, которая что-то меняет в модели? Это может быть "свой" метод getMyX(), который прописан как код для X в фигуре. Это может быть код "On Draw" у группы.

    Любой код на динамических свойствах фигуры вычисляется ровно на каждом кадре. Если на первом прогоне был FPS 50, а на втором прогоне параллельно была запущена какая-нибудь мощная программа, и FPS стал 30, то во втором прогоне наша функция будет вызвана на 20 раз меньше.
Pages: 1