您的位置首页百科问答

高分:网络流问题

高分:网络流问题

一、引言网络流算法是一种高效实用的算法,相对于其它图论算法来说,它的模型更加复杂,编程复杂度也更高。但是它综合了图论中的其它一些算法(如最短路径、宽度搜索算法),因而适用范围也更广,经常能够很好地解决一些搜索与动态规划无法解决的非np问题。网络流在具体问题中的应用,最具挑战性的部分是模型的构造,它没用现成的模式可以套用,需要我们对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),根据具体的问题发挥我们的创造性。一道问题经常可以建立多种模型,不同的模型对问题的解决效率的影响也是不同的,本文通过实例探讨如何确定适当的模型,提高网络流算法的效率。二、网络流算法时间效率当我们确定问题可以使用最大流算法求解后,就根据常用的ford-fulkerson标号法求解;而最小(大)费用最大流问题也可用类似标号法的对偶算法解题。ford-fulkerson标号法的运行时间为o(ve2),对偶法求最小费用流的运行时间大约为o(v3e2)。显然,影响网络流算法的时间效率的因素主要是网络中顶点的数目与边的数目。这二个因素之间不是相互独立的,而是相互联系,矛盾而统一的。在构造网络模型中,有时,实现了某个因素的优化,另外一个因素也随之得到了优化;有时,实现某个因素的优化却要以增大另一因素为代价。因此,我们橘春在具体问题的解决中,要坚持"全局观",实现二者的平衡。三、模型的优化与选择(一)减少模型的顶点数与边数,优化模型如果能根据问题的一些特殊性质,减少网络模型中的顶点的数目和边的数目,则可以大大提高算法的效率。例1:最少皇后控制在国际象棋中,皇后能向八个方向攻击(如图1(a)所示,图中黑点格子为皇后的位置,标有k的格子为皇后可攻击到的格子)。现在给定一个m*n(n、m均不大于于50)的棋盘,棋盘上某些格子有宴答障碍。每个皇后被放置在无障碍的格子中,它就控制了这个格子,除此,它可以从它能攻击到的最多8个格子中选一个格子来控制,如图1(b)所示,标号为1的格子被一个皇后所控制。请你编一程序,计算出至少有多少个皇后才能完全控制整个棋盘。 图1(a) 图1(b)输入格式:输入文件的第一行有两个整数m和n,表示棋盘的行数与列数。接下来m行n列为一个字符矩阵,用''.''号表示空白的格子,''x''表示有障碍的格子。输出格式:输出文件的第一行仅有一个数s,表示需要皇后的数目。sample input3 4x...x.x..x..sample ouput5问题分析]如果本问题用简单的搜索来做,由于题目给的棋盘很大,搜索算法很难在短时间内出解。由于一个皇后在棋盘最多只能控制两个格子,因此最少需要的皇后数目的下界为[n*m/2]。要使得皇后数目最少,必定是尽量多的皇后控制两个格子。如果我们在每两个能相互攻击到的格子之间加上一条有向弧,则问题很类似于二分图的最大匹配问题。[模型一]1. 将每个非障碍的格子按行优先编号(0~m*n-1)。2. 将上述的每个格子i折成两个格子i''和i'''',作为网络模型中的顶点。3. 若格子i可以攻击到格子j且i v(x, y, 1),c1 = maxint,w1 = 0。u e2 = v(x, y, 0) -> v(x, y, 1),c2 = 1,w2 = -1(这里要求(x, y)必须是矿石) u e3 = v(x, y, 1) -> v(x'', y'', 0),c3 = maxint,w3 = 0.其中x''=x+1 y''=y 或x''=x y''=y+1,1 <= x'' <= maxx,1 <= y'' <= maxy,且(x'' y'')非障碍。从以上模型中可以看出,在构造的过程中,将地图上的一个点"拆"成了网络的两个节点。添加e1型边使得每个点可以被多次访问,而添加e2型边使得某点上的矿石对于这个网络,从s到t的一条路径可以看作是一辆探测车的行动路线。路径费用就是探测车搜集到的矿石的数目。对于网络g求流量为numberofvehicles的固定最小费用流,可以得到问题的解。[模型二]事实上,如果我们只考虑这numberofvehicles辆车中每辆车分别依次装上哪些矿石。则每辆车经过的矿石就是一条流,因此我们以网格中的矿石为网络的顶点建立以下的网络流模型。1. 将网格中的每个起点(网格左上角)能到达,且能从它能到达终点(右下角)的矿石 (x,y)点分成左点(x,y,0)和右点(x,y,1)两个点,并添加源点s和汇点t。2. 在以上顶点中添加以下五种类型的边e1,e2,e3,相应地容量和费用分别记为c1、c2、c3以及w1、w2、w3:u e1 = v(x, y, 0) -> v(x, y, 1),c1 = 1,w1 = -1。u e2 = v(x, y, 1) -> v(x'', y'', 0),c2 = 1,w2 = 0(矿石点(x, y)可到达矿石点(x'',y''))。u e3 = s -> v(x, y, 0),c3 = 1,w3 = 0。u e4 = v(x, y, 1)->t,c4 = 1,w4 = 0。u e5=s->t,c5=maxint,w5=0。由于每个石块被折成两个点,且容量为1,就保证了每个石块只被取走一次,同时取走一块石块就得到-1的费用。因此对以上模型,我们求流量为numberofvehicles的最小费用流,就可得到解。[两种模型的比较]1.模型一以网格为顶点,模型二以矿石为顶点,因此在顶点个数上模型二明显优于模型一,对于一些矿石比较稀疏,而网格又比较大的数据,模型二的效率要比模型一来得高。且只要矿石的个数不超过一定数目,模型二可以处理p,q很大的数据,而模型一却不行。2.模型一中边的数目最多为3*p*q,而模型二中边的数目最坏情况下大约为p*q*(p+1)*(q+1)/4-p*q。因此在这个问题中,若对于一些矿石比较密集且网格又比较大的数据,模型二的边数将大大超过模型一,从而使得时间效率大大低于模型一。下面是网格中都是矿石的情况比较(piii700/128m ,bp7.0保护模式):numberofvehicles=10 模型一 模型二通过以上数据,可知对于p,q不超过60的情况,模型一都能在10秒内出解。而模型二则对于p、q=30的最坏情况下速度就很慢了,且p、q超过30后就出现内存溢出情况,而无法解决。因此,对于本题,以上两种模型各有利弊,我们可根据测试数据中矿石稀疏程度来决定建立什么样的模型。若矿石比较稀疏,则可以考虑用建立如模型二的网络模型;若矿石比较密集则建立模型一所示网络模型。然后,再应用求最小费用最大流算法求解。对于p,q>60,且矿石比较多情况下,两种模型的网络流算法都无法求解。在实际的应用中问题经常都只要求近似解,此时还可用综合一些其它算法来求解。四、结束语 综上所述,网络流算法中模型的优化是网络流算法提高效率的根本。我们要根据实际问题,从减少顶点及边的角度综合考虑如何对模型进行优化,选择适当的模型,以提高算法的效率。对于有些题目,解题的各种模型各有优劣时,还可通过程序自动分析测试数据,以决定何种情况下采用何种模型,充分发挥各种模型的优点,以达到优化程序效率的目的。