„Országos” feladat
Feladat: Egy tetszőleges, színes országokat tartalmazó térképen akar eljutni egy kommandós csapat egy országból egy másikba. Viszont egy országon csak úgy mehetnek át, hogy ugyanolyan színű ruha van rajtuk mint az ország színe. Céljuk az, hogy minél kevesebb ruhát vigyenek magukkal. Egy példa (jussunk el ‘1’-ből ‘7’-be) : Színek száma: 2
A tesztadat (ez a térképrészlet) : … … … „élfile” Egy sora: 2 szomszédos ország sorszáma „csúcsfile” Egy sora: ország sorszáma, 2 koordinátája, színe
A megjelenítőnk használatamegjelenítő A „csúcsfile”-t a v.txt néven, az „élfile”-t az e.txt néven a program könyvtárába kell beletenni. A saját programunk készítsen egy r.txt nevű (eredmény) file-t, melyben a kijelölni kívánt csúcsok azonosítói vannak. Az r.txt file-t is tegyük bele program könyvtárába, ezen csúcsokat fogja megvastagítani.
Az algoritmus módosítása költség: Az érintett színek halmazának számossága d[i]: költség, és a színek halmaza π[i]: Továbbra is az i. csúcs megelőzője az úton c(i, j): Egy függvény lesz, mely 1-et ad ha az i-ig tartó út között nem szerepelt j színe, egyébként 0. Az első gondolat lehet a Dijkstra algoritmus felhasználása Ez feszítőfát ad, melyből könnyen meghatározható a keresett út. A feladat egy lehetséges megvalósítása
Példa a működésre ∞,{P} 1,{Z} ∞,{K}∞,{Z} ∞,{K} ∞,{S} ∞,{Z} 2,{Z, P} 2,{K, Z} 3,{Z, P, S} 2,{K, Z}
Egy hiba: ‘1’-ből ‘5’-be: Megoldás: 2
Egy hiba: ‘1’-ből ‘5’-be: ‘1’-ből ‘7’-be: Megoldás: 2 Megoldás: 43 Mit jelent ez?
A hiba elemzése 1,{P} 2,{P, S} 3,{P, S, Z} 4,{P, S, Z, K} 2,{P, Z}3,{P, Z, K} A legkisebb költségű út nem a fenti Az egész út részeire nem feltétlenül teljesül hogy azok minimális költségűek A Dijkstra algoritmus nem megfelelő a problémára Következtetés
A feladat egy második lehetséges megvalósítása Egy függvény rendeljen prímeket a csúcsokhoz. Pl.: zöld 5, kék 7, piros 13. Rakjuk bele egy szin[] tömbbe. 0;ha S[i][j]=0 T[i][j]:= szin[j];egyébként Bellmann-Ford algoritmus „*”-sal és „kevesebb osztó” feltétellel. A végen csak d[i]-n kell leellenőrizni hogy szin[]-ben szereplő prímek közül melyik osztja. A multiplicitás nem zavar be az osztók számításánál. szin[1..4]:=[5,7,7,13] S {0,1} n n RZnnRZnn Az előbbi ok miatt ez sem működik!!!
Ellenpélda listás megoldásra Az alábbi ábra egy olyan ellenpéldát vázol fel, ahol az algoritmustól, és az adat ábrázolástól függően hibás eredményt kaphatunk listás megoldás esetén. A start csúcs legyen az 1-es, a cél pedig a 10-es. Az 1-esből a 6-os csúcsig mindenképp 2 szín felhasználásával jutunk el. Programtól függően a 3 lehetséges megoldás egyikét választjuk, amelyek egyformán jónak tűnnek. A 6-osból a 10-esig egy újabb szín felhasználása szükséges, bármely útvonalat is választjuk. De amennyiben az 1-es és 6- os csúcs közötti útvonal a 4-es csúcson át vezetett (szerencsénk volt), akkor most nem kell új színt bevenni a listába, ha a 7-es csúcson át megyünk a 10-es csúcsba. Tehát megállapítható, hogy a végső optimális útvonal nem áll össze optimális részútvonalak összegeként.
Egy másik feladat: legkevesebb átöltözés Probléma: olyan útvonal keresése, ahol a legkevesebb alkalommal lépünk más színű szomszédos csúcsra. A csúcsokat szintek szerint osztályozzuk, az alábbi elgondolás szerint: A start csúcs kerül a 0. szintre. Ennek a csúcsnak minden szomszédját végignézzük. Amennyiben a vizsgált szomszéd ugyanolyan színű, akkor bekerül a 0. szintre, ha más színű, akkor az első szintre. A 0. szintre bekerült csúcsokra szintén megcsináljuk az eljárást, egészen addig, amíg végig nem nézzük az összes ilyen csúcsot. Ekkor átlépünk az 1. szinten levő csúcsokra, és hasonlóan végigcsináljuk az algoritmust, egy szint csúsztatással (ugyanolyan színű: 1. szint, más színű: 2. szint). Az algoritmust addig végezzük, amíg el nem jutunk a cél csúcsig. Olyan csúcsot már természetesen nem kell vizsgálni, amelyet már egyszer vizsgáltunk. Adatraktározás: szülő, súly: megegyezik a szint számával. Amennyiben nincsenek egyforma színű csúcsok egymás mellett, akkor az algoritmus visszaad egy legrövidebb utat (bal oldali ábra), ha vannak ilyen csúcsok, akkor a legkevesebb színváltásnak megfelelő egyik legrövidebb utat, ami természetesen nem feltétlenül egyezik meg a tényleges legrövidebb úttal (jobb oldali ábra).
Jelölések röviden A feladat egy harmadik lehetséges megvalósítása A gráf csúcspontjaiban többszörös „címkézést” használtam. Egy címke egy ( Szülő, H ) rendezett pár, ahol a Szülő V, az a csúcs ahonnan elértem a címkézett csúcsba. H a színhalmaz egy részhalmaza, olyan színeket tartalmaz, melyek előfordultak csúcsba vezető út folyamán.
Algoritmus animáció (-,{1}) (A,{1,2}) (A,{1}) (B,{1,2}) (E,{1,3}) (E,{1,4}) (C,{1,2}) (C,{1,2,3}) (D,{1,3}) (C,{1,2,3}) (F,{1,2,4}) (G,{1,2})
Részhalmazok: elemszám szerint növekvő sorrendben A feladat egy negyedik lehetséges megvalósítása Szélességi bejárás a gráfon a részhalmazban szereplő színek szerint Első találat: Valóban a legkevesebb színt igénylő út Hátránya: Sok szín esetén gyakorlatilag alkalmazhatatlan Legrövidebb út megtalálása a színek halmazának részhalmazait reprezentáló, 0-ból és 1-esekből álló sorozatok segítségével.