数据库语句实现最短路径计算(理论)
很久以前做的,只做记录,sql语句就不放了,只记录想法。
实现需要:
数据库需要记录所有路径的转折点的坐标XY。
(什么数据库理论上都可以做到,以前是用SQL Server 2005实现)。
实现理论:
2点之间距离最短,2点之间有很多路径的坐标点C1到CN,路径之间的点与起始点A和终点B连成的线夹角最小的点C2(需要用到三角函数),为最短距离所需要的点。
查到夹角最小的点C2之后,再把C2做为起始点A,再度以夹角最小的点为最短距离所需要的点得出新的C3,如果循环可以得出最短路径。
但是,这个还不算完,因为如果存在死胡同,就需要再往回走。这样就需要避免,而这是计算最短距离最麻烦的地方。
我有3种解决办法:
一、数据库存入死胡同的点可以查询的点的范围,(需要记录U型区域内点可以查询的点的范围,存入那个点坐标对应的字段当中,维护略麻烦,但是代码相对简单)。
需要定义一个变量记录上一个点,走到死胡同就没有点可以查询,需要往回走,重复就删除,继续删除至之前走进死胡同的分叉点,继续往前走。这样就可以实现。
二、把所以U型之类的区域的点,不列入查询范围,在数据库表中定义坐标类型,定义是属于U型区域坐标。这样就不会进入死胡同。(数据库中只需标记这个点处于U型区域内)
但是如果起始点A或终点B在U型区域内,就需要特殊处理,这就需要U型区域周围的点坐标都是要在数据库中记录。
假设[起始点A在U型区域内,B不在]查询区域外围的点起始点(假设有4个外网点)A1、A2、A3、A4中哪一个点到B点的距离最短,就取哪一个点A?,然后用它以上面的方式得出最短距离的所有点。而那U型区域内再以同样的方式得出区域内的最短距离的所有点。
如果[起始点A和B在U型区域内],就需要同时查询外围点与点之间的最短距离的,得出距离最短的2个点,然后再以同样的方式查询到所有的点。
但是,我觉得第一种方式维护麻烦,代码简单;第二种方式维护简单,但是代码复杂。
由此我又想出第三种方式。
三、综合了第一种和第二种方式的优点。数据库坐标点多2个字段描述,1个字段表示它处在U型区域内,表示坐标类型;而另一个字段表示它处在哪一个区域内,表示不同区域A1B2C2D1E2等等。(这个字段还可以拆分成2个字段,一般无必要)
这样代码就不需要第二种方式,就可以以第一种方式执行。因为,在查询的时候就可以以这2个字段为条件,迅速查出最短路径所有的坐标点。
浙公网安备 33010602011771号