物流和运输规划技术

时间:2012-10-10 20:20:58

标签: php mysql search architecture logistics

我实际上正在开发一个公交车票预订系统。提供商有许多路线和不同的旅行。我已经设置了一个相当全面的数据库,将所有这些映射到一起,但是当我进行交叉路线预订时,我无法使路径算法正常工作。

例如,用户想要从蒙特利尔前往舍布鲁克,他只会采取我们称之为路线#47的路线。但是如果他去萨顿而不是舍布鲁克,他现在必须在某个时候进入#53路线。

现在,检测一次且仅一次转移并不太难。但当我开始探测他可以做多少路线的选择时,我有点害怕。我已经设计了一种可爱且相对有效的方法,仅使用SQL就可以实现1-3跳,但我想知道我应该如何在更广泛的范围内组织所有这些,因为客户可能不会留下2条路线用于其余是生命。

到目前为止我想到的例子:

StartingStop
joins to Route
joins to StopsOfTheRoute
joins to TransfersOnThatStop
joins to TargetStopOfThatTransfer
joins to RouteOfThatStop
joins to StopsOfThatNewRoute
[wash rince repeat for more hops]
where StopsOFThatNewRoute = EndingStop

问题是,如果我有超过3个跃点,我确定我的SQL服务器会在压力下相当快速地窒息,即使我正确地索引我的数据库,我也可以很容易地预测最终的重大故障...

谢谢

1 个答案:

答案 0 :(得分:1)

我对您的问题的理解:您正在寻找一种能够帮助您确定合适路径的算法(涵盖一条或多条路线的路段)。

正如Jason正确指出的那样,这是一个寻路问题。对于这类问题,你应该首先看看维基百科的article on pathfinding,然后深入研究Djikstra's algorithm的细节。这可能会让你开始。

然而,从结构和性能的角度来看,您很可能很快就会意识到您的数据模型可能会出现问题。典型的例子是,如果你需要管理时间限制:假设你找到几个,那么哪条路径的旅行时间最短?一条路径可能最短,但每天只提供一次,而另一条路径可能更长但每天提供几次。

处理此问题的一种可能方法是创建一个图表,其中每个节点在特定时间对应于特定的停靠点。边缘将在此时从这个站点连接到其他地理站点,以及下一个时间点。“

我的建议是首先阅读寻路算法,然后根据您可能遇到的任何约束重新访问您的数据模型。然后,重点关注存储数据的结构,以及路径搜索的结构。

建议(效率不高,但如果你有足够的RAM可用,可能会有效)。使用关系数据库服务器存储基础知识:停止,哪些路由连接到哪些停靠点等等。好像你已经覆盖了这个。然后在给定约束的情况下构建图形的内存表示。你可以很快地构建自己的库(我不知道任何这样的PHP库)。

另一种选择可能是使用图形数据库,例如Neo4j及其REST接口。我想这需要对你的应用程序进行大量的重新设计。

希望这能为您提供一些有用的指示。