博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
差分约束系统
阅读量:5037 次
发布时间:2019-06-12

本文共 1580 字,大约阅读时间需要 5 分钟。

1.问题定义

    差分约束系统属于线性规划问题。在一个差分约束系统中,线性规划矩阵A的每一行包含一个1和一个-1,A的所有其他元素都为0。因此,由Ax≤b给出的约束条件是m个差分约束集合,其中包含n个未知元。每个约束条件为如下形式的简单线性不等式:xj-xi≤bk(1≤i, j≤n,1≤k≤m)。如下图5维向量x满足8个不等式的差分约束,我们可以把未知量x1,x2,x3,x4,x5化为如下8个不等式:

                             

我们可以发现当x=(x1,x2,…,xn)是差分约束系统Ax≤b的一个解,d为任意常数。则x+d=(x1+d,x2+d,…,xn+d)也是该系统Ax≤b的一个解。因此这个不等式组要么无解,要么就有无数组解。

 

2.解决方案

    求解差分约束系统,可以转化成图论的单源最短路径问题。观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v] <= d[u] + w[u,v],即d[v] - d[u] <= w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边E(i,j),边权为bk。求单源最短路径,必须有一个源点,然后再求这个源点到其他所有点的最短路径,我们可以增加一个原点s与所有其他点相连,边权均为0,xi - x0 <= 0。上图中的不等式于是转化为下图中的有向图:

    下面介绍解决差分约束问题的方法:Bellman-Ford算法。Bellman-Ford算法是用来解决有向图中存在负权边的单源最短路径问题的。

①将除源点外的所有顶点的最短距离估计值,即 d[v] = +∞, d[s] = 0;

②反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;

③判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解;否则算法返回true,问题有解,并且从源点可到达的顶点v的最短距离保存在d[v]中。

算法伪代码如下:

Bellman-Ford()

{
   for each vertex v ∈ G do             //初始化

         d[v] = +∞

   d[s] = 0

  

   for i = 1 to n-1 do

      for each edge(u, v) ∈ G do

         if d[v] > d[u] + w(u, v) then   //松弛操作

            d[v] = d[u] + w(u, v)

 

   for each edge(u, v) ∈ G do

       if d[v] > d[u] + w(u, v) then    //检查是否存在回路

          return false

   return true

 }

图中任意一条最短路径既不能包含负权回路,也不会包含正权回路,所以最多包含n-1条边,从源点s出发每进行一遍松弛操作时,多生成了了从s出发层次为1的树,而最短边路径最多为n-1,故只需要循环n-1次。最后计算的d[v]即为差分不等式的一组解。

 

3.算法优化

    Bellman-Ford算法的时间复杂度为O(VE),一种方法是我们引入SPFA算法作为其优化算法,也就是进行队列优化,初始化时将源s加入队列每次从队列中取出一个元素,并且对所有与之相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队,直到队列为空时SPFA算法结束。SFPA的期望时间复杂度为O(KE)[己考证,证明不严密,最坏情况和Dijkstra差不多],期望的常数K一般不会超过2。另一种优化是Yen优化,将图中的点随机的进行标记序号v1,v2,vi...,则分为两类边集合:                                    

进行松驰时,先按vi的升序只找Ef边进行松弛,然后再按vi的降序只对Eb边进行松弛,可以优化为常数时间,复杂度仍为O(VE)[]。

转载于:https://www.cnblogs.com/PJQOOO/p/4330405.html

你可能感兴趣的文章
区块链入门教程
查看>>
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
生成指定位数随机数的方法
查看>>
Essential C++学习笔记
查看>>
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>
数据分析 -- 白话一下什么是决策树模型(转载)
查看>>
Java SPI机制原理和使用场景
查看>>
web前端java script学习2017.7.18
查看>>
删除TXPlatform
查看>>
LaTex:图片排版
查看>>
并发访问超时的问题可能性(引用)
查看>>
中小团队基于Docker的Devops实践
查看>>
利用python打开摄像头并保存
查看>>
System函数的使用说明
查看>>