1最短路径问题之原始问题
1.1问题描述
在A00与A40之间确定一条路径它们之间的距离最短,即求A00到A40的最短距离。
1.2解决思路
(1) 要计算A00到A40的最短距离mindist(4,0),可转换为计算A00分别到A30和A31的最短距离mindist(3,0)和mindist(3,1),于是mindist(4, 0)=min{mindist(3,0)+5, mindist(3,1)+2}
(2) 以计算mindist(3,0)为例,mindist(3,1)计算类似。
要计算A00到A30的最短距离mindist(3,0),可转换为计算A00分别到A20、A21和A22的最短距离mindist(2,0)、mindist(2,1)和mindist(2,2),于是mindist(3,0)=min{mindist(2,0)+3, mindist(2,1)+6, mindist(2,2)+8}
(3) 以计算mindist(2,0)为例,mindist(2,1)和mindist(2,2)计算类似。
要计算A00到A20的最短距离mindist(2,0),可转换为计算A00分别到A10、A11和12的最短距离mindist(1,0)、mindist(1,1)和mindist(1,2),于是mindist(2,0)=min{mindist(1,0)+12, mindist(1,1)+6, mindist(1,2)+13}
(4) 以计算mindist(1,0)为例,mindist(1,1)和mindist(1,2)计算类似。
靠,还计算个毛,mindist(1,0)=2
可见,以上问题的核心公式为:
其中,trandist(x, i, j)和mindist(0, 0)已知且mindist(0, 0)=0。
2最短路径问题之扩展问题
2.1问题描述
在A0列与A4列之间确定一条路径使得它们之间的距离最短,即求A0列到A4列的最短距离。
2.2解决思路
虚拟出A-10与A50,然后按“最短路径问题之原始问题”来处理。其中,虚线上的trandist全为0,mindist(-1,0)=0。
2.3由背包问题反推最短路径问题的决策变量、转移代价、状态变量和状态转移方程
最短路径问题中的决策变量di应为从Aij到A(i-1)列时路径的选择,若将Aij到A(i-1)列时的四条路径依次编号为0, 1, 2, 3,则决策变量di可取值为0, 1, 2, 3。每条路径长度就是相应的决策变量对应的转移代价。最短距离问题中的状态变量和状态转换方程的作用被弱化(或者说根本没有用),因为决策变量并不受任何限制。
30-m背包问题
3.1问题描述
[1]有n=4组物品并从1~4编组;[2]每组有m=2种物品并从1~2编号;[3]第i组的第j号物品重wij;[4]第i组的第j号物品值cij;[5]有一个背包,可负重t;[6]现按组依次取物品,每组最多取1种物品,问在背包不超载的情况下取哪些组的哪些编号的物品才能使背包内的物品价值最大。
说明:若某组没有4种物品,例如,只有2种物品,则将编号为2和3的物品的重量和价值都设置为0即可。
3.2解决思路
根据题目可知,一共要操作4次,每次取哪种物品就是决策变量di,可取值为0, 1, 2。0表示一件也不取。相应物品编号的物品的价值就是相应的决策变量对应的转移代价。
如上图所示,可转换为与最短路径相似的求解过程。其中,A-10和A50是虚拟出来的。
与最短路径不同的地方之一是这里要计算的是A-10和A50之间的最大距离。
与最短路径不同的地方之二是决策变量不能任意取值,而受制于背包的剩余负重(状态变量),剩余负重小于物品的重量时则不能取此物品。背包前后两次剩余负重的关系就是状态转移方程。如第4次取了重x的物品,则第3次取时剩余负重为t-x。此时,若t-x小于第3组某件物品的重量,则不能取这件物品。
4立体匹配之线扫描
4.1问题描述
与最短路径问题之扩展问题相同
4.2解决思路
5立体匹配之动态归划
相当于添加了限制条件的线扫描算法。限制条件如下:
(1)若当前状态为(x, i,
0),则前一状态为(x-1,
i, 0)或(x-1, i-1, 1)或(x-1, i, 2)
(2)若当前状态为(x, i,
1),则前一状态为(x-1,
i, 0)或(x-1, i-1, 1)
(3)若当前状态为(x, i,
2),则前一状态为(x,
i+1, 0)或(x, i+1, 2)
其中:x表示当前点,x-1表示前一点,i表示视差,0表示点左右图像中可见,1表示点仅左图像中可见,2表示点仅右图像中可见。可形象表达为:
其中,m=0、l=1、r=2分别表示前一点的三种状态,即在左右图像中可见,仅在左图像中可见,仅在右图像中可见。M=0、L=1、R=2表示当前点三种状态。而线段两端点间的位置关系,表示当前状态和前一状态的位置关系。水平表示前一状态是来自前一列的值相等的视差,对角表示前一状态是来自前一列的值小于1的视差,竖起表示前一状态是来自同一列的值高于1的视差。
尽管表面上看,SO是在cols*channels的二维矩阵上动态归划,DP是在cols*channels*3的三维矩阵上动态归划,但由于DP对前一状态的严格限制。所以,实际上,DP的时效性远高于SO。
假设最大视差为d。对于SO算法,每一视差的前置结点数是d,即要运算d次。而对于DP算法,每一状态的前置状态为(3+2+2)/3=2.33,每一视差又分3个状态,所以对每个视差总共要运算2.33*3=7次。通常d都是几十,所以DP的速度是SO是好几倍。
DP的相关计算公式如下:
公式中的cur表示当前的状态,pre表示之前的状态。