2

我正在使用此处解释的 jython 脚本方法来使用开放式旅行计划器:http: //docs.opentripplanner.org/en/latest/Scripting/ (特别是“将 OTP 用作库”)并且正在使用非常相似的脚本到他们的示例脚本

出于测试目的,我有两个 csv 文件,每个文件包含 40 个位置。这些位置在荷兰境内,我已经加载了荷兰 gtfs 和地图。奇怪的是,当我指定除今天以外的日期时,计算公共交通出行时间的代码(示例脚本中的第 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 时提供日期或日期时间设置,但在文档中找不到。

(我还没有尝试过弄乱我的系统时间,但这也是我不太喜欢的一个选项)。欢迎任何想法或意见。如有必要,我将在明天提供可重复的样品。

4

1 回答 1

0

这个问题实际上是因为我将 req.setDateTime() 与 req.setMaxTimeSec() 结合使用造成的。

基本上,setMaxTimeSec() 使用 setDateTime() 设置的日期作为起点,并定义最差时间(也就是最后可能的时间)到该日期时间 + maxTimeSec。但是,如果调用 setMaxTimeSec() 时尚未设置 setDateTime(),则使用当前日期时间。因此,当您碰巧在 AFTERWARDS 之后调用 setDateTime() 时,这将导致问题。例子:

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

或者,如果由于某种原因,您无法切换这些方法,您始终可以使用现在与您的 setDateTime() 值之间的时间差来更正 setMaxTimeSec():

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)
于 2019-01-09T20:42:26.833 回答