Blomkompressionsalgoritm

Blossom-algoritmen är en algoritm  inom grafteorin för att konstruera de största matchningarna på grafer . Algoritmen utvecklades av Jack Edmonds 1961 [1] och publicerades 1965 [2] . Givet en allmän graf G =( V , E ), hittar algoritmen en matchande M så att varje vertex i V faller mot högst en kant i M​ och | M | maximal. En matchning konstrueras genom att iterativt förbättra den initiala tomma matchningen längs förstärkande grafbanor. I motsats till tvådelad matchning var den viktigaste nya idén att komprimera en udda cykel i en graf (blomma) till en enda vertex och fortsätta sökningen iterativt över den komprimerade grafen.

Den främsta anledningen till att blomkompressionsalgoritmen är viktig är att den gav det första beviset på att det var möjligt att hitta den största matchningen i polynomtid. En annan anledning är att metoden leder till beskrivningen av en linjär programmeringspolytop för en matchande polytop , vilket leder till en minsta viktmatchningsalgoritm [3] . Som Alexander Schreiver klargjorde , den ytterligare betydelsen av resultatet följer av det faktum att denna polytop var den första vars integrerade bevis "inte bara följde av total unimodularitet , utan dess beskrivning var ett genombrott i polyedrarnas kombinatorik " [4] .

Öka sökvägar

Givet en graf G =( V , E ) och en matchande M för G , är en vertex v blottad (inte täckt av matchningen) om det inte finns någon kant i M som faller samman med v . En bana i G är en växelvis bana om dess kanter växelvis inte tillhör M och ingår i M. Den förstärkande banan P  är en alternerande kedja som börjar och slutar med kala hörn. Observera att antalet omatchade hörn i förstärkningsbanan är större med en än antalet kanter i matchningen, och därför är antalet kanter i förstärkningsbanan udda. Att öka matchningarna längs vägen P  är operationen att ersätta uppsättningen M med en ny matchning .

Enligt Berges lemma är en matchande M maximal om och endast om det inte finns någon M -förstärkande väg i G [5] [6] . Därför är antingen matchningen störst, eller så kan den ökas. Alltså, med början med viss matchning, kan vi beräkna den största matchningen genom att öka den aktuella matchningen med den utökade sökvägen. Algoritmen kan formaliseras enligt följande

INPUT: Graf G , initial matchning M på G OUTPUT: största matchande M* på G A1 - funktionen find_largest_matching ( G , M ) : M* A2 find_increasing_path ( G , M ) A3 om P inte är tomt returnerar A4 find_greatest_match ( G , öka M längs P ) A5 annars A6 retur M A7 slut om A8 slutfunktion

Vi behöver beskriva hur förstärkningsvägar kan konstrueras effektivt. Deras sökrutin använder blommor och sammandragning.

Blommor och förträngning

Givet en graf G =( V , E ) och en matchande M av en graf G , då är blomman B  en cykel i G som består av 2k + 1 kanter varav exakt k tillhör M och har en vertex v ( bas ) såsom att det finns en omväxlande kedja av jämn längd ( stam ) från v till en bar vertex w .

Hitta blommor:

Vi definierar en komprimerad graf G' som den graf som erhålls från G genom att dra ihop alla kanter på blomman B , och vi definierar en komprimerad matchande M' som matchningen av grafen G' som motsvarar M .

G' har en M' -ökande bana om och bara om G har en M -ökande bana, och då kan vilken M' -ökande bana P' i G' som helst höjas till en M -ökande bana i G genom att återställa blomman B kontrakterade tidigare, så att segmentet av banan P' (om någon) som går genom v B ersätts av ett lämpligt segment som passerar genom B [8] . I mer detalj:

Sedan kan blomman komprimeras och sökningen kan fortsätta över de komprimerade graferna. Denna komprimering är hjärtat i Edmonds algoritm.

Hitta en utökad sökväg

Ökad sökväg använder en ytterligare datastruktur, som är en skog F , vars individuella träd motsvarar delar av grafen G . Faktum är att skogen F är densamma som används för att hitta de största matchningarna i tvådelade grafer (utan att blommor behöver dras ihop). Vid varje iteration hittar algoritmen antingen (1) en förstärkningsbana, eller (2) hittar en blomma och återkommer till en komprimerad graf, eller (3) drar slutsatsen att det inte finns någon förstärkningsbana. Den extra strukturen byggs med hjälp av en inkrementell procedur, som diskuteras nedan [8] .

Konstruktionsproceduren tittar på hörnen v och kanterna e på grafen G och uppdaterar F stegvis i enlighet därmed. Om v finns i ett skogsträd T använder vi rot(v) för att beteckna roten till T . Om både u och v ligger i samma träd T i F anger vi med avstånd(u, v) längden på den enda vägen från u till v i träd T .

INPUT: Graf G , matchande M till G OUTPUT: Öka sökväg P till G eller tom sökväg om ingen sådan sökväg hittas B01 funktion find_increment_path ( G , M ): P B02 tom skog B03 gör alla hörn och kanter omärkta i G , märk alla kanter M B05 för varje kal vertex v gör B06 skapa träd från en vertex { v } och lägg till träd till F B07- änden för B08 medan det finns omärkt vertex v i F med jämnt avstånd ( v, root(v)) gör B09 medan det finns en omärkt kant e ={ v , w } gör B10 om w inte är i F då // w är i matchningen, så lägg till kanten // som täcker e och w i F B11 matchas med vertex w i M B12 lägg till kanter { v , w } och { w , x } till trädet för v B13 annars B14 om avstånd (w, root( w )) är konstigt då // göra ingenting. B15 annars B16 om root(v) ≠ root(w) så // Rapportera förstärkningsvägen i F . B17 sätt ( ) B18 returnera P B19 annat // Dra ihop blomman till G och leta efter en bana i den komprimerade grafen. B20 blomman som bildas av e och kanterna på banan i T B21 krymper G och M genom att krympa blomman B B22 find_increasing_path B23 höj P' till G B24 retur P B25 slut om B26 slut om B27 slut om B28 markera kant e B29 slut medan B30 markerar vertex v B31 slut medan B32 returnerar tom bana B33 slutfunktion

Exempel

De följande fyra figurerna illustrerar utförandet av algoritmen. De streckade linjerna visar kanter som för närvarande inte finns i skogen. Först bearbetar algoritmen en kant som inte tillhör skogen, vilket leder till expansion av den nuvarande skogen (linjerna B10 - B12).

Därefter tas blomman bort och grafen komprimeras (linjerna B20 - B21).

Slutligen hittar algoritmen en förstärkningsväg P′ i den komprimerade grafen (linje B22) och lyfter den i den ursprungliga grafen (linje B23). Observera att förmågan hos blomkontraktionsalgoritmen är avgörande här. Algoritmen kan inte hitta P i den ursprungliga grafen direkt, eftersom endast icke-skogskanter mellan hörn på ett jämnt avstånd från roten beaktas i linje B17 i algoritmen.

Analys

Skogen F konstruerad av find_increasing_path() är en randig skog [9] .

Varje iteration av slingan, med start från linje B09, lägger antingen till en nod till trädet T i F (linje B10), hittar en förstärkningsbana (linje B17) eller hittar en blomma (linje B20). Det är lätt att se att körtiden för algoritmen är . Micali och Vazirani [10] visade en algoritm som bygger den största matchningen i tid .

Tvådelad matchning

Algoritmen reduceras till standardalgoritmen för matchning i tvådelade grafer [6] om G är tvådelad . Eftersom det inte finns några udda cykler i G i det här fallet kommer blommorna aldrig att hittas, och du kan helt enkelt ta bort raderna B20 - B24 i algoritmen.

Viktad matchning

Matchningsproblemet kan generaliseras genom att tilldela vikter till kanterna på grafen G . I det här fallet ställs frågan om uppsättningen M , som ger en matchning med den maximala (minsta) totalvikten. Det viktade matchningsproblemet kan lösas med en kombinatorisk algoritm som använder den oviktade Edmonds-algoritmen som en subrutin [5] . Vladimir Kolmogorov gav en effektiv implementering av denna algoritm i C++ [11] .

Anteckningar

  1. Edmonds, 1961 , s. 32-54.
  2. Edmonds, 1965 , s. 449-467.
  3. Edmonds, 1965 , s. 125-130.
  4. Schrijver, 2003 .
  5. 1 2 Lovász, Plummer, 1986 .
  6. 12 Karp , 2006 .
  7. Genom konstruktion markerar " i " början av en kant från M , så att fallet med mötet av två angränsande hörn märkta " i " är omöjligt.
  8. 12 Tarjan , 2002 .
  9. Kenyon, Lovász, 1990 .
  10. Micali, Vazirani, 1980 , s. 17-27.
  11. Kolmogorov, 2009 , s. 43-67.

Litteratur

Länkar