整数规划求解有向图最短路径问题环路解决方法
在有向图中,经常遇到给定起点和终点以及必经点,选择一条权重最小的路径这样的问题。这种问题可以看做是旅行商问题(tsp)的变种,tsp问题是一种组合爆炸问题,当规模变大时,时间耗费十分巨大。
在数学上tsp可以使用整数规划求解,通过求解最小值问题得出需要的路径, 其正确性通过添加约束来保证的。
图问题不可避免的遇到环路问题,解决环路问题在规模比较小的时候,可以通过遍历图中所有节点,寻找出所有环路,对环路添加约束,进行求解,此方法一定能够得到最优解。但是随着图的规模变大,不可能把所有环路全部得出。
问题描述
给定一个带权有向图,起点,终点和必经节点子集,寻找从起点到终点的一条最短路径,此路经必须经过必经节点子集,必经节点子集部分顺序。
求解方法
整数规划,第三方库lpsolve
数学描述
设有向边为{
x0 ,x1 ,x2 ,... ,xn }, 权重为{w0 ,w1 ,w2 ,... ,wn }
min∑ixi∗wi
s.t.
xbeginoutdegree=1 xbeginindegree=0 xendoutdegree=0 xendindegree=1 xnecessitynodeoutdegree=1 xnecessitynodeindegree=1 xnon−necessitynodeoutdegree<=1 xnon−necessitynodeindegree<=1
环路问题
对于寻路问题不可避免的存在环路,由于以上约束只是充分条件,环路的约束未添加,当使用整数规划求解最小值,其解空间中很有可能得到带有环路
tsp要求所有节点必须经过,其去环约束是:将环路所在的子集中所有对外节点的入和对外节点的出都大于等于1
在此问题中可以借鉴tsp环路解决方案。此方案的等价方案是:
构成环路的所有边的数量小于等于边数量-1,即构成环路的边不能同时存在
以上是针对环路添加的约束,如果运行时间 不限制,以上破环方法总能找到最优解。
考虑到运行时间受限时,以上算法去环后,下一个环路很有可能就在上一个环路附近加入一个点构成新的环路,而通路节点不变,若给通路也加入约束时,就可以进一步缩小解空间,通路约束可以添加为:
通路中所有边的数量小于边数量-1,即每次都要在通路中加入新的节点
通过以上约束,将会减小解空间,加快收敛速度,针对环路不是很多的情况运行时间都在1s内,就可以求出最优路径。
- 然而,当环路中小环路比较多时,同构以上约束同样很难在段时间内求解出最优解,需要进一步缩小解空间,其思路可以是:
尽量多的利用环路的先验知识,尽可能多的破除环路,同理,尽量多的利用通路的先验知识,破除尽量多的不可能的通路。
当环路附近有很多小环路:
当通路附近有许多小通路:
针对以上情况可以采取一下策略:
- 用整数规划求解出带有环路的解;
- 加入环路约束和通路约束;
- 遍历环路节点附近的节点,如果可以和环路构成环路,添加约束;
- 遍历通路附近的节点,如能构成通路,加入约束。
以上策略可用于破除环路和通路附近的小环和小通路。防止下一次求解在原地构成环路,但是其遍历也是非常耗时的操作,需要衡量时间,选择遍历层数。
在程序运行过程中,最耗时的是lp求解部分,若能减少lp求解次数,能够极大地提高收敛速度,而减少lp求解次数,可以在预处理时就,加入一些环路约束,其过程如下:
对起点,终点和必经节点进行一定层数的遍历,若有环路存在,就加入到约束中,在程序中试过7层遍历,前提是遍历时间复杂度是
O(n) ,耗时很短,若在7层以上时,其耗时的代价就不会取得好的效果。
以上添加的约束基本上就包含了所有的环路优化策略,但是当环路如下图所示时,整数规划将会失去其求解优势,尤其是权重都为0,或很小的值时,还是暴力搜索,收敛速度快。
以上仅为个人见解,欢迎指正。