kiddcdC

导航

数据库语句实现最短路径计算(理论)

很久以前做的,只做记录,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个字段为条件,迅速查出最短路径所有的坐标点。

 

posted on 2017-01-03 16:28  kiddcdC  阅读(251)  评论(0)    收藏  举报