Сценарий открытого планировщика путешествий медленнее в другие дни, чем сегодня - PullRequest
0 голосов
/ 09 декабря 2018

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

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

Anпример:

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 Ответ

0 голосов
/ 09 января 2019

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

По сути, setMaxTimeSec () использует дату, установленную setDateTime () в качестве отправной точкии определяет худшее время (или последнее возможное время) для этой даты + максимальное время.Однако, если 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 () с помощью разницы во времени между вашим текущим значением и значением 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)
...