整数规划求解有向图最短路径问题环路解决方法

整数规划求解有向图最短路径问题环路解决方法


在有向图中,经常遇到给定起点和终点以及必经点,选择一条权重最小的路径这样的问题。这种问题可以看做是旅行商问题(tsp)的变种,tsp问题是一种组合爆炸问题,当规模变大时,时间耗费十分巨大。

在数学上tsp可以使用整数规划求解,通过求解最小值问题得出需要的路径, 其正确性通过添加约束来保证的。

图问题不可避免的遇到环路问题,解决环路问题在规模比较小的时候,可以通过遍历图中所有节点,寻找出所有环路,对环路添加约束,进行求解,此方法一定能够得到最优解。但是随着图的规模变大,不可能把所有环路全部得出。

问题描述

给定一个带权有向图,起点,终点和必经节点子集,寻找从起点到终点的一条最短路径,此路经必须经过必经节点子集,必经节点子集部分顺序。

求解方法

整数规划,第三方库lpsolve

数学描述

设有向边为{ x0 , x1 , x2 , ... , xn }, 权重为{ w0 , w1 , w2 , ... , wn }

minixiwi

s.t.

xbeginoutdegree=1

xbeginindegree=0

xendoutdegree=0

xendindegree=1

xnecessitynodeoutdegree=1

xnecessitynodeindegree=1

xnonnecessitynodeoutdegree<=1

xnonnecessitynodeindegree<=1

环路问题

  1. 对于寻路问题不可避免的存在环路,由于以上约束只是充分条件,环路的约束未添加,当使用整数规划求解最小值,其解空间中很有可能得到带有环路
    tsp要求所有节点必须经过,其去环约束是:

    将环路所在的子集中所有对外节点的入和对外节点的出都大于等于1

  2. 在此问题中可以借鉴tsp环路解决方案。此方案的等价方案是:

    构成环路的所有边的数量小于等于边数量-1,即构成环路的边不能同时存在

  3. 以上是针对环路添加的约束,如果运行时间 不限制,以上破环方法总能找到最优解。

考虑到运行时间受限时,以上算法去环后,下一个环路很有可能就在上一个环路附近加入一个点构成新的环路,而通路节点不变,若给通路也加入约束时,就可以进一步缩小解空间,通路约束可以添加为:

通路中所有边的数量小于边数量-1,即每次都要在通路中加入新的节点

通过以上约束,将会减小解空间,加快收敛速度,针对环路不是很多的情况运行时间都在1s内,就可以求出最优路径。

  1. 然而,当环路中小环路比较多时,同构以上约束同样很难在段时间内求解出最优解,需要进一步缩小解空间,其思路可以是:

尽量多的利用环路的先验知识,尽可能多的破除环路,同理,尽量多的利用通路的先验知识,破除尽量多的不可能的通路。

当环路附近有很多小环路:

整数规划求解有向图最短路径问题环路解决方法_第1张图片

当通路附近有许多小通路:

整数规划求解有向图最短路径问题环路解决方法_第2张图片

针对以上情况可以采取一下策略:

  1. 用整数规划求解出带有环路的解;
  2. 加入环路约束和通路约束;
  3. 遍历环路节点附近的节点,如果可以和环路构成环路,添加约束;
  4. 遍历通路附近的节点,如能构成通路,加入约束。

以上策略可用于破除环路和通路附近的小环和小通路。防止下一次求解在原地构成环路,但是其遍历也是非常耗时的操作,需要衡量时间,选择遍历层数。

在程序运行过程中,最耗时的是lp求解部分,若能减少lp求解次数,能够极大地提高收敛速度,而减少lp求解次数,可以在预处理时就,加入一些环路约束,其过程如下:

对起点,终点和必经节点进行一定层数的遍历,若有环路存在,就加入到约束中,在程序中试过7层遍历,前提是遍历时间复杂度是 O(n) ,耗时很短,若在7层以上时,其耗时的代价就不会取得好的效果。
整数规划求解有向图最短路径问题环路解决方法_第3张图片


以上添加的约束基本上就包含了所有的环路优化策略,但是当环路如下图所示时,整数规划将会失去其求解优势,尤其是权重都为0,或很小的值时,还是暴力搜索,收敛速度快。
整数规划求解有向图最短路径问题环路解决方法_第4张图片


以上仅为个人见解,欢迎指正。

你可能感兴趣的:(算法)