Сценарий открытого планировщика путешествий медленнее в другие дни, чем сегодня

Я использую открытый планировщик путешествий, используя метод сценариев jython, описанный здесь: http://docs.opentripplanner.org/en/latest/Scripting/ (в частности, "Использование OTP в качестве библиотеки"), и я использую сценарий, очень похожий к их примеру сценария

Для тестирования у меня есть два CSV-файла, содержащие по 40 мест в каждом. Места находятся в Нидерландах, и я загрузил голландские гтф и карту. Странно то, что код, который вычисляет время поездки на общественном транспорте (строка 32 в примере сценария: res = spt.eval(colleges), используя режимы WALK,TRANSIT) занимает больше времени, когда я указываю день, отличный от сегодняшнего дня.

Пример:

req.setDateTime(2018, 12, 8, 16, 00, 00) # today
spt.eval(my_data) # -> takes ~7 - 10 seconds

req.setDateTime(2018, 12, 7, 16, 00, 00) # yesterday
spt.eval(my_data) # -> takes ~30 - 40 seconds

Когда не устанавливается req.setDateTime(), spt.eval() еще быстрее. Обратите внимание, что я выполнил сценарий 6-го, а также 6-го, и тогда он был быстрым, поэтому он, безусловно, относится к "сегодня", а не конкретно к 8-му.

Конечно, мой основной вопрос: как мне сделать это быстрее, чем сегодня? (мой главный интерес на самом деле завтра)

Это связано с тем, когда запускается экземпляр OTP, или это какая-то внутренняя оптимизация? Я не думаю, что это связано со строительством графа, потому что он был построен пару дней назад. Я искал настройку дня или даты и времени при инициализации OTP, но не смог найти это в документации.

(Я еще не пробовал возиться со своим системным временем, но это тоже вариант, который мне не очень нравится). Любые идеи или комментарии приветствуются. При необходимости завтра предоставлю воспроизводимый образец.

1 ответ

Решение

Эта проблема была на самом деле вызвана тем, как я использовал req.setDateTime() в сочетании с req.setMaxTimeSec().

По сути, setMaxTimeSec() использует дату, установленную setDateTime () в качестве отправной точки, и определяет худшее время (или последнее возможное время) для этого времени даты + maxTimeSec. Однако, если setDateTime () еще не был установлен при вызове setMaxTimeSec(), вместо него используется текущая дата и время. Следовательно, это вызовет проблемы, когда вы вызовете setDateTime() AFTERWARDS. Пример:

setMaxTimeSec(60*60) # Sets worst time to now + 1 hour
setDateTime(yesterday) # Sets departure time to yesterday

В этом примере очень долгое время для поиска решений! Вместо того, чтобы смотреть только в течение часа, мы теперь смотрим в окно 25 часов!

В любом случае, простое решение - сначала вызвать setDateTime (), а затем setMaxTimeSec ():

setDateTime(yesterday) # Sets departure time to yesterday
setMaxTimeSec(60*60) # Sets worst time to yesterday + 1 hour

В качестве альтернативы, если по какой-то причине вы не можете переключить эти методы, вы всегда можете исправить setMaxTimeSec () с разницей во времени между now и вашим setDateTime () - значением:

date = datetime.strptime('2019-01-08 21:00', '%Y-%m-%d %H:%M')
date_seconds = time.mktime(date.timetuple())
now_seconds = time.mktime(datetime.now().timetuple())
date_diff_seconds = int(round(date_seconds - now_seconds))
req.setMaxTimeSec(60*60 + date_diff_seconds) 
req.setDateTime(date.year, date.month, date.day, date.hour, date.minute, 00)
Другие вопросы по тегам