我正在开发GPS系统并且为此我想使用A *算法。我有一个图表,其中顶点是源/目标,边缘是街道。为此,我有一个包含以下信息的数据库:
id;"Street Name";source;target;GeoCoordinateX1;GeoCoordinateY1;GeoCoordinateX2;GeoCoordinateY2
这些线中的每一条都代表一条边。使用坐标,目标是使用一个路径查找算法获得最短和最快的路径。我已经开发了djikstra算法,但现在我试图找到一个非常好的启发式算法。
我想知道是否有更准确或更有效的启发式方法。我读到我可以使用曼哈顿,欧几里德或对角线距离。我认为欧几里得将是一个不错的选择,但是g函数的成本与启发式函数h的成本不同。我得到了最短的路径,但需要更长的时间。有没有办法获得好处和利润?
祝你好运
答案 0 :(得分:0)
对于大多数基于坐标的寻路,A *中使用的成本函数是距离'。 vertex
中的每个graph
都是街道上的gps坐标,因此使用Haversine公式计算每个vertex
之间的距离,如this:
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) { var R = 6371; // Radius of the earth in km var dLat = deg2rad(lat2-lat1); // deg2rad below var dLon = deg2rad(lon2-lon1); var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2) ; var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); var d = R * c; // Distance in km return d; } function deg2rad(deg) { return deg * (Math.PI/180) }
为了找到最快的路径,费用函数将是估计的旅行时间'。为了计算这一点,您需要速度限制'对于edge
(街道)之间的每个vertices
,以及上面计算的距离。
费用函数非常简单:cost in hours = distance / speed = km / (km/h)
Google地图有一个API,可以找到许多不同运输方式的最短/最快路径,这将为您节省大量精力。它还考虑了交通,公交时刻表以及项目中难以考虑的其他因素。
如果这是一个爱好项目,继续,你将学到很多关于寻路的知识。随意向我最喜欢的Amit Patel website的A *指南中学习。如果您想了解有关寻路的所有酷炫选项,我会为this answer撰写一篇深入的指南。学术界的人们通常都会编写关于基本算法的教程,谷歌搜索可以找到关于这些算法变体的研究论文。