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