您的位置:首页 > 其它

邻接矩阵计算最短路径问题的几个发现

2009-06-12 22:42 363 查看
航班预定系统下路径查询的几个问题求解

其实这个是大二下学期的SQL课设上面的我需要解决的一个问题.

1.邻接矩阵计算最短路径问题的几个发现

1.1邻接矩阵定义。

只能定义为

a b c d e...

a

b

c

d

e

.

.

.

这样的形式,其中行代表出发点,列代表目标点;或列代表出发点,行代表目标点。我不妨约定行代表出发点,列代表

目标点此矩阵为A

而不能定义为。

a b c d e...

a

c

b

d

e

.

.

.

当然也可以定义为这样的形式

acbde...

a

c

b

d

e

.

.

在矩阵性质中上面的矩阵等于-A

这样的形式。

证明:(反证法)

还是用临接表

原来矩阵定义为

A

a b c d

a1 1 2 0

b1 1 1 1

c0 1 2 1

d2 0 1 1

A‘

a b c d

a1010

c0110

b0011

d1001

计算一次的路径数。

A*A

a b c d

a1 1 2 0

b1 1 1 1

c0 1 2 1

d2 0 1 1

而A'*A’

a b c d

a1 0 1 1

c0 1 2 1

b0 1 2 2

d2 0 1 1

也许我的运算的对应的函数错了。但是出现2的次数就不一样。如果重新修订运算无疑将增大复杂度。

定义的两个方法。

路径的最短和最长值

在dijkstra算法最短最长定义为分别为0,+∞。这个计定义为最大值比如32767,2147483648。运算的时候溢出即使是

最大两个数相加溢出。也小于0.可以直接舍弃。

在线性代数书上面为0和0其中表示不可到达。这里修正为。初步的0.0001表示为高阶无穷小也可以根据实际情况调整。

计算的时候0表示不可路由,不计算。(这样每个都需要判断。增加了系统开销)。0.0001可以最后规整的时候舍去。

剩下的路径为长度值。

计算的时候假设原始矩阵为A。

里面任意一点元素aij=min(ai1+a1j,ai2+a2j,....,ain+anj) i表示所在和行,j表示所在的列。

原始计算方法:

An=A(n-1)*A①

优化计算方法:

An=A(n-1)*A(n-1)②

其中时间复杂度方面

①/②=n/log2(n)

关于min函数的实现。直接排序。如果采用dijkstra定义法在排序完成后从数组a里面从a[1]开始向后查找.第一个大于零

的输出就可以了.如果是采用线代书的定义法则输出第一个.

终止条件:

完备性终止

出现An=A(n-1)即终止计算。

非完备性终止:

1对结果有明确了解,出现期望节点即终止。

2对结果期望。出现或者小于期望节点即终止。

3对迭代次数有规定。达到迭代次数即终止。

4有近似解。出现近似解即终止。

5规定最小迭代次数。达到后监控。一旦变化小于预计值则终止。(这个至少是个偏导思想的分析或者线代里面的我无从

下手.)

对于时间限制的计算.

时间的可能这个模型就不成立了.

时间段T内.有航班a1->a2->a3 或者b1->b2->b3 这个要先计算时间.在时间不冲突的情况下再查找路线.否则目前这个收

敛性太强.都是最优解.忽略了局部优解.

对于关键路径的计算.

从武汉飞北京.没有直达飞机.我要去天津办事.那就是武汉-天津-北京.分段计算.

局部解问题

这个没有局部解.任何过程不取最小的都是局部优解.

无向连通图的计算.

由于是无向连通图矩阵是对称矩阵.可以使用对称矩阵变换公式解决.变换过程为沿主对角线对称.类似镜面对称.

举例

a11 a12 a13

a21 a22 a23

a31 a32 a33

约定为上三角阵

a11 a12 a13

a22 a23

a33

要计算a12的最短路径

a12=min(a11+a12,a12+a22,a13+a23)

其中a23为原图的a32.

即如果a[ m][n ]不存在则取 a[n ][m ]

最后路径算出来了.用中点法查找.每次运算的二维数组都存下来.可以用三维数组.....第三维记录次数

后开始找

dik+dkj=dij 记录k的位置

表示 从i到k到j.从此挨个查找

i k1 k k2 j

直到找到为止
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: