4.5.1. A gráfok implementációja
Az A szomszédsági mátrix aij eleme lehetne logikai érték, attól függően, hogy az i. és j. pont között van-e él. Természetesen az értékek lehetnének számok, a többszörös élek megjelenítésével akár nem csak 0-k vagy 1-ek. A nem irányított gráf mátrixa biztosan szimmetrikus a főátló szerint. A szomszédsági mátrixban az élek tárolása ritka gráf esetén igencsak gazdaságtalan, ugyanakkor könnyen karbantartható és gyorsan lekérdezhető. Ha csak a meglévő éleket tároljuk el gazdaságossági megfontolásból (2 vektor is elegendő ennek megoldására), akkor nehézkesebb lesz az élek felvitele és törlése, valamint több keresést igényelnek majd a lekérdezések.
Tekintsünk egy irányított gráfot. A 6 pont között kifeszített élek nem mindegyike kétirányú, de a kétirányúakat is egy vonallal, egy irányítás nélküli vonallal jelöljük.
A pontból pontba tartó közvetlen élek meglétét (+/-, igen/nem értékekkel) mátrixban tárolhatjuk, mely jelen esetben nem szimmetrikus (hiszen a gráf nem irányítatlan), és csupa '-' van a főátlójában (mert nincs benne hurok). Megegyezünk abban, hogy a mátrix i. sorában és j. oszlopában az i. pontból a j. pontba vezető élről tárolandó értéket (mint van/nincs vagy 0/n darab) tartjuk. A mátrix megnevezése szomszédsági mátrix vagy csúcsmátrix. A mátrixról mondhatjuk, hogy ritka, amennyiben kevés az él a gráfban.
|
A |
B |
C |
D |
E |
F |
A |
- |
+ |
+ |
- |
- |
- |
B |
- |
- |
+ |
+ |
- |
- |
C |
- |
- |
- |
- |
+ |
- |
D |
- |
- |
- |
- |
+ |
- |
E |
- |
- |
+ |
+ |
- |
+ |
F |
- |
- |
- |
- |
+ |
- |
A gráf éleinek tárolása
Tárolhatjuk csak a létező éleket a helyigény csökkentése miatt. A két mátrix egyikében a pontokat, a másikban a sorszámozott éleket tartjuk, például a kezdőpontok szerinti sorrendben:
pontok: |
A |
B |
C |
D |
E |
F |
a pontból
induló 1. él mutatója: |
1. |
3. |
5. |
6. |
7. |
10. |
Az alábbi lista segítségével írjuk fel az élek vektorát:
honnan |
hová |
A |
B, C |
B |
C, D |
C |
E |
D |
E |
E |
C, D, F |
F |
E |
élek: |
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
végpont |
B |
C |
C |
D |
E |
E |
C |
D |
F |
E |
Hálózat
Amikor az él más jellemző(ke)t is képvisel, a gráfot hálózatnak vagy súlyozott gráfnak nevezzük (bár nagyon gyakran mégsem teszünk kivételt). Ilyen jellemző lehet: a költség, munkaóra, távolság, időtartam stb. Természetesen ilyenkor a pontoknak is lehetnek jellemzői: koordináták, besorolás vagy minősítés, indulás vagy végzés időpontja stb.
Például több egymásra épülő munkafázisból felépülő munkafolyamat egyes pontjai az egyes munkafázisok kezdő- és végeseményei, miután az élek valójában a munkafázisok, melyeken konkrétan az időtartamok a súlyok. Más szakon elvárás a kritikus út megkeresésének módszere, mely azt az utat határozza meg a hálózat kiindulási és végső pontja között, amelynek egyik fázisában sem lehet csúszni, azaz az egyes események legkorábbi és legkésőbbi bekövetkezése között nincs különbség.
Súlyozott gráf ábrázolása
Tekintsük a fenti irányított gráfot súlyozott élekkel. A 6 pont között kifeszített élek most a közvetlen távolságot hordozzák. A kétirányú éleket továbbra is egy vonallal jelöljük, mert az oda- és visszafelé tartó út hossza jelen esetben egyforma.
A súlyozott gráf mátrix-reprezentációja
Egyik pontból sem vezet él önmagába, tehát a P pontból a Q pontba irányított élek súlya táblázatban elhelyezve egy olyan táblázatot eredményez, melynek a főátlójában csupa 0 van. A táblázat nem szimmetrikus a főátlóra, hiszen nem minden él kétirányú. A nem közvetlen kapcsolatok hossza egyelőre ismeretlen; minimalizáló számításokra felkészülve a kiindulási mátrixban végtelen vagy egy elég nagy szám kerül a helyükre.
|
A |
B |
C |
D |
E |
F |
A |
0 |
10 |
20 |
|
|
|
B |
|
0 |
50 |
30 |
|
|
C |
|
|
0 |
|
20 |
|
D |
|
|
|
0 |
20 |
|
E |
|
|
20 |
20 |
0 |
40 |
F |
|
|
|
|
40 |
0 |
A súlyozott gráf éleinek tárolása
A pontoknak most nincs semmilyen jellemzője, de az élek jellemzője a távolság:
pontok: |
A |
B |
C |
D |
E |
F |
a pontból
induló 1. él mutatója: |
1. |
3. |
5. |
6. |
7. |
10. |
a pont
jellemzője |
|
|
|
|
|
|
élek: |
1. |
2. |
3. |
4. |
5. |
6. |
7. |
8. |
9. |
10. |
végpont |
B |
C |
C |
D |
E |
E |
C |
D |
F |
E |
távolság |
10 |
20 |
50 |
30 |
20 |
20 |
20 |
20 |
40 |
40 |
Szakmai kihívásként a szakképzés folyamán többször kell majd megkeresni a két pont közötti legrövidebb utat, vagy az egyik pontból az összes többibe tartó minimális utat, esetleg a minden pontot tartalmazó minimális feszítőfát, amelyben az utak súlyainak összege a lehető legkisebb.
Segítségképpen már itt megismerkedhetünk két matematikai módszerrel, melyek számítógépes algoritmusát valamely szaktárgy keretében el is kell készíteni.
Alapfeladat: egy adott pontból akarjuk egy konkrét hálózat összes többi pontját ellátni a lehető legrövidebb úton, amikor a lehetséges pont-párok közötti távolságok ismertek.
A konkrét hálózat bármit képviselhet (úthálózaton gyakran szállítanak vagy sűrűn közlekednek, vezetéken gázt vagy áramot szolgáltatnak, kábelen elektromos jeleket küldenek), és a pontok közti távolság sem kizárólag hosszúság lehet, hanem az egyik pontból a másikba való eljutás/eljuttatás időtartama, vagy az eljutáshoz szükséges erőforrások mennyisége, költsége, ezért a minimális út szinonimája nemcsak a legrövidebb, hanem a legkevesebb vagy a legolcsóbb is lehetne.
Megoldási módszerek
Mátrix-reprezentációban a Warshall-eljárással megkapjuk bármely pontból bármely pontba a legrövidebb utat.
Minimális fa építése útján a Dijkstra-eljárással megkapjuk az adott kezdőpontból az összes többi pontba vezető minimális utakat.
A különböző kezdőpontokból felépített minimális fákat már érdemes összehasonlítani az összes utak hossza szerint, esetleg az élek össz-hossza szerint; bár a hálózat építésekor nem az egyszeri úthálózat kiépítésének minimalizálása a cél (összhangban az élek egyszeres hosszával), hanem az útvonalakon történő folyamatos/gyakori áramoltatás/közlekedés miatt inkább az utak hosszának az összegét célszerű minimalizálni.
Válasszunk egy nagyobb hálózatot a fent jelzett két módszer bemutatására!