Убедитесь, что вы внедрили симуляцию таким образом, что «состояние» моделирования является функцией. То есть, функция времени.
Учитывая начальное состояние в момент времени T0
, вы должны иметь возможность построить рамку моделирования в момент времени Tn
для любого n
. Например, начальное стационарное состояние и никакие события (пока) не могут совпадать с идентификационной функцией, поэтому Tn == Tn+1
.
Для получения какого-либо экспериментального действия в момент времени Ta
вы сможете построить кадр Ta+n
для любого n
. Таким образом, вы думаете о событиях как о модификации функции, которая принимает значение времени в качестве аргумента и возвращает кадр моделирования за это время.
Я бы использовал историю событий как Zipper из (времени, функции) пар, представляющих состояние управления имитацией. «Текущее» состояние будет в центре внимания, со списком будущих состояний справа и прошлыми состояниями слева. Как так:
([past], present, [future])
Каждый раз, когда изменяется состояние моделирования, записать новую функцию состояния в future
. Запуск моделирования затем становится вопросом выбора функций из списка future
и передачи текущего времени в них. Запуск его назад точно такой же, за исключением того, что вы выбираете события из списка past
.
Так что, если вы во время Tn
, и вы хотите, чтобы перемотать время Tn-1
, заглянуть в past
список для последнего состояния которого time
атрибут меньше n-1
. Передайте n-1
в свой атрибут function
, и у вас есть состояние моделирования в момент времени Tn-1
.
I've implemented a Zipper datastructure in Java, here.
Будет ли этот подход приемлемым для полета сима? Например, если я воспроизвожу события в течение 20 минут, а затем решаю перейти на 2 минуты, мне придется отменить 18-минутные события. Там может быть сотни событий для отмены. – 2009-07-07 13:57:11
Всё зависит. Чем больше данных вы храните в каждом отдельном действии, тем больший ответ вы получите за счет памяти.Вы можете сохранить временной интервал, в котором произошло каждое действие, а также ВСЕ данные, которые вам понадобятся для события, а затем просмотреть список в хронологическом порядке, пока не найдете состояние, в котором вы были в этот период времени. Затем вам придется загрузить все те переменные, которые хранятся. Это займет немного памяти, но это сэкономит на производительности. – AlbertoPL