Gráf minden lehetséges módon történő bejárása egy algoritmussal segítség (hosszú lesz)?
Nos technikailag nem egy gráfról van szó, hanem egy folyamatábráról.
Csináltam egy példát, a nyilakat megjelöltem betűkkel.
A "gombócok" és a nyilak olyan objektumok, amiknek tudom állítani a láthatóságát és az a cél, hogy a folyamat haladásának minden egyes lehetséges állásáról csináljak egy-egy képet. Tehát az első lépésben csak a start látszik, erről képernyőmentés, aztán a következőben a belőle kivezető nyíl és az ahhoz tartozó állomás is megjelenik, ismét képernyőmentés és így tovább.
A technikai részletekkel nincsenek bajok, nem ez a probléma, magával az algoritmussal van gondom.
Úgy álltam neki, hogy az összes nyílról csinálok egy tömböt (vagy akármit) amiben tárolom, hogy az ő célállomásából hová lehet tovább menni. Tehát a fenti példa esetében:
honnan - hová
a - b
a - e
b - c
c - d
c - i
És így tovább. Tehát ha egy nyíl végpontjából több fele lehet menni, akkor többször szerepel a tömbben, csak a "hová" része változik meg (ugye az a-ból b és e irányba tudunk menni).
Ami a jelenlegi ötletem:
Az előző körben megjelent állomásból véletlenszerűen választ egy lehetséges kivezető utat, aztán elindul rajta, amíg úgy nem érzi, hogy nincs tovább út. Közben végig figyeli, hogy olyan helyről megy-e tovább, ahol lehetséges lenne másik irányba is menni. Ha végigért és nem tud továbbmenni, akkor a legutolsóként észlelt elágazásból azt az utat törli a fenti tömbből amin elindult és visszaáll az alapállapotba a gombócok és nyilak láthatósága, majd megint nekiindul a program.
Amiatt, hogy töröltem a tömbből a legutolsó elágazás már bejárt útját, nem tud megint ugyan azon az útvonalon végigfutni.
Ez eddig mind szép és jó. Nagy nehezen még a hurkokat is le tudtam kezelni, vagy legalábbis elsőre azt gondoltam.
Nézzünk egy példa lefutást, hogy megértsétek, mi a baj ezzel.
1. lépés: start megjelenik
2. lépés: "a" megjelenik és a hozzá tartozó gombóc is - észleli a program, hogy az "a" nyíl után elágazás van, megjegyzi, hogy ez a legutolsó elágazás
3. lépés: "b" irányba indul a program, a hozzá tartozó gombóc megjelenik.
4. lépés: "c" megjelenik, a hozzá tartozó gombóc is - a program észleli, hogy elágazáshoz értünk, most már ez a megjegyzett legutolsó elágazás
5. lépés: "d" megjelenik, a cél is, a program észleli, hogy nincs tovább - fogja a legutolsó elágazásnál választott irányt és kitörli a tömbből. Vagyis kitörlődik a "c - d". A program visszaáll alapállapotba és a starttól indulva megint elkezdi ezt csinálni. Az hogy közben lesznek olyan képernyőmentések, amik már esetleg szerepeltek korábban nem probléma, ezt tudom kezelni.
Na a probléma ott jön, hogy ha megint futtatom a programot. Fut az a-e-f-x-c útvonalon és az előbbi törlés miatt (c - d) nem lesz képes "d" irányba menni a c pontból, pedig az az előzőhöz képest már bejárási módot jelentene.
Na, erre valami ötlet kéne. Javítani ezen hogy tudnék? Vagy dobjam a kukába az egészet, mert teljesen rosszul kezdtem el? Ajánlanátok esetleg módszert ehhez, vagy valami tippet hol keressek (a gráf bejárás témát már szénné rágtam a Googlen).
Nem kell semmit törölni, egyszerű backtracking kell hozzá.
Minden állomáshoz eltárolod a kivezető nyilakat egy tömbben. Ezután nincs semmi dolgod, mint végigiterálni rajtuk rekurzívan. Elindulsz az elsőn, és mindig a tombök első elemén mész tovább. Ha olyan pontra érsz, ahonnan nem tudsz sehova menni, viszsalépsz egy mezővel, és a tömb következő elemén mész tovább. Ezzel az algoritmussal minden lehetséges bejárást megvalósítasz.
Néz utána: Formális nyelvek - Reguláris nyelvek (automata)
Lényegében a nyilak betűket reprezentálnak. Tehát: Ha végig olvasod az úton fellelhető betűket, akkor kapsz egy szót.
Azaz szavakról tudod megmondani, hogy helyes-e a szó az automatán.
Tehát az input nem gráf, hanem szó. A gráf meg egy nyelvet határoz meg.
Pl.: "aefgihd"
Ez egy Valid szó. Feltételezzük, hogy ugyanoda visszatérhetünk. Persze ez fordítva működik mint amire te pontosan kíváncsi vagy. Itt véges a futás, tehát a huroktól nem lesz végtelen, mert az input szó véges. Ha teszem azt a szavunk: "ad" akkor, "d" út nincs a 2. pontról, ezért Invalid.
De: Ha az a kérdés, hogy a gráfból milyen szavak generálhatók, akkor pointeres megoldás.
Minden elemnek van egy index-e, és abból kimenő utak. Minden útnak van egy index karaktere és egy cél index-e, ami egy elemre mutat. De ezeket már mondták feljebb.
Gondoltam bevezetem a Formális nyelveket, mert ilyen téren van értelme a feladat fordítottján gondolkodni is.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!