Dinits algoritm

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 24 maj 2021; kontroller kräver 3 redigeringar .

Dinitz-algoritmen är en polynomalgoritm för att hitta det maximala flödet i ett transportnätverk , föreslog 1970 av den sovjetiske (senare israeliska) matematikern Efim Dinitz . Algoritmens tidskomplexitet är . En sådan uppskattning kan erhållas genom att introducera begreppen ett hjälpnätverk och ett blockerande (pseudomaximalt) flöde . I nätverk med enhetsbandbredd finns det en starkare tidskomplexitetsuppskattning: .

Beskrivning

Låta vara  ett transportnät , där och  är respektive genomströmningen och flödet genom kanten .

Den återstående bandbredden  är en mappning som definieras som:
  1. Om , I andra källor
  2. annat.
Restnätverk  - graf , var . En komplementär väg  är en väg i restgrafen . Låt vara  längden på den kortaste vägen från till i grafen . Då  är grafens hjälpnätverk grafen , där . Ett blockerande flöde  är ett flöde så att graf c inte innehåller en väg.

Algoritm

Dinits algoritm

Ingång : Nätverk . Effekt : maximalt flöde .
  1. Installera för varje .
  2. Skapa från graf . Om , stoppa och mata ut .
  3. Hitta blockerande tråd i .
  4. Förstärk flödet med flödet och gå till steg 2.

Analys

Det kan visas att varje gång antalet kanter på den kortaste vägen från källan till sänkan ökar med minst en, så det finns inga fler blockerande flöden i algoritmen, där  är antalet hörn i nätverket. Det extra nätverket kan byggas genom bredd-först genomgång i tid , och det blockerande flödet på varje nivå i grafen kan hittas i tid . Därför är körtiden för Dinits-algoritmen .

Med hjälp av datastrukturer som kallas dynamiska träd är det möjligt att hitta blockeringsflödet på varje fas i tiden , sedan kan körtiden för Dinitz algoritm förbättras till .

Exempel

Nedan är en simulering av Dinitz algoritm. I det extra nätverket är hörnen med röda etiketter värdena . Den blockerande tråden är markerad med blått.

ett.

En blockerande tråd består av banor:

  1. med 4 flödesenheter,
  2. med 6 flödesenheter, och
  3. med 4 flödesenheter.

Därför innehåller det blockerande flödet 14 enheter, och flödesvärdet är 14. Observera att den komplementära banan har 3 kanter.

2.

En blockerande tråd består av banor:

  1. med 5 flödesenheter.

Därför innehåller det blockerande flödet 5 enheter, och flödets värde är 14 + 5 = 19. Observera att den komplementära banan har 4 kanter.

3.

Aktien är inte tillgänglig på nätverket . Därför stoppar algoritmen och returnerar det maximala flödet av storleken 19. Observera att i varje blockerande flöde ökas antalet kanter i den komplementära banan med minst en.

Historik

Dinitz-algoritmen publicerades 1970 av den före detta sovjetiske vetenskapsmannen Efim Dinitz, som nu är medlem av fakulteten för datateknik vid Ben-Gurion University (Israel), tidigare än Edmonds-Karp-algoritmen , som publicerades 1972, men skapat tidigare. De visade oberoende att i Ford-Fulkerson-algoritmen , om den komplementära vägen är den kortaste, minskar inte längden på den komplementära vägen.

Dinitzs algoritm med förökning

Algoritmens tidskomplexitet kan reduceras genom att optimera processen för att hitta en blockerande tråd. För att göra detta är det nödvändigt att introducera begreppet potential . Kantpotentialen är , och vertexpotentialen är . Enligt samma logik , en . Tanken med förbättringen är att leta efter en vertex med minsta positiva potential i hjälpnätverket och bygga ett blockerande flöde genom det med hjälp av köer .

Ingång : Nätverk . Effekt : maximalt flöde .
  1. Installera för varje .
  2. Skapa från graf . Om , stoppa och mata ut .
  3. Installera för varje .
  4. Bestäm potentialen för varje vertex.
  5. Så länge det finns en vertex sådan att :
    1. Definiera flödet med hjälp av framåtriktad utbredning från .
    2. Bestäm flödet med hjälp av backpropagation från .
    3. Komplettera streamen med streams och .
  6. Förstärk flödet med flödet och gå till steg 2.

Algoritmer för framåt- och bakåtpropagation tjänar till att hitta vägar från till respektive från till . Ett exempel på den direkta spridningsalgoritmen som använder köer:

Ingång : Hjälpnätverk , vertex sådan att . Output : Ett flöde från källa till vertex som är en del av ett blockerande flöde.
  1. Installera för alla : .
  2. Installera och .
  3. Lägg till i kö .
  4. Så länge kön inte är tom:
    1. Ställ in värdet på det sista elementet i kön.
    2. Hejdå :
      1. För varje kant :
      2. .
      3. Uppdatering .
      4. Uppdatering .
      5. Installera .
      6. Om och avkö . _

På grund av det faktum att minst en vertex är "mättad" i varje iteration av sökningen efter ett blockerande flöde, slutförs det i värsta fall iterationer, som var och en tar hänsyn till maximalt antal hörn. Låt vara antalet "mättade" kanter i varje -te iteration av sökningen efter en blockerande tråd. Då är dess asymptotiska komplexitet , där är antalet hörn och är antalet kanter i grafen. Således är den asymptotiska komplexiteten hos Dinitz spridningsalgoritm lika med , eftersom det blockerande flödet som mest kan passera genom hörn.

Litteratur

Länkar