Dinits algoritme

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 24. maj 2021; checks kræver 3 redigeringer .

Dinitz-algoritmen er en polynomiel algoritme til at finde det maksimale flow i et transportnetværk , foreslået i 1970 af den sovjetiske (senere israelske) matematiker Efim Dinitz . Algoritmens tidskompleksitet er . Et sådant estimat kan opnås ved at introducere begreberne et hjælpenetværk og et blokerende (pseudo-maksimalt) flow . I netværk med enhedsbåndbredder er der et stærkere tidskompleksitetsestimat: .

Beskrivelse

Lade være  et transportnetværk , hvori og  er henholdsvis gennemstrømningen og strømmen gennem kanten .

Den resterende båndbredde  er en kortlægning defineret som:
  1. hvis , I andre kilder
  2. Ellers.
Restnetværk  - graf , hvor . En komplementær sti  er en sti i restgrafen . Lad være  længden af ​​den korteste vej fra til i grafen . Så  er grafens hjælpenetværk grafen , hvor . Et blokerende flow  er et flow , således at graf c ikke indeholder en sti.

Algoritme

Dinits algoritme

Input : Netværk . Udgang : maksimalt flow .
  1. Installer for hver .
  2. Opret fra graf . Hvis , stop og output .
  3. Find blokerende tråd i .
  4. Forøg flow med flow og gå til trin 2.

Analyse

Det kan vises, at hver gang antallet af kanter i den korteste vej fra kilden til synken stiger med mindst én, så der ikke er flere blokerende flows i algoritmen, hvor  er antallet af toppunkter i netværket. Hjælpenetværket kan bygges ved bredde-først gennemløb i tid , og blokeringsflowet på hvert niveau af grafen kan findes i tid . Derfor er køretiden for Dinits-algoritmen .

Ved at bruge datastrukturer kaldet dynamiske træer er det muligt at finde blokeringsflowet på hver fase i tid , så kan køretiden for Dinitz's algoritme forbedres til .

Eksempel

Nedenfor er en simulering af Dinitz's algoritme. I hjælpenetværket er hjørnerne med røde etiketter værdierne . Spærretråden er markeret med blåt.

en.

En blokerende tråd består af stier:

  1. med 4 flowenheder,
  2. med 6 flowenheder, og
  3. med 4 flowenheder.

Derfor indeholder det blokerende flow 14 enheder, og flowværdien er 14. Bemærk at den komplementære bane har 3 kanter.

2.

En blokerende tråd består af stier:

  1. med 5 flowenheder.

Derfor indeholder det blokerende flow 5 enheder, og værdien af ​​flowet er 14 + 5 = 19. Bemærk at den komplementære vej har 4 kanter.

3.

Aktien er ikke tilgængelig på netværket . Derfor stopper algoritmen og returnerer det maksimale flow af størrelsesorden 19. Bemærk, at i hvert blokeringsflow øges antallet af kanter i den komplementære bane med mindst én.

Historie

Dinitz-algoritmen blev udgivet i 1970 af den tidligere sovjetiske videnskabsmand Efim Dinitz, som nu er medlem af fakultetet for datateknik ved Ben-Gurion University (Israel), tidligere end Edmonds-Karp-algoritmen , som blev offentliggjort i 1972, men oprettet tidligere. De viste uafhængigt, at i Ford-Fulkerson-algoritmen , hvis den komplementære vej er den korteste, falder længden af ​​den komplementære vej ikke.

Dinitz's algoritme med udbredelse

Algoritmens tidskompleksitet kan reduceres ved at optimere processen med at finde en blokerende tråd. For at gøre dette er det nødvendigt at introducere begrebet potentiale . Kantpotentialet er , og toppunktspotentialet er . Af samme logik er en . Ideen med forbedringen er at lede efter et toppunkt med det mindste positive potentiale i hjælpenetværket og bygge et blokerende flow gennem det ved hjælp af køer .

Input : Netværk . Udgang : maksimalt flow .
  1. Installer for hver .
  2. Opret fra graf . Hvis , stop og output .
  3. Installer for hver .
  4. Bestem potentialet for hvert toppunkt.
  5. Så længe der er et toppunkt , sådan at :
    1. Definer flowet ved at bruge fremadgående udbredelse fra .
    2. Bestem flow ved hjælp af backpropagation fra .
    3. Fuldfør streamen med streams og .
  6. Forøg flow med flow og gå til trin 2.

Fremadgående og tilbagegående algoritmer tjener til at finde stier fra henholdsvis til og fra til . Et eksempel på den direkte udbredelsesalgoritme ved brug af køer:

Input : Hjælpe netværk , toppunkt således . Output : Et flow fra kilde til toppunkt , der er en del af et blokerende flow.
  1. Installer for alle : .
  2. Installer og .
  3. Tilføj til kø .
  4. Så længe køen ikke er tom:
    1. Indstil værdien til det sidste element i køen.
    2. farvel :
      1. For hver kant :
      2. .
      3. Opdatering .
      4. Opdatering .
      5. Installer .
      6. Hvis og afkø . _

På grund af det faktum, at mindst et toppunkt er "mættet" i hver iteration af søgningen efter et blokerende flow, fuldføres det i worst-case iterationer, som hver især tager højde for maksimum af toppunkter. Lad være antallet af "mættede" kanter i hver -te iteration af søgningen efter en blokerende tråd. Så er dens asymptotiske kompleksitet , hvor er antallet af hjørner og er antallet af kanter i grafen. Således er den asymptotiske kompleksitet af Dinitz's spredningsalgoritme lig med , da den blokerende strøm højst kan passere gennem hjørner.

Litteratur

Links