F. Optimaliseren in netwerken Inleiding Optimalisering is het deelgebied van de wiskunde waarbij het gaat het om de ontwikkeling en analyse van algoritmen voor het oplossen van problemen waarbij een functie f(x) moet worden geoptimaliseerd (geminimaliseerd of gemaximaliseerd), waarbij x een vector is in een gegeven verzameling X. In het geval van minimaliseren heeft zo n probleem de vorm min {f(x) : x X R n }. De vector x representeert de n beslissingsvariabelen, f(x) de doelfunctie, en X het domein, of toelaatbare gebied van het probleem. Als de doelfunctie lineair is en het domein kan worden gedefinieerd door middel van lineaire functies, dan spreken we van een lineair optimaliseringsprobleem. Veel problemen, in allerlei takken van de toegepaste wetenschappen, betreffen de optimale toewijzing van schaarse middelen. Zulke problemen kunnen worden geformuleerd als een optimaliseringsprobleem. Gedurende de tweede wereldoorlog werd optimalisering voor het eerst op grote schaal toegepast om logistieke en operationele problemen te modelleren en op te lossen. Als wetenschappelijke discipline kon het gebied ontstaan en floreren dankzij de opkomst van de digitale computer. Optimaliseringstechnologie is tegenwoordig een essentieel onderdeel van de besluitvorming op allerlei gebieden: luchtvaart, economie, landbouw, energie, telecommunicatie, internet, biotechnologie, etc. Een belangrijk deelgebied van de lineaire optimalisering is netwerk optimalisering. Na het werk van enkele pioniers in de jaren 0 en 0 van de vorige eeuw op het gebied van de grafentheorie [7] en het transport probleem, waaronder de Nederlander Koopmans die vanwege dit werk in 975 samen met de Russische econoom Kantorovic de Nobelprijs voor economie ontving, kwam dit gebied pas goed van de grond in de jaren 50. Tot de eerste problemen waarvoor efficiënte algoritmen werden gevonden behoorden het minimal-spanning-tree probleem in 965 (Kruskal) en 957 (Prim), en het kortste-pad-probleem in 959 (Dijkstra). Veel van deze eerste algoritmen worden nog steeds toegepast. Onder invloed van de opkomende informatica werd in de jaren 70 steeds indringender de vraag gesteld naar de efficiëntie van algoritmen. Toen Klee en
Minty in 972 een voorbeeld gaven van een lineair probleem met 50 variabelen waarvoor de Simplex-methode tientallen jaren rekentijd zou vergen, werd dat als zeer schokkend ervaren. In dit college willen we efficiënte algoritmen bespreken voor enkele belangrijke optimaliseringsproblemen voor netwerken. Theorie en opgaven voor zelfstudie. Kortste paden Voor velen is het vinden van de snelste route van huis naar het werk een dagelijks terugkerend probleem. In abstracte vorm is het een van de oudste en meest bestudeerde problemen in de toegepaste wiskunde. Het staat bekend als het kortste-pad-probleem en kan eenvoudig worden gemodelleerd met behulp van een graaf of netwerk. Figuur toont hiervan een eenvoudig voorbeeld. De knopen stellen de kruispunten voor van wegen en straten. Een weg tussen twee kruispunten wordt gerepresenteerd door een lijn (of tak) die de corresponderende knopen verbindt. Aan elke tak kennen we een positieve getalwaarde toe gelijk aan de lengte, of de reistijd van het betreffende weggedeelte. Ook als deze getalwaarde een reistijd voorstelt, noemen we het de lengte van de tak. In het netwerk van Figuur zijn er meerdere paden van knoop s naar knoop t. Een kortste pad is aangegeven door middel van dik getekende pijlen. Het is 2 s 5 5 2 6 7 6 8 2 Figuur : Voorbeeld van een kortste-pad-probleem duidelijk dat in de praktijk het aantal knopen veel groter kan zijn dan in dit simpele voorbeeld. Een veel gebruikte digitale kaart van Nederland bijvoorbeeld telt 80.8 knopen en.087.20 takken (Tele-atlas, versie 200). Het snel vinden van een kortste pad van een vertrekpunt A naar een bestemming B vergt dan een efficiënt algoritme. Reisplanners en navigatiesystemen zijn 9 t 2
gebaseerd op dergelijke algoritmen. Gebruikers van zulke systemen zullen een korte berekeningstijd op prijs stellen. Kortste-pad-problemen hebben een veel groter toepassingsgebied dan men bij eerste kennismaking zou verwachten: De meest voor de hand liggende toepassing is al genoemd: het vinden van een kortste reisroute van A naar B. In communicatienetwerken (internet!) doet zich het zelfde probleem voor: als we vanuit Delft een e-mail bericht naar Tokyo sturen wordt in principe het bericht door routers in tussenliggende schakelstations doorgestuurd naar een schakelstation dat ligt op een kortste route naar Tokyo. Een cruciaal probleem bij spraakherkenning, het automatisch omzetten van gesproken in geschreven tekst, is het onderscheiden van gelijkluidende woorden, zoals voet, voed en voedt. Vorm een graaf met de mogelijke woorden in een zin als knopen, met een gerichte tak tussen elk tweetal mogelijke opeenvolgende woorden. Als we voor de taklengten een maat nemen voor de kans op het voorkomen van het betreffende paar woorden, dan kan de best mogelijke interpretatie van een zin worden gevonden door een kortste pad te bepalen van het eerste woord naar het laatste woord in de zin. Zie Figuur 2. voed De man voedt het schaap voet Figuur 2: Voorbeeld van een zin Beeldsegmentatie is een ander voorbeeld. Beschouw het probleem om twee objecten in bijvoorbeeld een MRI-scan van elkaar te scheiden. Dit wordt gedaan door een lijn tussen twee punten te vinden die het kleinste aantal donkere pixels bevat. De pixels zijn de knopen van de graaf, en de lengte van een tak nemen we korter naarmate de twee pixels die de tak verbindt lichter zijn. Een kortste pad tussen de twee punten markeert een optimale scheidingslijn. Dezelfde techniek wordt ook gebruikt om de contour van bijvoorbeeld het hart in een röntgenopnamen te bepalen.
In veel toepassingen moeten grote aantallen kortste paden worden uitgerekend waardoor het beschikken over een efficiënt algoritme nog urgenter wordt. Het eerder genoemde Dijkstra algoritme is het meest bekende en meest gebruikte. De werking van dit algoritme zullen we hieronder beschrijven... Enige definities Een netwerk, of (gerichte) graaf, bestaat uit een (eindige) verzameling V van knopen, en een verzameling E van (gerichte) takken. Een tak is een geordend paar van knopen. Als e = (v,w) E dan heet v de beginknoop en w de eindknoop van tak a. Een pad P in het netwerk is een rij van de vorm v, e, v 2, e 2,...v k, e k, v k+ waarbij e i = (v i,v i+ ) E voor i =, 2..., k en k. Omdat een tak eenduidig bepaald is door zijn begin- en zijn eindknoop stellen we een pad ook wel kortweg voor als een geordend rijtje van knopen: P = (v, v 2,...v k, v k+ ). () We nemen aan dat elke tak een niet-negatieve lengte heeft. De lengte van tak (v,w) noteren we als c vw. De lengte van het pad P in () is per definitie de som van de lengten van de takken op P: l(p) = (v,w) P Opgave Bepaal het aantal paden van s naar t in het netwerk van Figuur. c vw...2 Algoritme van Dijkstra Het algoritme van Dijkstra bepaalt een kortste pad van s naar t, waarbij s en t twee willekeurige knopen zijn in een gegeven netwerk. Het algoritme kent aan elke knoop v in de graaf een getalwaarde (of label) π v toe; deze waarde is altijd groter dan of gelijk aan de lengte van het kortste pad van s naar v. Aan het eind van het algoritme is π t gelijk aan de lengte van het kortste pad van s naar t. In elke iteratie wordt een knoop verkend en het algoritme houdt een lijst Q bij van nog te verkennen knopen. Aanvankelijk bevat Q alleen knoop s, en hebben alle knopen het label (het wiskundige symbool voor oneindig)
behalve knoop s: die krijgt het label 0, zijnde de lengte van het kortste pad van s naar s. Een iteratie bestaat uit het kiezen en vervolgens verkennen van een knoop u uit de lijst Q; we kiezen daarvoor een knoop in Q waarvoor π u minimaal is; deze knoop wordt uit Q verwijderd en vervolgens verkend. Tijdens het verkennen van knoop u wordt voor elke knoop v die met u verbonden is het label π v al dan niet aangepast: als het pad van s via u naar v korter is dan π v dan maken we π v gelijk aan de lengte van dit kortere pad. Dus geven we dan v als nieuw label de som van π u en de lengte c uv van de tak van u naar v; verder wordt de knoop v toegevoegd aan Q. Figuur beschrijft het algoritme in pseudocode. Initialisatie: Q := {s}; π s := 0; π v :=, v V \ {s}; while Q is niet leeg: Kies u Q zodanig dat π u π v voor alle v Q; Verken(u) endwhile Figuur : Algoritme van Dijkstra. De procedure Verken(u) is gegeven in Figuur. begin doe voor alle a = (u,v) het volgende: als π v > π u + c uv dan begin π v := π u + c uv ; voeg v toe aan Q end; verwijder u uit Q end Figuur : Procedure Verken(u). We passen bij wijze van voorbeeld het algoritme toe op het netwerk in Figuur 5
. Het resultaat is samengevat in Figuur 5. De kolommen in de tabel in deze figuur geven de waarden van π v. De elementen in Q zijn aangegeven door de waarde van π v te omcirkelen; het element dat wordt gekozen om te worden verkend heeft in plaats van een cirkel een rechthoek als kader. iteraties knoop 2 5 6 7 8 9 0 2 s 0 0 0 0 0 0 0 0 0 0 0 0 2 6 6 6 6 6 6 6 6 6 9 9 9 9 9 9 9 2 2 2 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 9 9 9 9 9 9 8 8 8 7 7 7 7 7 7 7 7 9 9 9 9 9 9 9 t 2 0 0 Figuur 5: Toepassing van Dijkstra s algoritme. We concluderen uit de tabel dat de lengte van het kortste pad gelijk is aan 0. Het kortste pad kan ook uit de tabel worden teruggevonden. Het label 0 in knoop t ontstond bij het verkennen van knoop 9, die op dat moment label 9 had. Dit label ontstond bij het verkennen van knoop 6, die op dat moment label 6 had. Enzovoort. Zo terugwerkend vinden we dat P = (s, 5, 6, 9,t) een kortste pad is van s naar t. Opgave 2 Bewijs dat het label π v van een knoop v nooit kleiner is dan de lengte van een kortste pad van s naar v. Opgave Als een knoop u wordt verkend, dan is het label van die knoop permanent (d.w.z. verandert niet meer). Bewijs dit. Leid hieruit af dat het label van die knoop dan gelijk is aan de lengte van een kortste pad van s naar die knoop. Opgave Een knoop die is verkend, wordt uit Q verwijderd. Toon aan dat die knoop daarna nooit weer aan de lijst Q wordt toegevoegd. 6
Opgave 5 Als het algoritme stopt, dan geldt voor elke knoop v dat π v gelijk is aan de lengte van een kortste pad van s naar v. Bewijs dit. Uit Opgave 5 blijkt dat het algoritme van Dijkstra niet alleen de lengte van het kortste pad van s naar t oplevert, maar de lengte van het kortste pad van s naar elke knoop. We noemen het daarom een one-to-all kortste-padalgoritme. Indien we alleen het kortste pad van s naar t willen weten, dan kunnen we het algoritme stoppen als knoop t aan de beurt is om te worden verkend. Volgens Opgave is de lengte van het kortste pad van s naar t dan gevonden. Deze variant van Dijkstra s algoritme is een one-to-one kortste-pad-algoritme. De efficiëntie van een algoritme wordt bepaald door het aantal bewerkingen (rekenkundige bewerkingen als optellen, aftrekken, vermenigvuldigen, etc. en logische bewerkingen, zoals het vergelijken van de grootte van twee getallen) in het algoritme. We dienen dus het aantal bewerkingen te tellen dat het algoritme vergt voor een netwerk met n knopen en m takken. Dit leidt doorgaans tot een of andere min of meer ingewikkelde uitdrukking in m en n. Omdat we vooral geïnteresseerd zijn in het gedrag van het algoritme voor grote waarden van n en/of m, letten we alleen op die termen in de betreffende uitdrukking die het gedrag voor grote n en/of m in hoofdzaak bepalen. Bijvoorbeeld, als de uitdrukking voor het aantal bewerkingen 7n 2 m + 8n + 5 is dan interesseert ons alleen de term 7n 2 m. Dit maakt duidelijk dat als n 2 maal zo groot wordt, de looptijd van het algoritme ongeveer maal zo groot wordt. Deze laatste conclusie, die ons vertelt hoe snel de looptijd aangroeit als het probleem veel groter wordt, is onafhankelijk van de factor 7. Daarom laten we ook de factor 7 weg, en zeggen dat de looptijd van het algoritme O(n 2 m) is; het symbool O dient om aan te geven dat het om de orde van grootte van de looptijd gaat. Opgave 6 Ga na dat het aantal bewerkingen in Dijkstra s algoritme O(n 2 ) is. Na de uitvoering van Dijkstra s (one-to-all) algoritme voldoen de labels π v aan de ongelijkheden Opgave 7 Bewijs (2). π s = 0, π v π u c uv, (u,v) E. (2) 7
Zij nu P = (s = v 0,v, v 2,..., v k,t = v k ) een willekeurig pad van s naar t. Dan mogen we schrijven l(p) = k i=0 c vi v i+ k i=0 ( πvi+ π v i ) = πvk π v0 = π t π s = π t. Met andere woorden, als P een willekeurig pad is van s naar t, en π voldoet aan (2), dan geldt l(p) π t. Het Dijkstra algoritme levert een pad P en een labelling π waarvoor geldt l(p) = π t. Een gevolg hiervan is de volgende stelling. Stelling. De lengte van het kortste pad van s naar t gelijk is aan max {π t : π s = 0, π v π u c uv, (u,v) E}. Dit is de dualiteitsstelling voor het kortste-pad-probleem. Het belang van deze (en elke dualiteits-) stelling is het volgende. Als we een kortste pad P gevonden hebben dan is er altijd een mogelijkheid dat er rekenfouten zijn gemaakt. De geproduceerde labels π v kunnen echter worden gebruikt als een garantiecertificaat: Als de labels voldoen aan (2) en l(p) = π t dan levert dit een niet-algoritmisch bewijs voor het feit dat P een kortste pad is!.2 Maximale stromen We beschouwen opnieuw een netwerk G = (V,E), met knopenverzameling V en takkenverzameling E. Verder is weer voor elke tak (v,w) een positief getal c vw gegeven; dit getal stelt nu de capaciteit voor van tak (v,w). Gegeven zijn verder twee speciale knopen, s en t, en gevraagd wordt om een maximale stroom van s naar t te bepalen. Een stroom x is een verzameling van getallen x vw zodanig dat in elke knoop ongelijk aan s en t behoud van stroom geldt en op elke tak de (niet-negatieve!) stroomwaarde niet groter is dan de capaciteit. Met andere woorden, x moet voldoen aan de balansvergelijkingen x uv = x vw, v V \ {s,t} () (u,v) E en aan de capaciteitsbeperkingen (v,w) E 0 x vw c vw, (v,w) E. () De waarde van de stroom x is per definitie gelijk aan waarde (x) = x sv (s,v) E 8 (v,s) E x vs.
a b c 5 5 s t 6 d e f 2 Figuur 6: Maximale-stroom-probleem In Figuur 6 is een voorbeeld van een maximale-stroom-probleem gegeven. Merk op dat x vw = 0, (v,w) E een stroom definieert op het netwerk. Dit is de zogenaamde nulstroom. De waarde van deze stroom is 0. Stromen met een grotere waarde zijn eenvoudig te vinden: neem een willekeurig pad van s naar t in het netwerk, en stuur daarover zoveel mogelijk stroom. Bijvoorbeeld, over het pad (s,a,f,t) in Figuur 6 kan een stroom ter waarde van worden verzonden zonder de capaciteitsgrenzen op dit pad te overschrijden. Daarenboven kan over het pad (s,d,e,c,t) een stroom ter waarde van worden verzonden zonder de capaciteitsgrenzen op dit pad te overschrijden. Samen leveren deze stromen een stroom ter waarde van 7 op. Deze stroom is afgebeeld in Figuur 7. Bij elke tak (v,w) staan de stroomwaarde en de 5 a 0 b c 5 s 0 0 0 0 t 6 d e f 0 2 Figuur 7: Een stroom met waarde 7. capaciteit gegeven als x vw c vw..2. Algoritme van Ford-Fulkerson Het algoritme van Ford-Fulkerson (956) doet in feite niets anders dan bij een gegeven stroom op een systematische manier te zoeken naar een pad van s 9
naar t waarover extra stroom kan worden gestuurd. Verrassend genoeg levert dit algoritme inderdaad een maximale stroom op: als er geen pad van s naar t is waarover extra stroom kan worden gestuurd, dan is de stroom maximaal. We zullen dit hieronder aantonen. Maar eerst zullen we een systematische manier behandelen om een zogenaamd doorbraakpad te vinden waarover eventueel extra stroom kan worden gestuurd. Eerst vormen we het zogenaamde hulpnetwerk G x van G behorend bij stroom x. G x heeft dezelfde knopen als G. In G x nemen we alleen die takken (v,w) E op waarover extra stroom kan worden gestuurd en de inverse takken van de stroomvoerende takken in G; de capaciteit van deze takken in G x is gelijk aan de restcapaciteit in G. Met andere woorden, als we de verzameling van de takken in G x E x noemen, dan geldt E x = {(v,w) E : x vw < c vw } {(w,v) : (v,w) E, x vw > 0}. Als x vw < c vw dan is de restcapaciteit van deze tak in E x gelijk aan c vw x vw, en als x vw > 0 dan is restcapaciteit van tak (w,v) in E x gelijk aan x vw. We illustreren dit aan de hand van de stroom in Figuur 7. Het hulpnetwerk is afgebeeld in Figuur 8. In het netwerk van Figuur 8 blijkt via het dik getes a b c 2 d e f 2 2 t Figuur 8: Hulpnetwerk voor Figuur 7. kende pad een doorbraak mogelijk van s naar t. Bovendien zien we dat over dit pad een extra stroom ter waarde van kan worden gestuurd. Voegen we deze stroom toe aan de stroom in Figuur 7 dan verkrijgen we de stroom in Figuur 9. Om na te gaan of verder verbetering van de stroomwaarde mogelijk is construeren we het hulpnetwerk voor de nieuwe stroom. Zie Figuur 0. Op het eerste gezicht is er nu geen doorbraak mogelijk. Om dit systematisch vast te stellen labelen we alle knopen, te beginnen met s, die vanuit s bereikbaar zijn met een. We kunnen dit doen met een aangepaste (vereenvoudigde) versie van het Dijkstra algoritme: We labelen s met en definiëren Q = {s}. Dan kiezen we een knoop u Q en verkennen knoop u, dat wil zeggen dat 0
5 a 0 b c 5 s 0 0 0 t 6 d e f 0 2 Figuur 9: Een stroom met waarde 8. s a d b e Figuur 0: Hulpnetwerk voor Figuur 9. 2 2 c f t we alle nog niet gelabelde knopen die vanuit u bereikbaar zijn labelen met en toevoegen aan Q. Vervolgens verwijderen we u uit Q. Dit herhalen we totdat Q leeg is. Men gaat eenvoudig na dat na dit proces alle vanuit s bereikbare knopen gelabeld zijn, terwijl de ongelabelde knopen niet bereikbaar zijn vanuit s. Bijgevolg is er een doorbraak mogelijk dan en slechts dan als knoop t gelabeld is. Figuur 0 maakt duidelijk dat er geen doorbraak mogelijk is. We zullen nu bewijzen dat hieruit volgt dat de stroom in Figuur 9 maximaal is. Dit gaat als volgt. We definiëren de knoopverzameling S: S = {v V : v is gelabeld}. Het is duidelijk dat s S en, omdat er geen doorbraak mogelijk is, t / S. De verzameling van de takken die hun beginknoop in S hebben en hun eindknoop buiten S, noteren we als δ + (S). Dus δ + (S) := {(v,w) E : v S, w / S}.
s t S δ + (S) V \ S Figuur : De s-t snede δ + (S). De situatie is schetsmatig weer gegeven in Figuur. Als we de takken in δ + (S) uit E verwijderen dan is er geen pad meer van s naar t. We noemen δ + (S) daarom een s-t snede, en we definiëren de capaciteit c(δ + (S)) van deze snede als volgt: c(δ + (S)) := (v,w) δ + (S) c vw = {c vw : v S, w / S}. In het onderhavige geval bestaat δ + (S) uit de takken (b,c), (e,c) en (f,t), en er geldt c(δ + (S)) = + + = 8. Dit is precies de waarde van de gevonden stroom x in Figuur 9 en dit is niet toevallig zoals we nu zullen laten zien. Met andere woorden, we zullen bewijzen dat als x een stroom is waarvoor geen doorbraak meer mogelijk is, en S de verzameling van de gelabelde knopen, dan geldt waarde (x) = c(δ + (S)). Zij U een willekeurige verzameling van knopen met s U en t / U. Dan is δ + (U) de bijbehorende s-t snede. Zij verder y een willekeurige stroom op het netwerk. Omdat na verwijdering van de takken in δ + (U) er geen pad meer bestaat van s naar t is er dan ook geen stroom meer mogelijk van s naar t. Hieruit concluderen we dat alle stroom door de takken in δ + (U) moet gaan. Er zal dus moeten gelden waarde (y) c(δ + (U)). In het bijzonder geldt waarde (x) c(δ + (S)). Anderzijds, voor een tak (v,w) δ + (S) is knoop v gelabeld en w niet. Dit betekent dat deze tak niet in het hulpnetwerk voorkomt, want anders zou ook knoop w gelabeld zijn. Hieruit concluderen we dat deze tak verzadigd is, ofwel x vw = c vw. De takken in (v,w) δ (S), dit zijn de takken met het beginpunt buiten en 2
het eindpunt binnen S, zijn om de zelfde reden noodzakelijkerwijs stroomloos, want anders zou ook knoop v gelabeld zijn. Dus volgt inderdaad dat waarde (x) = c(δ + (S)). Het bovenstaande bewijst de dualiteitsstelling voor het maximale-stroom-probleem. Stelling.2 (Max-flow min-cut stelling) De waarde van een maximale stroom is gelijk aan min { c(δ + (U)) : U V, s U, t / U }. We concluderen dat de stroom x in Figuur 9 maximaal is; de snede gevormd door de takken (b,c), (e,c) en (f,t) vormt hiervan het bewijs! Een belangrijke vraag is of het algoritme van Ford-Fulkerson efficiënt is. In dit verband kan worden opgemerkt dat als alle taklengten geheeltallig zijn (of rationaal) alleen kan worden aangetoond dat het algoritme in een eindig aantal stappen eindigt (en dan een maximale stroom heeft gevonden); het aantal iteraties hangt echter niet alleen van m en n af, maar ook van de taklengten. In Opgave 8 wordt hiervan een voorbeeld gegeven. Als er irrationale taklengten zijn is eindige terminatie echter niet te garanderen; een voorbeeld hiervan wordt gegeven in [8, pag. 52]. Opgave 8 Beschouw het maximale-stroom-probleem in Figuur 2. Ga na 00 a 00 s t 00 b 00 Figuur 2: Een slecht probleem voor het algoritme van Ford-Fulkerson. dat het algoritme van Ford-Fulkerson zo kan worden uitgevoerd dat in elke iteratie het doorbraakpad gelijk is aan (s, a, b, t) of aan (s, b, a, t), in beide gevallen met een extra stroom ter waarde. Omdat de maximale stroom waarde 200 heeft, is het aantal iteraties dan 200. Een aanzienlijke verbetering in de iteratiegrens wordt bereikt door een kleine wijziging, namelijk door in iedere iteratie een kortste doorbraakpad te gebruiken. Dit werd voorgesteld door Dinits (970) en Edmonds en Karp (970);
zij bewezen dat de iteratiegrens daardoor O(nm 2 ) wordt. Het bewijs laten we hier achterwege. Verdere verbeteringen zijn een iteratiegrens O(n 2 m) (Dinits, 970) en O(n ) (Karzanov, 97); de onderliggende methoden maken gebruik van respectievelijk doorbraakstromen en blokkerende stromen in plaats van doorbraakpaden. Meer recente resultaten zijn O(nm log n) (Sleator, 980) en O(nm log m n) (King, Rao en Tarjan, 99). Voor meer bijzonderheden n log n verwijzen we naar [8, Hoofdstuk 0].. Maximale toewijzing We behandelen ten slotte een combinatorisch optimaliseringsprobleem dat bekend staat onder de naam toewijzingsprobleem. Een speciaal geval is het zogenaamde huwelijksprobleem waarvan een voorbeeld is weergegeven in Figuur. In dit netwerk stellen de knopen links jongens en de knopen rechts j 5 m j m j m 2 j 2 m j J M Figuur : Een huwelijksprobleem. meisjes voor. Een tak (j,m), met j J en m M, geeft aan dat jongen j en meisje m met elkaar bevriend zijn. De vraag waar het in het huwelijksprobleem (eng. matching problem) om gaat is de volgende: wat is het maximale aantal jongens dat met een vriendin kan trouwen? Het moge overigens duidelijk zijn dat dit aantal gelijk is aan het maximale aantal meisjes dat met een vriend kan trouwen.
Bovenstaand model heeft veel andere toepassingen. Bijvoorbeeld als een aantal verschillende taken moet worden uitgevoerd op een aantal verschillende machines, terwijl niet elke machine elke taak kan uitvoeren. Een mogelijke vraag is dan hoeveel taken tegelijkertijd kunnen worden uitgevoerd. Door J te vervangen door de taken en M door de machines, en door middel van takken aan te geven of een machine geschikt is voor een taak kunnen we dit probleem modelleren als een toewijzingsprobleem. Elk toewijzingsprobleem is eenvoudig te herleiden tot een maximale-stroomprobleem. We illustreren dit aan de hand van bovenstaand huwelijksprobleem. Daartoe voegen we twee knopen s en t toe aan het netwerk en voor elke jongen j J een tak (s,j), en voor elk meisje m M een tak (m,t). Geef deze takken capaciteit, en alle takken in het oorspronkelijke netwerk ook capaciteit. Dan is het duidelijk dat het maximale aantal huwelijken gelijk is aan de maximale waarde van een stroom van s naar t in het nieuwe netwerk. Zie Figuur. s j 5 j j j 2 j m m m 2 m t Figuur : Een maximale-stroom-netwerk voor het huwelijksprobleem. Het is eenvoudig om in dit netwerk een stroom met waarde te vinden. Zie Figuur 5. Deze stroomwaarden zijn op de vet getekende takken en 0 op de overige takken. Om na te gaan of deze stroom optimaal is vormen we het bijbehorende hulpnetwerk. Het hulpnetwerk is zoals getekend in Figuur 6. Merk op dat omdat alle capaciteiten zijn en alle stroomwaarden 0 of, de restcapaciteiten op de takken allemaal de waarde hebben. Deze zijn daarom niet ingetekend in deze figuur. Door op de standaard manier te labelen vanuit s blijkt dat er geen doorbraak mogelijk is. De gevonden stroom is dus optimaal. Bijgevolg is het maximale aantal huwelijken gelijk aan. 5
s 0 0 j 5 j j j 2 j 0 0 0 0 0 m m m 2 m 0 t Figuur 5: Een stroom met waarde. j 5 s j j m m t m 2 j 2 m j Figuur 6: Hulpnetwerk voor de stroom met waarde. Een niet-algoritmisch bewijs hiervan wordt geleverd door te letten op de gelabelde knopen in Figuur 6. Dit zijn s, j, j, j 5 en m. De snede bepaald door deze knopen bestaat uit de takken die lopen van een gelabelde knoop naar een ongelabelde knoop. Dit zijn de takken (s,j 2 ), (s,j ) en (m,t). Deze takken vormen een s-t snede met takken. De capaciteit van de snede is, en dus is de maximale waarde van een stroom van s naar t. Definitie. Een verzameling knopen C van knopen in een netwerk heet een knoopoverdekking als elke tak in het netwerk incident is met een knoop uit C. Opgave 9 Ga na dat de knopen j 2, j en m een knoopoverdekking vormen in het netwerk van Figuur. 6
We hebben de volgende dualiteitsstelling voor het huwelijksprobleem. Stelling. (Stelling van Kőnig-Egerváry (9)) Het maximale aantal huwelijken in een huwelijksprobleem is gelijk aan het minimale aantal knopen in een knoopoverdekking. Een bewijs van deze stelling wordt gevraagd in Opdracht 6 van paragraaf. 2 Vraagstukken voor het werkcollege Vraagstuk Beschouw het netwerk in Figuur 7. De knopen zijn de punten in het platte vlak met coördinaten (i,j) met 0 i 20 en 0 j 20. De takken zijn de horizontale en verticale lijnstukjes van lengte die deze punten verbinden en deze mogen in beide richtingen worden doorlopen. Markeer in Figuur 7 de knopen die worden verkend wanneer met de one-to-one versie van het algoritme van Dijkstra het kortste pad van het punt s = (0, 0) naar t = (5, 5) wordt gezocht. t s Figuur 7: Kortste-pad-probleem. Vraagstuk 2 Als een of meer taklengten c vw negatief zijn in een kortstepad-probleem dan wordt het vinden van een kortste s-t pad veel moeilijker doordat er dan circuits met negatieve lengte kunnen zijn. Als dat zo is, dan hoeft er geen kortste pad van s naar t te zijn. Laat dit zien aan de hand van een voorbeeld. Kunt u een methode bedenken om circuits met negatieve lengte op te sporen? 7
Vraagstuk (Stelling van Gallai (958)) Zij π : V R. We noemen π een potentiaal voor het netwerk G = (V,E) als π w π v c vw, (v,w) E. Bewijs dat een potentiaal bestaat dan en slecht dan als G geen circuits van negatieve lengte bevat. Vraagstuk In elke iteratie van het Dijkstra algoritme moet een knoop u in Q worden gekozen waarvoor π u minimaal is. Het kiezen van een kleinste element uit een ongeordende lijst van n elementen kost O(n) bewerkingen. Omdat we dit n keer moeten doen, kost alleen al het kiezen van de te verkennen knoop O(n 2 ) bewerkingen. Het kan efficiënter door er voor te zorgen dat de lijst Q geordend is, met het kleinste element vooraan in de lijst. Dan kunnen we steeds de eerste knoop gebruiken om te verkennen, hetgeen slechts bewerking vergt. Laat zien dat het bijhouden van een aldus geordende lijst slechts O(n log n) bewerkingen kost. Vraagstuk 5 Een vliegmaatschappij beschikt over een vloot van 5 vliegtuigen, elk van een verschillend type, en heeft 6 piloten in dienst. Het vliegbrevet van de piloten maakt het hen mogelijk slechts in een beperkt aantal typen te vliegen, zoals met een + aangegeven in onderstaande tabel. Hoeveel vliegtuigen kan de maatschappij maximaal tegelijkertijd laten vliegen? Wat wordt Type Type 2 Type Type Type 5 piloot + + piloot 2 + + + piloot + piloot + piloot 5 + + piloot 6 + Figuur 8: Vliegbevoegdheden. het maximale aantal vluchten (tegelijkertijd) als de maatschappij van elk type een tweede vliegtuig aanschaft? 8
Opdrachten voor zelfstandig werk Opdracht Gegeven is het kortste-pad-probleem in Figuur 9. Los dit 2 s 2 2 5 5 6 7 2 6 2 8 9 t Figuur 9: Een kortste-pad-probleem probleem op met het algoritme van Dijkstra. Opdracht 2 Het Bellman-Ford algoritme (958) is een efficiënt algoritme voor kortste-pad-problemen waarin negatieve taklengten voorkomen. Het algoritme levert de kortste afstanden van een vaste knoop s naar alle andere knopen, of het detecteert dat vanuit s een circuit met negatieve lengte kan worden bereikt (in welk geval er geen kortste pad vanuit s bestaat). De methode kan als volgt worden beschreven. Definieer voor elke v V en k = 0,, 2...: d k (v) = minimale lengte van een pad van s naar v met hoogstens k takken, waarbij d k (v) = als zo n pad niet bestaat. Het is duidelijk dat als er geen negatieve-lengte-circuit bereikbaar is vanuit s, de afstand van s naar v gelijk is aan d n (v), waarbij n het aantal knopen in V is. De functies d k zijn algoritmisch eenvoudig te vinden. Allereerst volgt dat d 0 (s) = 0 en d 0 (v) = als v s. Vervolgens kunnen d, d 2..., d n recursief worden gevonden met behulp van de volgende regel: { } d k+ (v) = min d k (v), min (u,v) E (d k(u) + c uv ) Men gaat eenvoudig na dat de looptijd van dit algoritme O(mn) is, waarin m het aantal takken in E voorstelt. Als d n = d n dan is er geen negatieve-lengte-circuit bereikbaar vanuit s, en dan stelt d n (v) de kortste afstand voor van s naar v, voor elke v V. Anders, als d n d n dan bestaat er een negatieve-lengte-circuit dat bereikbaar is vanuit s. Bewijs dit. (Hint: Zie [8, Theorem 8.5 en Theorem 8.6, page 09].) 9 2.
Opdracht Los het kortste-pad-probleem in Figuur 9 op met behulp van het Bellman-Ford algoritme. Verander de lengte van tak (, 7) in 0, en los het aldus ontstane probleem ook op met het het Bellman-Ford algoritme. Opdracht Het Floyd-Warshall algoritme (962) is een all-to-all kortste pad algoritme. Aannemend dat de knopen v, v 2,..., v n zijn is het onderliggende idee om achtereenvolgens voor k =, 2..., n de lengte van het kortste pad te berekenen van v i naar v j dat alleen gebruik maakt van de knopen {v, v 2,..., v k }. Figuur 20 toont dit algoritme. De input is een n n Initialisatie: Vervang alle niet-bekende afstanden in A door ; Maak alle diagonaalelementen in A gelijk aan ; U = A; for k = : n, for i = : n, for j = : n, V ij = min(u ij,u ik + U kj ); end end U = V ; end B = U Figuur 20: Floyd-Warshall algoritme. afstandsmatrix A, waarin A ij de gegeven lengte van een (onbekend) pad voorstelt van v i naar v j, en de output een n n matrix B. Bewijs dat voor alle i en voor alle j, B ij de kortst mogelijke afstand voorstelt van v i naar v j. Ga ook na dat deze matrix wordt gevonden na O(n ) bewerkingen. De afstandstabel in Figuur 2 is overgenomen uit een oude druk van het Beste Boek van de Weg. Ga na dat niet alle afstanden in deze tabel kortste afstanden zijn. (Hint: Pas het Floyd-Warshall algoritme toe op deze tabel.) Opdracht 5 Zij gegeven een graph G = (V,E). Zoals bekend is er geen efficiënt algoritme voor het vinden van een Hamiltoncircuit in G. Wat is er mis met de volgende aanpak? Stel dat V = (v, v 2,..., v n ). Vorm een huwelijksnetwerk N met links en rechts de knopen v i ( i n); om de knopen links en 20
2 Figuur 2: Afstandstabel voor 25 steden in Nederland. Amersfoort Amsterdam Apeldoorn Arnhem Assen Bergen op Zoom Breda Eindhoven Enschede Den Haag Groningen Haarlem Den Helder Den Bosch Hilversum Leeuwarden Maastricht Middelburg Nijmegen Roermond Rotterdam Utrecht Winterswijk Zutphen Zwolle Amersfoort 0 7 7 6 9 2 86 8 6 67 26 7 8 7 90 76 6 78 20 09 65 70 Amsterdam 7 0 89 92 62 00 25 56 57 8 20 79 87 0 2 207 75 09 68 77 0 5 07 0 Apeldoorn 7 89 0 25 08 67 0 0 7 28 09 5 88 65 29 76 222 2 27 25 67 66 22 Arnhem 6 92 25 0 2 5 08 78 85 6 57 2 7 6 6 5 5 200 7 02 59 6 66 Assen 9 62 08 2 0 262 225 20 0 2 25 82 9 95 56 68 28 5 9 2 27 59 08 69 Bergen op Zoom 2 67 5 262 0 7 9 20 8 287 2 97 82 9 265 8 59 28 57 0 209 76 9 Breda 86 00 0 08 225 7 0 57 9 75 250 79 5 82 228 7 96 9 07 9 66 72 9 56 Eindhoven 25 0 78 20 9 57 0 6 27 25 20 8 07 22 25 5 6 50 0 9 2 09 Enschede 56 7 85 0 20 9 6 0 95 5 76 25 8 2 55 27 285 02 87 92 0 5 7 Den Haag 8 57 28 6 2 8 75 27 95 0 26 0 72 82 62 2 77 26 6 80 6 5 Groningen 6 8 57 25 287 250 25 5 26 0 99 7 220 78 58 09 0 7 259 22 8 68 9 Haarlem 67 20 09 2 82 2 76 99 0 7 0 9 226 65 0 8 67 56 7 27 2 Den Helder 26 79 5 7 9 97 79 20 25 7 7 0 66 09 89 289 28 88 27 0 9 220 76 Den Bosch 7 87 88 6 95 82 5 8 8 0 220 0 66 0 69 25 2 6 8 79 5 27 9 29 Hilversum 8 0 65 6 56 9 82 07 2 72 78 9 09 69 0 6 92 72 8 50 7 6 27 8 88 Leeuwarden 7 2 29 5 68 265 228 22 55 82 58 89 25 6 0 06 06 7 256 208 62 8 9 9 Maastricht 90 207 76 5 28 8 7 25 27 62 09 226 289 2 92 06 0 2 5 50 9 76 2 8 28 Middelburg 76 75 222 200 5 59 96 5 285 2 0 65 28 72 06 2 0 87 20 98 56 26 2 26 Nijmegen 6 09 2 7 9 28 9 6 02 7 0 88 6 8 7 5 87 0 85 76 8 8 8 Roermond 68 27 02 2 07 50 87 77 259 8 27 8 50 256 50 20 85 0 5 66 68 Rotterdam 78 77 25 27 57 9 0 92 26 22 67 0 79 7 208 9 98 5 0 58 77 8 Utrecht 20 0 67 59 59 0 66 9 6 8 56 9 5 6 62 76 56 76 58 0 2 85 90 Winterswijk 09 5 66 6 209 72 2 0 80 68 7 220 27 27 8 2 26 8 66 77 2 0 92 Zutphen 65 07 22 08 76 9 09 5 6 27 76 9 8 9 8 2 8 85 0 8 Zwolle 70 0 66 69 9 56 7 5 9 2 29 88 9 28 26 8 68 8 90 92 8 0
rechts van elkaar te onderscheiden noemen we de i-de knoop links v i en rechts v i. We verbinden v i en v j in N als tak (v i,v j ) tot E behoort. Merk op dat een Hamiltoncircuit in G direct aanleiding geeft tot een complete matching in N. Om uit te vinden of een complete matching bestaat gaan we na of er n huwelijken mogelijk zijn door het maximale aantal huwelijken te bepalen. Hiervoor hebben we immers een efficiënt algoritme. Als n huwelijken mogelijk zijn dan leveren de betreffende takken in G een Hamiltoncircuit op. Opdracht 6 Bewijs Stelling.. (Hint: Toon eerste aan dat het aantal knopen in een knoopoverdekking nooit kleiner is dan het aantal mogelijke huwelijken. Let er verder op dat de gelabelde meisjes en de ongelabelde jongens in het hulpnetwerk van een maximale stroom een knoopoverdekking vormen.) Opdracht 7 Bewijs op minstens twee verschillende manieren dat het maximale aantal huwelijken in het netwerk van Figuur 22 gelijk is aan. m 6 j 5 j j j 2 j m 5 m m m 2 m Figuur 22: Een huwelijksprobleem. Opdracht 8 ( Gewogen matching) In veel toewijzingsproblemen heeft elke tak een gewicht c jm en gaat het om het vinden van een matching waarvoor de som van de gewichten c jm van de takken (j,m) in de matching minimaal (of maximaal) is. Door middel van gewichten kan men bijvoorbeeld de intensiteit van een vriendschap in een huwelijksnetwerk modelleren, of in het 22
pilotenprobleem van Vraagstuk 5 de geschiktheid van een piloot om een bepaald vliegtuig te besturen. Bij wijze van voorbeeld beschouwen het probleem van Vraagstuk 5, maar nu drukken we voor elke piloot de geschiktheid om een vliegtuig te besturen uit met een getal tussen 0 en 0: Probeer een toewijzing te vinden met een zo Type Type 2 Type Type Type 5 piloot 9 6 7 0 0 piloot 2 0 8 9 2 piloot 5 6 7 piloot 2 7 9 7 6 piloot 5 5 6 9 9 piloot 6 6 5 0 Figuur 2: Vliegbekwaamheid van de piloten. hoog mogelijke score. Los dit probleem ook op met behulp van de software NETFLO op de NEOS web site http://www-neos.mcs.anl.gov/neos/solvers/lno:netflo/ en vergelijk beide resultaten. Literatuur [] R. K. Ahuja, T.L. Magnanti, and J.B. Orlin. Network Flows: Theory, Algorithms, and Applications. Prentice-Hall, Englewood Cliffs, New Jersey, 99. [2] V.K. Balakrishnan and C. Moire. Network Optimization, volume 2 of Chapman and Hall Mathematics Series. CRC Press, Inc, UK, 995. [] M.O. Ball, T.L. Magnanti, Monma C.L., and G.L. Nemhauser. Network Models. Elsevier Science, Amsterdam, 995. [] D.P. Bertsekas. Network Optimization: Continuous and Discrete Models. Athena Scientific, P.O. Box 9, Belmont, MA, USA, 998. [5] D.Z. Du and P. M. Pardalos. Network Optimization Problems: Algorithms, Applications And Complexity, volume 2 of Series on Applied Mathematics. World Scientific Publishing Company, Incorporated, 99. 2
[6] Fred Glover and Nancy V. Phillips. Network Models in Optimization and Their Applications in Practice. John Wiley & Sons, UK, 992. [7] D. König. Theorie der endlichen und unendlichen Graphen. Reprinted by Chelsea in 950, New York, USA, 96. [8] A. Schrijver. Combinatorial Optimization. Polyhedra and Efficiency. Springer, Berlin, 200. volumes. [9] V.M. Tikhomirov. Stories about Maxima and Minima. Translated from the Russian by Abe Shenitzer. Series Mathematical World, Volume. American Mathematical Society, 990. 2