『壹』 幫我解釋下網路流
必須知識:最短路徑問題
1.Dijkstra
適用於滿足所有權系數大於等於0(lij≥0)的網路最短路問題,能求出起點v1到所有其他點vj的最短距離;
樸素的Dijkstra演算法復雜度為O(N^2),堆實現的Dijkstra復雜度為O(NlogN).
2.bellman-ford
適用於有負權系數,但無負迴路的有向或無向網路的最短路問題,能求出起點v1到所有其它點 vj的最短距離。bellman-ford演算法復雜度為O(V*E)。
3.Floyed
適用於有負權系數,可以求出圖上任意兩點之間的最短路徑。DP思想的演算法,時間復雜度為O(N^3);
for ( k= 1; k<= n; k++)
for ( i= 1; i<= n; i++)
if (graph[i][k]!=INF)
for ( j= 1; j<= n; j++)
if (graph[k][j]!=INF && graph[i][k]+graph[k][j]< graph[i][j])
graph[i][j]= graph[i][k]+ graph[k][j];
NO.1 s-t最大流
兩大類演算法
1.增廣路演算法
Ford-Fulkerson演算法: 殘留網路中尋找增加路徑
STEP0:置初始可行流。
STEP1:構造原網路的殘量網路,在殘量網路中找s-t有向路。如果沒有,演算法得到最大流結束。否則繼續下一步。
STEP2:依據殘量網路中的s-t有向路寫出對應到原網路中的s-t增廣路。對於增廣路中的前向弧,置s(e)=u(e)- f(e)。對於反向弧,置s(e)=f(e) STEP3:計算crement=min{s(e1),s(e2),…,s(ek)}
STEP4:對於增廣路中的前向弧,令f(e)=f(e)+crement;對於其中的反向弧,令f(e)=f(e)-crement,轉STEP1。
關鍵點:尋找可增廣路。決定了演算法復雜度。
實現:Edmonds-Karp 通過採用了廣度優先的搜索策略得以使其復雜度達到O(V*E^2)。
優化—> Dinic演算法(*)
Dinic演算法的思想是為了減少增廣次數,建立一個輔助網路L,L與原網路G具有相同的節點數,但邊上的容量有所不同,在L上進行增廣,將增廣後的流值回寫到原網路上,再建立當前網路的輔助網路,如此反復,達到最大流。分層的目的是降低尋找增廣路的代價。
演算法的時間復雜度為O(V^2*E)。其中m為弧的數目,是多項式演算法。鄰接表表示圖,空間復雜度為O(V+E)。
2.預流推進演算法
一般性的push-relabel演算法: 時間復雜度達到O(V^2*E)。(*)
relabel-to-front演算法->改進
最高標號預流推進:時間復雜度O(V^2*sqrt(E))
NO2. 最小費用最大流
求解最小費用流的步驟和求最大流的步驟幾乎完全一致,只是在步驟1時選一條非飽和路時,應選代價和最小的路,即最短路。
步驟1. 選定一條總的單位費用最小的路,即要給定最小費用的初始可行流,而不是包含邊數最小的路。
步驟2. 不斷重復求最大流的步驟來進行,直到沒有飽和路存在為止。然後計算每個路的總費用。
和Edmonds-Karp標號演算法幾乎一樣,因為這兩種演算法都使用寬度優先搜索來來尋找增廣路徑,所以復雜度也相同,都是O(V*E^2)。
連續最短路演算法 + 線性規劃對偶性優化的原始對偶演算法(*)
傳說中,沒見過,據說復雜度是O(V^3)
NO3. 有上下屆的最大流和最小流(通過添加點來進行轉化)(*)
NO4. 相關圖論演算法
二分圖最大匹配: 加s和t構造最大流
專用演算法:hungary演算法 O(M*N)
二分圖最佳匹配: 加s和t構造最小費用最大流
專用演算法:KM演算法
樸素的實現方法,時間復雜度為O(n^4)
加上鬆弛函數O(n^3)
最小路徑覆蓋:
頂點數-二分圖的最大匹配
s-t最小邊割集:
最大流最小割定理:最小割等於最大流
普通最小邊割集:
Stoer-Wagner Minimum Cut O(n^3)
二分圖的最大獨立集:
N - 二分圖的最大匹配(POJ monthly)girls and boys
反證法證明
普通圖的最大獨立集是np問題。(*)
『貳』 高分:網路流問題
一、引言
網路流演算法是一種高效實用的演算法,相對於其它圖論演算法來說,它的模型更加復雜,編程復雜度也更高。但是它綜合了圖論中的其它一些演算法(如最短路徑、寬度搜索演算法),因而適用范圍也更廣,經常能夠很好地解決一些搜索與動態規劃無法解決的非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 input
3 4
x...
x.x.
.x..
sample ouput
5
問題分析]
如果本問題用簡單的搜索來做,由於題目給的棋盤很大,搜索演算法很難在短時間內出解。由於一個皇後在棋盤最多隻能控制兩個格子,因此最少需要的皇後數目的下界為[n*m/2]。要使得皇後數目最少,必定是盡量多的皇後控制兩個格子。如果我們在每兩個能相互攻擊到的格子之間加上一條有向弧,則問題很類似於二分圖的最大匹配問題。
[模型一]
1. 將每個非障礙的格子按行優先編號(0~m*n-1)。
2. 將上述的每個格子i折成兩個格子i''和i'''',作為網路模型中的頂點。
3. 若格子i可以攻擊到格子j且i<j,則在模型中頂點i''到j''''之間加上一條有向弧,容量為1。
4. 增加一個源點s,從s點向所有頂點i''添上一條弧;增加一個匯點t,從所有頂點j''''到t添上一條弧,容量均為1。
圖1(b)所示的棋盤,對應的模型為:
圖2
顯然,任一解對應於以上模型的一個最大匹配。且最大匹配中,匹配數必定是偶數。因此至少需要的馬匹數為m*n-障礙數-最大匹配數/2。
[模型二]
如果我們將棋盤塗成黑白相間的格子,則某皇後控制的兩個格子一定是一個是黑格,另一個是白格(如圖3),不妨設這兩個格子中皇後在白格子上。於是,我們將n*m個格子分成兩部分白格與黑格。因此我們可以將模型一優化為:
圖3
1.將棋盤中的所有格子分成兩個部分,對所有的格子進行編號,每個白格與它能攻擊到的黑格之間(障礙除外)添上一條從白格到黑格的弧,構成一個二分圖。
2.增加一個源點s,從s點向所有非障礙的白格添上一條弧;增加一個匯點t,從所有非障礙的黑格到t添上一條弧。
3.設置所有的弧的流量為1。
圖1(b)所示的棋盤,對應的模型為:
圖4
[兩種模型的比較]
顯然,模型二的頂點數與邊數大致是模型一的一半。下面是在bp環境下兩種模型的時間效率比較(p166/32m):
模型一 模型二
可擴展性 不易列印出一種解 容易列印出一種解
模型二正是根據問題的特殊性(即馬的走法),將網格中的格點分成白與黑兩類,且規定馬只能從白格跳到黑格,從而避免將每個格點折分成兩個點,減少模型的頂點數,同時也大大減少了邊的數目。達到了很好的優化效果。
(二)綜合各種模型的優點,智能選擇模型
有時,同一問題的各種模型各有特色,各有利弊。這種情況下,我們就要綜合考慮各種模型的優缺點,根據測試數據智能地選擇問題的模型。
例2火星探測器(ioi97)
有一個登陸艙(pod),里邊裝有許多障礙物探測車(mev),將在火星表面著陸。著陸後,探測車離開登陸艙向相距不遠的先期到達的傳送器(transmitter)移動,mev一邊移動,一邊採集岩石(rock)標品,岩石由第一個訪問到它的mev所採集,每塊岩石只能被採集一次。但是這之後,其他mev可以從該處通過。探測車mev不能通過有障礙的地面。
本題限定探測車mev只能沿著格子向南或向東從登陸處向傳送器transmitter移動,允許多個探測車mev在同一時間占據同一位置。
任務:計算出所有探測車的移動途徑,使其送到傳送器的岩石標本的數量最多,且使得所有的探測車都必須到達傳送器。
輸入:
火星表面上的登陸艙pod和傳送器之間的位置用網路p和q表示,登陸艙pod的位置為(1,1)點,傳送器的位置在(p,q)點。
火星上的不同表面用三種不同的數字元號來表示:
0代表平坦無障礙
1代表障礙
2代表石塊。
輸入文件的組成如下:
numberofvehicles
p
q
(x1y1)(x2y1)(x3,y1)…(xp-1y1)(xpy1)
(x1y2)(x2y2)(x3,y2)…(xp-1y1)(xpy2)
(x1y3)(x2y3)(x3,y3)…(xp-1y3)(xpy3)
…
(x1yq-1)(x2yq-1)(x3,yq-1)…(xp-1yq-1)(xpyq-1)
(x1yq)(x2yq)(x3,yq)…(xp-1yq)(xpyq)
p和q是網路的大小;numberofvehicles是小於1000的整數,表示由登陸艙pod所開出的探測車的個數。共有q行數據,每行表示火星表面的一組數據,p和q都不超過128。
[模型一]
很自然我們以登陸艙的位置為源點,傳送器的位置為匯點。同時某塊岩石由第一個訪問到它的mev所採集,每塊岩石只能被採集一次。但是這之後,其他mev可以從該處通過,且允許多個探測車mev在同一時間占據同一位置。因此我們將地圖中的每個點分成兩個點,即(x,y)à(x,y,0)和(x,y,1)。具體的描述一個火星地圖的網路模型構造如下:
1. 將網格中的每個非障礙點分成(x,y)兩個點(x,y,0)和(x,y,1),其中源點s = v(1, 1, 0),匯點t = v(maxx, maxy, 1)。
2. 在以上頂點中添加以下三種類型的邊e1,e2,e3,相應地容量和費用分別記為c1、c2、c3以及w1、w2、w3:
u e1 = v(x, y, 0) -> 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,且礦石比較多情況下,兩種模型的網路流演算法都無法求解。在實際的應用中問題經常都只要求近似解,此時還可用綜合一些其它演算法來求解。
四、結束語
綜上所述,網路流演算法中模型的優化是網路流演算法提高效率的根本。我們要根據實際問題,從減少頂點及邊的角度綜合考慮如何對模型進行優化,選擇適當的模型,以提高演算法的效率。對於有些題目,解題的各種模型各有優劣時,還可通過程序自動分析測試數據,以決定何種情況下採用何種模型,充分發揮各種模型的優點,以達到優化程序效率的目的。
『叄』 網路流的最大流演算法
1、augment path,直譯為「增廣路徑」,其思想大致如下:
原有網路為G,設有一輔助圖G',其定義為V(G') = V(G),E(G')初始值(也就是容量)與E(G)相同。每次操作時從Source點搜索出一條到Sink點的路徑,然後將該路徑上所有的容量減去該路徑上容量的最小值,然後對路徑上每一條邊<u,v>添加或擴大反方向的容量,大小就是剛才減去的容量。一直到沒有路為止。此時輔助圖上的正向流就是最大流。
我們很容易覺得這個演算法會陷入死循環,但事實上不是這樣的。我們只需要注意到每次網路中由Source到Sink的流都增加了,若容量都是整數,則這個演算法必然會結束。
尋找通路的時候可以用DFS,BFS最短路等演算法。就這兩者來說,BFS要比DFS快得多,但是編碼量也會相應上一個數量級。
增廣路方法可以解決最大流問題,然而它有一個不可避免的缺陷,就是在極端情況下每次只能將流擴大1(假設容量、流為整數),這樣會造成性能上的很大問題,解決這個問題有一個復雜得多的演算法,就是預推進演算法。
2、push label,直譯為「預推進」演算法。
3、壓入與重標記(Push-Relabel)演算法
除了用各種方法在剩餘網路中不斷找增廣路(augmenting)的Ford-Fulkerson系的演算法外,還有一種求最大流的演算法被稱為壓入與重標記(Push-Relabel)演算法。它的基本操作有:壓入,作用於一條邊,將邊的始點的預流盡可能多的壓向終點;重標記,作用於一個點,將它的高度(也就是label)設為所有鄰接點的高度的最小值加一。Push-Relabel系的演算法普遍要比Ford-Fulkerson系的演算法快,但是缺點是相對難以理解。
Relabel-to-Front使用一個鏈表保存溢出頂點,用Discharge操作不斷使溢出頂點不再溢出。Discharge的操作過程是:若找不到可被壓入的臨邊,則重標記,否則對臨邊壓入,直至點不再溢出。演算法的主過程是:首先將源點出發的所有邊充滿,然後將除源和匯外的所有頂點保存在一個鏈表裡,從鏈表頭開始進行Discharge,如果完成後頂點的高度有所增加,則將這個頂點置於鏈表的頭部,對下一個頂點開始Discharge。
Relabel-to-Front演算法的時間復雜度是O(V^3),還有一個叫Highest Label Preflow Push的演算法復雜度據說是O(V^2*E^0.5)。我研究了一下HLPP,感覺它和Relabel-to-Front本質上沒有區別,因為Relabel-to-Front每次前移的都是高度最高的頂點,所以也相當於每次選擇最高的標號進行更新。還有一個感覺也會很好實現的演算法是使用隊列維護溢出頂點,每次對pop出來的頂點discharge,出現了新的溢出頂點時入隊。
Push-Relabel類的演算法有一個名為gap heuristic的優化,就是當存在一個整數0<k<V,沒有任何頂點滿足h[v]=k時,對所有h[v]>k的頂點v做更新,若它小於V+1就置為V+1。
cpp程序: #include<cstdio>#include<cstring>#include<algorithm>#include<queue>#;inttt,kase;intnn,m;intH[45],X[1004],P[1004],flow[1004],tot,cap[1005];intd[45];intS,T;voidadd(intx,inty,intz){P[++tot]=y;X[tot]=H[x];H[x]=tot;flow[tot]=z;cap[tot]=flow[tot];}queue<int>q;boolbfs(){memset(d,0,sizeof(d));d[S]=1;intx;q.push(S);while(!q.empty()){x=q.front();q.pop();for(inti=H[x];i;i=X[i]){if(flow[i]>0&&!d[P[i]]){d[P[i]]=d[x]+1;q.push(P[i]);}}}returnd[T];}intdfs(intx,inta){if(x==T||a==0)returna;intf=a,tmp;for(inti=H[x];i;i=X[i]){if(flow[i]>0&&d[P[i]]==d[x]+1){tmp=dfs(P[i],min(flow[i],a));flow[i]-=tmp;a-=tmp;flow[i^1]+=tmp;if(!a)break;}}if(f==a)d[x]=-1;returnf-a;}intDinic(){intf=0;while(bfs())f+=dfs(S,inf);returnf;}intmain(){/**輸入過程省略**/intmaxflow=Dinic();printf(%d
,maxflow);return0;}
『肆』 求計算方法、演算法分析資料
流體網路演算法綜述
一 引 言
網路理論是拓撲數學分支之一—圖論的重要內容。它是一門既古老而又年輕的科學,在圖論基礎上研究網路一般規律和網路流問題各種優化理論和方法的學科,是運籌網路理論學的一個分支。網路是用節點和邊聯結構成的圖,表示研究諸對象及其相互關系,如鐵路網、電力網和通信網等。網路中的節點代表任何一種流動的起點、運轉點和終點(如車站、港口、城鎮、計算機終端和工程項目的事件等)。在網路中每條邊上賦予某個正數,稱為該邊的權,它可以表示路程、流量、時間和費用等。建立網路的目的都在於把某種規定的物質、能量或信息從某個供應點最優地輸送到另一個需求點去。例如,在管道網路中要以最短的距離、最大的流量和最小的費用把水、石油或天然氣從供應點送到用戶那裡。流體網路理論也在集中空調網路、供水、供氣、供熱網路礦井通風網路等等中有重要的理論應用,流體網路的演算法研究也就有著不可缺少的重要作用。
二 演算法綜述
1 網路分流
1.1網路分流預處理
已知有向流體網路 ,設一虛擬的節點 ,我們把它定義為基點,連接基點和網路源匯點的虛擬分支為:
此時網路變成: , 。分支 對應的流量、流阻和阻力分別用 、 和 表示,並有:
式中, 、 、 分別為包括虛擬節點和虛擬分支在內的網路分支對應的流量、流阻和阻力集合。
有關虛擬分支的主要參數規定如下:
1)流量等於與之相連的網路入邊或出邊的流量;
2)阻力等於基點 的壓能與分支的另一節點 的壓能之差,基點的位置及其壓能值均可任意設置;
3)流阻值的大小按照分支阻力定律計算,但是當虛擬分支阻力是0,而且流阻又位於分母時,流阻取無窮大。
2 流體網路的基本定律
2.1 質量守恆定律
(1)狹義的質量守恆定律(亦稱節點質量守恆定律)
在單位時間內,任一節點流入和流出的流體質量的代數和為零。如果令流出為正、流入為負,則節點質量守恆定律可以寫成:
式中, 和 分別為分支 和 的流體密度;
和 分別為分支 和 的流量;
和 分別是節點 的出邊 和入邊 。
當密度變化可以忽略不計時,上式可寫為:
即流量平衡定律。該定律表明:對網路中的任一節點,流進的流量等於流出的流量。
(2)廣義質量守恆定律
單位時間內,任一有向割集對應的分支流量的代數和等於0。割集流量平衡方程的矩陣表示是:
式中, 為有向割集矩陣及其元素值; 為割集數。
2.2 能量守恆定律
在任一閉合迴路 上所發生的能量轉換的代數和為零。即
式中, 為分支 的阻力,當分支與迴路方向一致時, 取正號, 、當分支與迴路方向相反時, 取負號,仍是 ;
為迴路 上的流體機械動力,如風機、泵等等,當迴路上的動力在迴路內克服阻力做功時, 、反之,如果所屬的動力在迴路內起阻力作用,則有, ;
為迴路 上的自然風壓、火風壓等等,同樣,如果自然風壓、火風壓在迴路中克服阻力做功, 、反之, 。我們把 和 統稱為附加阻力,並記為 。
當迴路上既無流體機械動力又無自然風壓或火風壓時,上式可寫為: ,即阻力平衡定律。該定律表明:在任一迴路上,不同方向的流體,它們的阻力必定相等。
2.3 阻力定律
流體在管路中流動時,其阻力(習慣上也叫壓力損失、能量損失、壓降等等)表達式為
式中, 為分支的阻力值;
為分支的流阻值;
為分支的流量值;
為流態因子,取決於流體的流動狀態,層流時取1,完全紊流取2,過渡狀態取1~2的中間值。
3 網路分流演算法
3.1 網路分流演算法綜述
當流體網路中所有的流阻為已知,並已知網路的總流量、或已知迴路的附加阻力,求所有分支流量的過程叫做網路分流,也稱網路解算。
網路解算可分為:解析法、圖解法、物理相似模擬法、數值方法。數值法屬於近似法,是目前研究分流的主要手段。從計算數學的角度看,數值方法可分為三類:斜量法、迭代法和直接代入法。
3.2 Barczyk法
網路解算的基本方程組如下:
式中, 為分支流量;
為迴路阻力平衡方程,簡記成 ; 為基本關聯矩陣元素;
為基本迴路矩陣元素。
誤差判別式是:
式中, 是流量誤差限; 是阻力誤差限。
如果誤差滿足要求,則解算結束;否則還要繼續進行迭代。
歸納上述分析,Barczyk法的程序流程是:
① 已知: 、 、 、 , ;
② 擬定樹支和余支,並把余支作為基準分支: 、 ;
③ 求迴路矩陣: ;
④ 計算Jacobi矩陣及其逆陣: 、 ;
⑤ 計算阻力矩陣: ;
⑥ 求余支流量修正值矩陣: ;
⑦ 修正余支流量: ;
⑧ 修正樹支流量: ;
⑨ 誤差驗算: ,滿足精度程序結束;否則, ,轉到(4)繼續迭代;
3.2 Cross法
Cross演算法亦稱Scott-Hinsley法。在Barczyk法中,如果迴路選擇的合理,可以使Jacobi矩陣除主對角線外其餘元素為0,即:
上式表明, 個迴路阻力平衡方程中每一個迴路僅含有一個基準分支,顯然當迴路 時,上式會成立,並有:
將 代入上式,有:
如果令 ,則有迴路流量校正值公式為:
式中, 為第 個基本迴路、第 次迭代時的迴路流量修正值, ; 為迭代次數, ; 為基本迴路矩陣第 行,第 列元素值; 為迴路第 列對應的分支流阻; 為迴路第 列對應的分支在第 次迭代時的初始流量值; 為第 個基本迴路的附加阻力。
迴路分支流量校正式為:
上式的第二行是為了加快收斂速度所採取的演算法,也就是用用已經修正過的流量值計算後面迴路的流量修正值。
Cross法程序流程是:
(1) 已知: 、 、 、 , ;
① 擬定樹及余樹: 、 ;
② 擬定基本迴路矩陣: ;
③ 計算迴路流量修正值: ;
④ 修正迴路流量: ;
⑤ 誤差驗算,滿足精度程序結束;否則, ,轉到(4)繼續迭代。
Cross法與Barczyk法的主要區別如表8-1所示。
表8-1 Barczyk法與Cros法的主要區別
方法與內容 Barczy法 Cross法
Jacobi矩陣非主對角線元素 不一定為0 一定為0
流量修正值 每一基準分支都有自己的流量修正值 同一迴路內的分支具有相同的流量修正值
流量修正 基準分支流量修正值只對基準分支進行修正,非基準分支流量根據節點流量守恆定律確定 用同一流量修正值對迴路內的所有分支進行修正
4分流演算法中的一些具體問題
4.1 基準分支的擬定與迭代處理
以 為權對分支進行排序,將帶有附加阻力的分支排在最後,然後找最小樹,將余支作為基準分支,從數學上已經證明這將加快迭代的收斂速度。如果迭代20次仍然不收斂,則以迭代後的分支流量值進行重新排序,再迭代,將加快收斂速度。
4.2 流體機械特性曲線的處理
一般用下面的二次曲線擬合流體機械特性曲線,而且認為流體機械的工況點在合理的工況區間內,如圖8-2的實線部分。
式中, 為流體機械所在分支的流量; 、 、 為方程常數。
上式中,如果流體機械作用的方向與流體流動方向相同, ,流體機械克服流體流動阻力做功;反之, ,流體機械成為流體流動的阻力。
如果分支流量的初始值與其真值之間的偏差較大,則有可能出現工況點落在特性曲線的另一側,最終導致假收斂。從軟體的可視化角度、從面向現場工程技術人員的角度出發,網路分流時的初始流量擬定不應由人工完成,而計算機自動進行初始流量擬定時,如果採用二次曲線擬合,發生假收斂的機率會更多。
為了避免假收斂,同時,更為重要的是為了能夠模擬流體機械在不穩定工作區(特性曲線的駝峰段)的工況、模擬流體機械作為流體流動的阻力時的狀況,作者採用5次方程擬合流體機械特性曲線〔11〕,如圖8-3所示,方程如下:
圖8-1 圖8-2
4.3 網路簡化
網路簡化是把一個子網簡化成1條分支,簡化分支流量修正過程就是子網分流過程。在C 面向對象程序設計上,簡化分支由普通分支和流體網路共同派生,並採用虛擬技術「virtual」,該過程將自動實現。
三 總 結
目前流體網路的理論和應用在不斷發展,出現了具有增益的流、多終端流、多商品流以及網路流的分解與合成等新課題。網路流的應用已遍及通訊、運輸、電力、工程規劃、任務分派、設備更新以及計算機輔助設計等眾多領域。
流體網路理論在生產生活中具有不可缺少的重要地位,。