航班预定系统下路径查询的几个问题求解
其实这个是大二下学期的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
直到找到为止