Algoritmusok és optimalizálás

Mohó algoritmusok, legrövidebb utak és minimális súlyú feszítőfák

A hálózatok és gráfok optimalizálása a modern matematika egyik leggyakorlatiasabb ága. Ebben a modulban a mohó stratégiák alkalmazását vizsgáljuk, különös tekintettel a legrövidebb utak (például Dijkstra algoritmusa) és a minimális súlyú feszítőfák (Kruskal- és Prim-algoritmusok) meghatározására. Bár a mohó algoritmusok helyi optimumok mentén döntenek, ezen a területen sokszor globális optimumot eredményeznek. Ezek az elvek az emelt szintű érettségi kulcsfontosságú elemei, melyek az útvonaltervezéstől a hálózatépítésig számtalan helyen előfordulnak.

1
Milyen elven működik a Kruskal-algoritmus a minimális súlyú feszítőfa meghatározásakor?
A Kruskal-algoritmus egy mohó stratégia. A gráf összes élét súlyuk szerint növekvő sorrendbe állítja, majd sorban megvizsgálja őket. Minden lépésben hozzáadja az adott élt a feszítőfához, feltéve, hogy az nem hoz létre kört a már kiválasztott élekkel. Ezt az eljárást addig folytatja, amíg a kiválasztott élek száma pontosan $n-1$ nem lesz, ahol $n$ a csúcsok száma.
2
Mely esetekben nem garantálja Dijkstra algoritmusa a legrövidebb út megtalálását egy irányított gráfban?
Dijkstra algoritmusa nem alkalmazható megbízhatóan olyan gráfokban, amelyek negatív súlyú éleket tartalmaznak. A mohó természetéből fakadóan az algoritmus feltételezi, hogy egy már rögzített (véglegesített távolságú) csúcshoz nem vezethet rövidebb út a későbbiekben. Negatív élek jelenléte esetén ez a feltételezés megdőlhet.
3
Egy kitalált országban a pénzérmék címletei 1, 3 és 4 egység. Adjon példát olyan kifizetendő összegre, ahol a mohó stratégia (mindig a legnagyobb lehetséges érmét választva) nem a minimális érmeszámot adja eredményül.
Legyen a kifizetendő összeg 6 egység. A mohó algoritmus először választ egy 4-es érmét, ekkor marad 2 egység, amit két darab 1-es érmével tud kifizetni. Így a felhasznált érmék száma 3 darab ($4+1+1$). A valódi optimális megoldás azonban két darab 3-as érme felhasználása ($3+3=6$), ami mindössze 2 érmét jelent.
4
Hány élt tartalmaz egy $n$ csúcsú, összefüggő gráf bármelyik feszítőfája?
Egy $n$ csúcsú összefüggő gráf minden feszítőfája (súlyoktól függetlenül) pontosan $n-1$ élt tartalmaz. Ha ennél kevesebb lenne, a gráf nem lenne összefüggő, ha pedig több, akkor a gráf biztosan tartalmazna kört, így nem lenne fa.
5
Miben különbözik Prim algoritmusa Kruskal algoritmusától a feszítőfa építése során?
Kruskal algoritmusa az élek halmazából indul ki, és egy "erdőt" épít, amelynek komponensei a folyamat végén egyetlen fává olvadnak össze. Prim algoritmusa ezzel szemben egyetlen, egyre növekvő fát épít fel úgy, hogy egy kezdőcsúcsból kiindulva mindig azt a legkisebb súlyú élt adja hozzá, amely a már megépített fát egy még nem vizsgált csúccsal köti össze.
6
Egy összefüggő gráf minden élének súlya páronként különböző. Mit állíthatunk a gráf minimális súlyú feszítőfájának egyértelműségéről?
Ha egy összefüggő gráfban minden él súlya különböző, akkor a gráfnak pontosan egy (egyértelmű) minimális súlyú feszítőfája van. Ezt könnyen beláthatjuk a vágási tulajdonság (cut property) alkalmazásával, mivel minden lehetséges vágásnál egyértelműen meghatározható egy szigorúan legkisebb súlyú él.
7
Adott egy súlyozott gráf, és benne egy tetszőleges kör. Mit mondhatunk a kör szigorúan maximális súlyú éléről a minimális súlyú feszítőfa szempontjából?
Az úgynevezett kör-tulajdonság (cycle property) kimondja, hogy egy kör egyértelműen maximális súlyú éle biztosan nem szerepelhet egyetlen minimális súlyú feszítőfában sem. Ha szerepelne, akkor azt elhagyva a kör egy másik élével helyettesíthetnénk, ezáltal csökkentve a fa összsúlyát.
8
Milyen mohó stratégiával oldható meg optimálisan az "intervallum-kiválasztási probléma", ahol a legtöbb, egymást időben nem átfedő tevékenységet kell kiválasztani?
A helyes és optimális mohó stratégia az, hogy a tevékenységeket a befejezési idejük szerint növekvő sorrendbe rendezzük. Mindig a legkorábban befejeződő, a már kiválasztottakkal nem ütköző tevékenységet választjuk. Ez biztosítja, hogy a lehető legtöbb szabad idő maradjon a további tevékenységek számára.
9
Hogyan módosítaná Kruskal algoritmusát, ha nem a minimális, hanem a maximális súlyú feszítőfát szeretné megtalálni?
A módosítás rendkívül egyszerű. Az éleket nem növekvő, hanem csökkenő sorrendbe kell rendezni a súlyuk alapján. Ezt követően az algoritmus logikája változatlan marad: mindig a legnagyobb elérhető súlyú élt adjuk a fához, amennyiben az nem zár be kört.
10
Egy $V$ csúcsú gráfban a legrövidebb utak keresésekor Dijkstra algoritmusának futtatása során mi a feltétele annak, hogy egy csúcs végleges távolságát megtaláltuk?
Egy csúcs távolsága akkor válik véglegessé, amikor a még nem véglegesített csúcsok közül a legkisebb aktuális távolságértékkel rendelkezik, és emiatt az algoritmus kiválasztja feldolgozásra. Mivel az élsúlyok nem negatívak, egyetlen más, hosszabb részúton keresztül sem lehet a későbbiekben rövidebb utat találni ehhez a csúcshoz.
11
Mi a Bellman-Ford algoritmus legfőbb előnye Dijkstra algoritmusával szemben a legrövidebb utak keresésekor?
A Bellman-Ford algoritmus képes kezelni a negatív súlyú éleket is (amíg nem alkotnak negatív összsúlyú kört). Továbbá az eljárás képes detektálni, ha a gráfban negatív súlyú kör található, míg Dijkstra algoritmusa ilyen esetekben téves eredményt adna.
12
Egy összefüggő gráf minden élének súlya megegyezik. Mely részgráfok alkotnak minimális súlyú feszítőfát ebben az esetben?
Ebben az extrém esetben a gráf bármelyik feszítőfája egyben minimális súlyú feszítőfa is. Mivel minden feszítőfa pontosan $n-1$ élt tartalmaz, és minden él azonos súlyú, az összes lehetséges feszítőfa összsúlya egyenlő lesz.
13
Alkalmazható-e a mohó algoritmus (azaz mindig a legközelebbi, még nem érintett városba lépés) az utazó ügynök problémájának (TSP) optimális megoldására?
Nem alkalmazható. A legközelebbi szomszéd elve (Nearest Neighbor) egy tipikus mohó heurisztika, amely gyors, de az utazó ügynök problémája esetén nagyon ritkán adja meg a globális optimumot. A mohó lépések az út végére gyakran kényszerítik az ügynököt egy extrém hosszú él használatára a visszatéréshez.
14
Hogyan oldható meg optimálisan a töredékes (folytonos) hátizsák-probléma mohó stratégiával?
A töredékes hátizsák-probléma esetén a tárgyakat az "egységnyi súlyra eső értékük" (fajlagos érték) szerint kell csökkenő sorrendbe rendezni. A mohó algoritmus sorban beleteszi a legértékesebb tárgyakat a hátizsákba teljes egészében, amíg férnek. Amikor egy tárgy már nem fér be teljesen, a maradék kapacitást feltölti a tárgy megfelelő törtrészével.
15
Mit mond ki a minimális feszítőfákra vonatkozó "vágási tulajdonság" (cut property)?
Ha a gráf csúcsait két diszjunkt halmazra bontjuk (ez egy vágás), akkor a két halmazt összekötő élek közül a legkisebb súlyú él biztosan része lesz a minimális súlyú feszítőfának. Ez a tulajdonság adja a Prim-algoritmus helyességének matematikai alapját.
16
Lehetséges-e, hogy egy összefüggő gráfnak több minimális súlyú feszítőfája van, de a bennük szereplő élek súlyainak halmaza (multiplicitással, azaz a gyakoriságot is számítva) különbözik?
Nem, ez nem lehetséges. Bár egy gráfnak lehet több minimális súlyú feszítőfája (ha vannak azonos súlyú élek), matematikailag bizonyítható, hogy minden minimális súlyú feszítőfa pontosan ugyanazokat az élsúlyokat tartalmazza, pontosan ugyanannyiszor.
17
Egy hálózatban a kapcsolatok sávszélessége adott. Milyen módosított algoritmussal kereshető meg két pont között az az útvonal, amelyen a minimális sávszélesség a lehető legnagyobb (legszélesebb út probléma)?
A probléma megoldható Dijkstra algoritmusának módosításával. A távolságok összeadása helyett a részúton lévő minimális élsúlyt (a szűk keresztmetszetet) tartjuk nyilván, a csúcsok frissítési szabálya pedig az útvonalak sávszélességének maximalizálására változik: $S(v) = \max(S(v), \min(S(u), \text{súly}(u,v)))$. Másik lehetséges megoldás a maximális súlyú feszítőfa megkeresése Kruskal algoritmussal, a fában futó egyetlen út a két pont között a keresett optimális út lesz.
18
Miért nem alkalmazható Dijkstra algoritmusa a leghosszabb út megkeresésére egy tetszőleges (akár köröket is tartalmazó) gráfban, még akkor sem, ha az élsúlyokat negáljuk?
Ha az élsúlyokat negáljuk a leghosszabb út megkereséséhez, a gráfban könnyen kialakulhatnak negatív összsúlyú körök (ha eredetileg volt pozitív súlyú kör). Dijkstra algoritmusa eleve képtelen kezelni a negatív éleket, a negatív körök pedig végtelenül hosszú látszólagos utakat eredményeznek. A leghosszabb út problémája általános gráfokon NP-teljes feladat.
19
Egy érmerendszer "kanonikus", ha a mohó algoritmus mindig optimális megoldást ad a kifizetéshez szükséges minimális érmeszámra. A magyar forint érméi (5, 10, 20, 50, 100, 200) vajon kanonikus rendszert alkotnak-e?
Igen, a jelenlegi magyar forint érmerendszere kanonikus. Ennek az az oka, hogy a címletek jól skálázódnak (jellemzően 2-szeres, illetve 2,5-szeres ugrásokkal követik egymást), így sosem áll elő olyan szituáció, ahol egy nagyobb érme kihagyásával és kisebbek halmozásával kevesebb darabszámból lehetne kifizetni a kért összeget.
20
Bizonyos hálózati esetekben egy összefüggő gráf élsúlyai kizárólag a 0 vagy 1 értékeket vehetik fel. Hogyan egyszerűsödik Dijkstra algoritmusa egy ilyen speciális gráfban?
Ebben az esetben Dijkstra algoritmusa egy úgynevezett 0-1 BFS (Szélességi Keresés) algoritmussá egyszerűsíthető le. A prioritási sor (priority queue) helyettesíthető egy egyszerű kétvégű sorral (deque). Ha egy csúcsot egy 0 súlyú élen érünk el, az a sor elejére kerül, ha 1 súlyú élen, akkor a sor végére. Ezzel az időbonyolultság $O(V + E)$-re csökken.