Kezdőoldal » Számítástechnika » Programozás » Gráf minden lehetséges módon...

Gráf minden lehetséges módon történő bejárása egy algoritmussal segítség (hosszú lesz)?

Figyelt kérdés

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.

[link]


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).



2016. ápr. 29. 15:11
 1/5 anonim ***** válasza:
100%

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.

2016. ápr. 29. 15:30
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:
100%

1. A folyamatokat iranyitott kormentes ("hurok"mentes) grafokkal szoktak abrazolni:

[link]


2. Ha maradnak a korok, akkor nem bejarast, hanem Euler-utakat keresunk. Errol itt irnak:

[link]

2016. ápr. 29. 15:41
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

Hátha ez is segít:

[link]

2016. ápr. 29. 15:55
Hasznos számodra ez a válasz?
 4/5 A kérdező kommentje:
Köszönöm a válaszokat, most átrágom magam rajtuk.
2016. ápr. 29. 16:32
 5/5 anonim ***** válasza:

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.

2016. ápr. 29. 17:56
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!