Routing 基于真实交通街道数据的边缘权重计算
我目前正在android中开发一个导航系统,我正在使用dijkstra的最短路径算法我的Vertex类包含如下所示的成员:Routing 基于真实交通街道数据的边缘权重计算,routing,navigation,shortest-path,dijkstra,weighted-average,Routing,Navigation,Shortest Path,Dijkstra,Weighted Average,我目前正在android中开发一个导航系统,我正在使用dijkstra的最短路径算法我的Vertex类包含如下所示的成员: ------------------------------------- | Vertex | ------------------------------------- | | | | | | id | name | longitude | latitude
-------------------------------------
| Vertex |
-------------------------------------
| | | | |
| id | name | longitude | latitude |
-------------------------------------
---------------------------------------------
| Edge |
---------------------------------------------
| | | | | |
| id | name | source | destination | weight |
---------------------------------------------
和一个边缘,其成员如下所示:
-------------------------------------
| Vertex |
-------------------------------------
| | | | |
| id | name | longitude | latitude |
-------------------------------------
---------------------------------------------
| Edge |
---------------------------------------------
| | | | | |
| id | name | source | destination | weight |
---------------------------------------------
因为顶点和边是基于真实数据的,特别是:作为顶点的交点
一个交叉点到另一个交叉点作为边缘简单地说,我的应用程序的整个图形就是我所在城市的道路网络
我这里的问题是,我仍然无法根据一个交叉点到另一个交叉点的距离以及到达一个交叉点到另一个交叉点的时间来计算边的权重。这取决于您希望优化的内容(您可以让用户选择): 如果你想要最短的路线,一条边的成本就是街道的长度 如果你想走最快的路线,那么所需的费用将是在街道上行驶的预期时间 如果您想要在燃油消耗方面最经济的路线,成本将是“街道长度/每加仑英里数(预期速度)” 燃油经济性因汽车而异,但您可以假设经济性(以每加仑英里数为单位)随着车速线性增长,直到达到某一速度,然后开始下降[]。由于您总是可以以低于最大速度的速度行驶,因此请假设效率恒定<代码>(英里/加仑)/(英里/小时)=(小时/加仑),因此成本大致与时间成正比,车速限制适用于汽车的最有效速度(用户可以输入) 如果您有准备好的拥堵数据来源,请使用它来确定预期的车速 通过观察汽车来测量预期行驶时间的一种方法是对过去{间隔}内离开街道的所有汽车进行平均(小时?分钟?只有最后一辆车?最后十辆车?)。然而,这并不能很快解决交通拥堵问题。您可以计算速度表中所有车辆的平均速度。然而,这将高估交通信号灯的作用 你可以计算过去一小时内所有进入街道的汽车的平均速度<代码>平均值(行驶距离/花费时间)或
平均值(行驶距离)/平均值(花费时间)
。如果街道没有生命,只需采取其速度限制或使用更长的测量间隔
记住,两个方向上的预期速度可能不同(取决于数据源),因此始终使用成对的定向边,并在每个方向上分别测量
[1] 如果您不想使用自己的系统,可以尝试graphhopper(也适用于android,处理定向图,您可以将该图用作内存映射图或内存中的图形等)。已经有一个RoutingAlgorithm.setType方法可以处理最短+最快的路由。@Karussell但是我必须提供真实的数据,即边权重吗?或者它是通过卫星或其他方式计算的?通过openstreetmap(见OSMReader)或任何你拥有的数据源。