Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Útvonalkeresés időfüggő hálózatokbanSzakdolgozat
Készítette:
Debreczeni Donát
Eötvös Loránd Tudományegyetem
Természettudományi kar
Matematika Bsc
Elemző szakirány
Témavezető:
Dr. Király Zoltán
Egyetemi docens
Eötvös Loránd Tudományegyetem
Természettudományi kar
Számítógéptudományi Tanszék
Budapest
2011
1
Tartalomjegyzék
1. Bevezetés 5
2. A FIFO tulajdonság 5
2.1. Megérkezési függvény inverze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. A FIFO hálózat tulajdonságai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Mikor optimális a megoldás? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3. Problématípusok 11
3.1. Az EA típusú problémák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.2. Az LD típusú problémák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4. Törtlineáris függvények 14
5. Algoritmusok 16
5.1. Algoritmus az EAs∗(t) probléma megoldására . . . . . . . . . . . . . . . . . . . . 16
5.2. Az EAs∗(∗) feladatot megoldó algoritmus . . . . . . . . . . . . . . . . . . . . . . 17
6. Implementálás 23
6.1. Fejlesztői környezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.2. Programok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.1. Felhasznált adatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.2. Dreyfus implementáció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.2.3. Az EAs∗(∗) feladatot megoldó program . . . . . . . . . . . . . . . . . . . 27
6.2.4. Forráskódok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7. Elemzés 28
7.1. Megérkezési függvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.1.1. Probléma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.1.2. Feldolgozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.1.3. Eredmény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.1.4. Következtetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
7.2. Töredezettség sűrűség . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2
7.2.1. Probléma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2.2. Feldolgozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2.3. Eredmény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.2.4. Következtetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.3. Rövid átjutási idők . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.3.1. Probléma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
7.3.2. Feldolgozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3.3. Eredmény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7.3.4. Következtetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.4. Approximáció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.4.1. Probléma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.4.2. Feldolgozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
7.4.3. Eredmény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
7.4.4. Következtetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3
Köszönetnyilvánítás
Ezúton szeretnék köszönetet mondani témavezetőmnek, Király Zoltánnak, aki rendszeresen sza-
kított időt konzultációkra, valamint a szakdolgozatom részletes áttekintésére. Az algoritmusok
magyarázatával nagyban hozzájárul a dolgozatom elkészüléséhez.
Hálás vagyok szüleimnek, akiknek állandó támogatását élvezhettem tanulmányaim során.
4
1. Bevezetés
Mindannyian terveztünk már útvonalat közlekedési hálózatokban, legyen az a napi ingázás, egy
üzleti út, esetleg egy nyaralás útjának összeállítása. Manapság egyre többen bízzák a tervezés
és a navigálás feladatát a számítógépek és a GPS vevők algoritmusaira. Ezek az eszközök a
közlekedési hálózatot általában egy gráffal modellezik, ahol egy élhez a neki megfelelő útszakasz
hosszát, megtételéhez szükséges időt, költségét, esetleg a kapacitását rendelik. Természetes igény
az utazók részéről, hogy a legrövidebb út helyett a legrövidebb utazási időt biztosító utat ke-
ressék. Az ilyen utak jelentősen eltérhetnek, hiszen míg egy útszakasz fizikai hossza állandónak
tekinthető, addig az út megtételéhez szükséges idő folyamatosan változik. Ilyen esetben a mo-
dellben az élekhez rendelt konstans értékeket már függvények váltják föl, megadva a megfelelő
időpillanatokban az út bejárásához szükséges időt.
Ebben a dolgozatban függvényekkel címzett élekből felépített gráfok vizsgálatával foglalkozunk,
bemutatva egyes tulajdonságaikat, viselkedésüket, paramétereik változása esetén.
Az egyszerűség kedvéért csak olyan függvényekkel dolgozunk, melyek az indulás pillanatában ad-
ják meg a végigjárandó úthoz tartozó átjutási időt, nem törődve az út megtétele közben történő
változásokkal. Látni fogjuk, hogy még ilyen egyszerűsített esetben is az input mérete számotte-
vően megnő, megnehezítve ezzel a problémák kezelését a gyakorlatban. Az időfüggő hálózatok
számos, a statikus esetben nem jelentkező problémát idéznek elő. Mivel az időfüggő hálózatban
az utak hossza változik az indulási időtől, rögtön adódik a kérdés, mikor javasolt elindulni ahhoz,
hogy a lehető legrövidebb ideig tartson az út a célig. Sokszor előfordul, hogy nem a megérkezési
időpontot, hanem azt a legkésőbbi elindulási időt keressük, amikor még elindulva elérjük a célt
adott határidőre.
2. A FIFO tulajdonság
Az időtől függő hálózatok egyik gyakori csoportja a FIFO (First-In-First-Out) hálózatok. Egy
FIFO hálózatban, az élbe belépés és az élből kilépés sorrendje nem változik, tehát az indulás
késleltetésével nem érhetünk el jobb érkezési időpontot.
Legyen G gráf G = (V,A) pontjainak halmaza V , éleinek halmaza A. ∀ij ∈ A élhez rendeljünk
egy FIFO tulajdonsággal bíró hij(t) függvényt. Ez megadja az ij élen történő áthaladás idejét
5
akkor, ha i csúcsból t időpontban indulunk. A FIFO tulajdonság miatt ez egy nem negatív,
monoton növekvő függvény.
Gyakran előfordulnak olyan esetek, hogy az áthaladási idő helyett célravezetőbb a megérkezési
időkkel számolni. A megérkezési időt is kezelhetjük az élekhez tartozó függvényekként, egy ij él
esetén jelöljük ezt aij(t)-vel. Ez az érték azt adja meg, hogy ij élen át az i pontból t időpontban
indulva mikor érkezünk meg a j pontba. A fenti függvények között az alábbi egyszerű összefüggés
érvényes:
aij(t) = t+ hij(t) ∀ij ∈ A
A hij(t) függvény eleget tesz a FIFO tulajdonságnak, ha a fenti aij(t) függvény monoton nö-
vekvő.
A FIFO tulajdonság pontosabb értelmezéséhez kimondható néhány tulajdonság.
Egy ij ∈ A él FIFO tulajdonságú, ha a hozzátartozó áthaladási idő függvénye FIFO tulajdon-
ságú.
Ha egy hálózatban minden él FIFO tulajdonságú, akkor a teljes hálózat is az.
FIFO hálózatban vegyünk egy tetszőleges i1, i2, · · · , ik sétát. Ekkor az i1 ponton át történő be-
lépés sorrendje megegyezik a séta végén, az ik pontból megjelenő kilépésekkel. ij élhez tartozó
hij(t) áthaladási idő függvény akkor és csak akkor rendelkezik a FIFO tulajdonsággal ha
hij(t) + t ≤ hij(t′) + t′
ahol t ≤ t′ és t, t′ ∈ R. Tehát ha a hij(t)+ t függvény nem csökkenő, akkor ij él FIFO tulajdon-
ságú.
Egy él megérkezési függvényének és áthaladási idő függvényének összefüggéséből adódóan, egy
ij akkor és csak akkor FIFO, ha aij(t) nem csökkenő.
Vegyük újra a i1, i2, · · · , ik sétát. Mivel nem csökkenő függvények kompozíciója se csökkenő,
ezért a
aik−1ik(aik−2ik−1(. . . (ai2i3(ai1i2(t))) . . .))
függvény is nem csökkenő.
Abban az esetben, ha egy hálózat minden éléhez tartozó megérkezési függvény szigorú monoton
növő, akkor szigorú FIFO hálózatról beszélünk.
6
2.1. Megérkezési függvény inverze
Már definiáltuk egy ij ∈ A él, aij(t) megérkezési függvényét. Most a megérkezési idők inverzét
fogjuk definiálni. Gondot jelent, hogy FIFO hálózatban aij(t) szigorú monoton növő helyett egy
nem csökkenő függvény, tehát nem feltétlenül lesz invertálható. Az általánosság kedvéért ezért
a következőképpen definiáljuk egy f(x) nem csökkenő függvény inverzét:
f−1(x) = sup {ψ : f(ψ) ≤ x}
azaz ha x-et egy időpontnak tekintjük, akkor f−1(x) lesz az a legkésőbbi ψ időpont, amikor
elindulva, legkésőbb x időpontig megérkezünk. Habár a fenti f−1(x) definíció nem tesz eleget
az f(f−1(x)) = x állításnak, az (f−1)−1(x) = f(x) állítás igaz lesz, ráadásul f−1(x) nem csök-
kenő függvény. Vegyük észre, hogy f−1(x) ≤ x. Az előbbi állítások természetesen az élekhez
tartozó megérkezési függvényekre is igazak, hiszen FIFO hálózatban a megérkezési függvények
nem csökkenők.
A megérkezési függvény esetén a módosított inverz definíciónk t értékre megadja azt a leg-
későbbi időpontot, amikor az élen elindulva még t előtt megérkezünk az él végpontjába. Egy
ij ∈ A élre jelöljük ezt a−1ij (t)-vel. Tudjuk, hogy ezek nem csökkenő függvények, és mivel nem
csökkenő függvények kompozíciója szintén nem csökkenő, ezért p = i1, i2, · · · , ik sétára
a−1p (t) = a−1
ik−1ik(a−1ik−2ik−1
(. . . (a−1i2i3
(a−1i1i2
(t))) . . .))
szintén nem csökkenő. Szemléletesen a−1p (t) megadja azt a legkésőbbi időpontot, amikor még
elindulva a p út kezdőpontján, a séta végpontjába legkésőbb t időpontra megérkezünk. a−1p (t)-re
is teljesül a a−1p (t) ≤ t állítás.
2.2. A FIFO hálózat tulajdonságai
1. Lemma. Sosem éri meg várakozni egy FIFO hálózatban, vagyis egy pontban történő várako-
zás semmiképp sem javít a megérkezési időn.
Bizonyítás. Tudjuk, hogy egy FIFO hálózat minden éléhez tartozó megérkezési függvény mo-
noton növekvő. Hasonlóan egy séta azon függvénye, amely megadja a séta végpontjába történő
megérkezés idejét a séta kezdőpontjához tartozó indulási időből, szintén monoton növő függ-
vény. Vagyis egy későbbi indulási időponthoz, csak későbbi vagy azonos megérkezési időpontot
7
ad vissza a függvény, tehát a várakozás semmiképp sem javíthat a megérkezésen. �
Az előző lemmából kifolyólag, a FIFO hálózatokra nem jelent megkötést a pontokon történő
várakozási idő hiánya, éppen ezért elhagyható. Érdemes nem-FIFO hálózatoknál is megvizsgálni
a várakozási idő lehetőségét. Ugyanis, ha minden ponthoz, beérkezési időtől függetlenül korlátlan
várakozás időtartam megengedett, akkor a nem-FIFO feladat visszavezethető FIFO problémára.
Jelölje aij(t) a nem-FIFO hálozat i és j pontjait összekötő él megérkezési idő függvényét. Egy
FIFO feladatot kapunk, ha az aij(t) függvényeket felülírjuk a minψ≥t(aij(ψ)) leképezésekkel.
Szemléletesen, egy i pontot elég az ij élen keresztül abban az időpillanatban elhagyni, amikor
az ij él a legjobb megérkezési időpontot biztosítja. Fontos megjegyezni, hogy a fenti visszaveze-
tés csak folytonos megérkezési függvények esetén érvényes, hiszen nem folytonos esetben a fenti
minimum nem feltétlenül létezik.
2. Lemma. Egy FIFO hálózatban, a legjobb megérkezési időt biztosító megoldások (séták) között
mindig van aciklikus.
Bizonyítás. Vegyünk egy sétát, ami tartalmaz egy kört. Ez a kör helyettesíthető egy megfelelő
ponton történő várakozással, amiről az előző lemmából tudjuk, hogy nem csökkentheti a megér-
kezési időpontot. Tehát az optimális megoldás nem tartalmazhat kört, kivéve akkor, ha a kört
nulla idő alatt be lehet járni (persze ekkor elhagyható). �
A következő lemmához célszerű bevezetni néhány jelölést. Legyen p a FIFO hálózatnak egy
útja. Ha az p út kezdőpontjában t időpontban indulunk, akkor legyen a p végpontjába érkezés
időpontja ap(t). Ha s, d a hálózat pontjai, akkor az s-ből t időpontban indulva, a d-hez tartozó
legkorábbi megérkezést jelölje EAsd(t).
3. Lemma. FIFO hálózatban s és d pontok között mindig találhatunk olyan legkorábbi megér-
kezési idejű utat, amelynek részútjai szintén, legkorábbi megérkezési idejűek. Konkrétan, legyen
P az s kezdőpontú, és d végpontú utak halmaza, amelyekre ap(t) = EAsd(t) ha p ∈ P (tehát
s-ből d-be legjobb átjutási időt biztosító utak). Ekkor ∃p ∈ P , melynek összes i kezdőpontú és j
végpontú p′ ∈ p részútjára teljesül
ap′(EAsi(t)) = EAij(EAsi(t))
8
Bizonyítás. Legyen p ∈ P és legyen p′ az i kezdőpontú, j végpontú út, az p út egy részútja.
Tegyük fel, hogy van egy olyan p′′, az eredeti p′ úttal megegyező kezdőpontú és végpontú út,
amelyre
ap′′(EAsi(t)) ≤ ap′(EAsi(t))
Cseréljük ki p′-t p′′-vel, így nyerve egy q utat, amihez tartozó megérkezési idő nem nőtt p-hez
képest hiszen
ap′′(EAsi(t)) ≤ ap′(EAsi(t))
EAjd(ap′′(EAsi(t))) ≤ EAjd(ap′(EAsi(t)))
aq(t) ≤ ap(t)
Többször megismételve a fenti lépéseket, előállíthatunk egy olyan q∗ utat, aminek minden i
kezdőpontú, j végpontú p∗ részútjára
ap∗(EAsi(t)) = EAij(EAsi(t))
ugyanakkor, q∗ megérkezési ideje nem lett rosszabb p-hez képest vagyis
aq∗(t) ≤ ap(t)
�
2.3. Mikor optimális a megoldás?
4. Lemma. Legyen egy FIFO tulajdonságú G = (V,A) gráfban s ∈ V egy forrás. Legyen t
az indulási idő, amikor elindulunk s-ből, valamint aij(x) az élhez tartozó megérkezési függvény
minden ij ∈ A esetén, ha x időpontban indulunk i-ből. Jelölje EAs∗(t) azt a problémát, ahol egy s
pontból keresünk legkorábbi megérkezést biztosító utakat a gráf többi pontjába, adott t indulással.
Jelölje EAs∗(∗) azt az esetet, amikor nincs megadva konkrét indulási idő, csak a lehetséges
indulási időpontokat magába foglaló [tk, tv] intervallum.
Ekkor az alábbiak szükséges és elégséges feltételei az EAs∗(t) probléma optimális EAsi(t), i ∈ V
értékeire:
EAss(t) = t (1)
EAsj(t) ≤ aij(EAsi(t)) ∀ij ∈ A (2)
∀i ∈ V, i 6= s, ∃j 6= i EAsi(t) = aij(EAsi(t)) (3)
9
Az EAs∗(∗) probléma esetén a fenti feltételeknek minden t ∈ [tk, tv] időpontra kell teljesülnie,
feltéve, hogy csak a [tk, tv] időintervallumban indulhatunk .
Bizonyítás. Tegyük fel, hogy van egy optimális megoldásunk. Lássuk be, hogy teljesülnek rá
a fenti feltételek.
Tegyük fel, hogy az optimális megoldás nem teljesíti a (2) feltételt. Ez azt jelentené, hogy
EAsj(t) > aij(EAsi(t)), tehát az i pontba a legjobb megérkezést biztosító úton eljutva, majd
onnan j-be érve szigorúan kisebb megérkezési időt nyerünk. De ekkor az eredeti megoldásunk
nem lehetett optimális, hiszen létezik jobb út.
Az s pontba már a t indulási időpontban megérkezünk egy optimális eredmény esetén, tehát (1)
is teljesül.
Nézzük a (3)-as feltételt. Adott egy s− i optimális út. A feltételben keresett j épp i csúcs s− i
útbeli szülője, mert ha nem az lenne, akkor nem lenne optimális az út.
Ha a feltételek teljesülnek, akkor a megoldás optimális. Indirekt tegyük fel, hogy a fenti fel-
tételek teljesülnek olyan EAsi(t), i ∈ V értékekre, melyek nem optimálisak. Ez azt jelentené,
hogy létezik t indulási időpont valamint q, s-ből induló és j-be érkező (s− i1− i2− . . .− ik − j)
út melyre EAsj(t) > aq(t). Az (1) és (2) feltételből kiindulva:
EAsi1(t) ≤ asi1(t)
EAsi2(t) ≤ ai1i2(EAsi1(t)) ≤ ai1i2(asi1(t))
EAsi3(t) ≤ ai2i3(EAsi2(t)) ≤ ai2i3(ai1i2(asi1(t)))
...
EAsj(t) ≤ aq(t)
Az aq(t) jelöli a j pontba érkezés időpontját, ha a q utat használjuk. q útról feltettük, hogy
EAsj(t) > aq(t), tehát ellentmondásra jutottunk. �
10
3. Problématípusok
3.1. Az EA típusú problémák
Az időfüggő hálózatokban, a legrövidebb utak keresésével foglalkozunk, ahol az út hossza alatt
most az út megtételéhez szükséges időt értjük. A legegyszerűbb problématípus az, amikor egy
s pontból keresünk legkorábbi megérkezést biztosító utakat a gráf többi pontjába, egy adott t
indulási időponttal. Az ilyen problémát jelöljük EAs∗(t)-vel. Abban az esetben, amikor nincs
megadva konkrét indulási idő csak a lehetséges indulási időpontok T halmaza, akkor az EAs∗(∗)
problémáról van szó. Ekkor a csúcsokhoz nem konkrét megérkezési időpontot, hanem egy függ-
vényt keresünk, ami megadja az indulási időpontokhoz tartozó érkezési időket.
EAsd(t)-vel jelöljük azt a problémát, ha egy fix t indulási idő esetén keresünk utat s-ből úgy,
hogy d pontba a leghamarabb érkezzünk meg. Ahogyan a statikus hálózatokban is, ahol egy adott
d-be vezető legrövidebb út keresése olyan nehéz, mint az összes pontokhoz vezető legrövidebb
utak kiszámolása, úgy időfüggő hosszak esetén az adott pontba történő legjobb megérkezést biz-
tosító út keresése olyan nehéz, mintha az összes pontba keresnénk. Tehát az EAsd(t) probléma
esetén, az EAs∗(t) problémát kell megoldani. A fentiekhez hasonlóan, az EAsd(∗) problémához
is szükség lesz az EAs∗(∗) feladatot megoldó algoritmusra.
Ha minden csúcspárra keresünk utakat legkorábbi megérkezéssel egy adott t időpontra, ak-
kor az EA∗∗(t) problémára keresünk megoldást. Ha az EAs∗(t) feladatot megoldjuk minden
s ∈ V csúcsra, akkor az EA∗∗(t)-re is ismerjük a megoldást, ennél jobb módszer nem ismeretes.
EA∗∗(∗) a feladat, ha fix indulási idő nélkül keressük a pontpárok közti legjobb megérkezést
garantáló utakat, erre is nyerhetünk megoldást, ha megoldjuk EAs∗(∗)-t minden s ∈ V kezdő-
pontra.
Adott t időpontban induló, d csúcsba érkező legjobb utak problémáját EA∗d(t)-vel jelöljük,
ez pontosan olyan nehéz, mint az EA∗∗(t) feladat.
11
3.2. Az LD típusú problémák
Már végigvettük az időfüggő hálózatok azon probléma típusát, amikor bizonyos pontokhoz tar-
tozó legkorábbi megérkezést keressük. A következőkben a pontokhoz tartozó legkésőbbi elindu-
lást keressük. Jelölje LDsd(t) azt a legkésőbbi időpontot, amikor elindulva s pontból megérke-
zünk d-be a t időpontban, vagy hamarabb. Ha P a gráf s-ből induló és d-ben végződő útjainak
halmaza, akkor LDsd(t) = max{
a−1p (t) : p ∈ P
}
ahol az a−1p (t) a már korábban bevezetett, a
megérkezési idő függvény általánosított inverze. Mivel EAsd(t) = min {ap(t) : p ∈ P} az LDsd(t)
az EAsd(t) függvény inverze. Jelölje LD∗d(t) azt a problémát, amikor a gráf összes v pontjához
keressük azt a legkésőbbi indulási LDvd(t) időt, amikor elindulva v-ből, d-t a t időpontig még
elérjük.
Statikus, nem időfüggő esetben megtalálhatjuk az egy pontba irányuló összes legrövidebb utat,
ha az éleket megfordítjuk, és ezután a vizsgált pontból keresünk a gráf összes többi pontjába
legrövidebb utat. Ezt az ötletet az időfüggő FIFO hálózatokra is alkalmazhatjuk, azzal a kü-
lönbséggel, hogy az élek megfordításán túl az idő tengelyen fordítva kell mozogni. Hozzuk létre
a G gráf másolatát, jelölje ezt G′. Ezen hajtsuk végre a következő változtatásokat:
1. Cseréljük meg a forrás- és célcsúcsokat, az új forráscsúcs legyen s′, az új célcsúcs legyen d′
2. Cseréljük meg a megérkezési és a indulási idők szerepét, és vegyük a −1-szeresét
3. Írjuk át a megérkezési függvényeket aij(t)-ről −a−1ij (−t)-re minden ij élre
4. Fordítsuk meg az élek irányát, és ezzel együtt a rajtuk lévő megérkezési függvények index
sorrendjét (ij sorrend helyett ji legyen)
Oldjuk meg az új G′ gráfra az EAs′∗(t) feladatot. A G′ gráf egy EAs′v(t) értéke megegyezik az
eredeti G gráf −LDvs(−t) értékével. Így kiszámolhatjuk az eredeti gráfra kiírt LD∗d(t) feladat
megoldását, hiszen az eredeti G gráfon egy LDvd(t) érték megegyezik az új G′ gráf −EAs′v(−t)
értékével.
Példa.
Az első ábrán látható gráfra kívánjuk megoldani az LD∗d(t) problémát adott t = 16 ér-
tékre, vagyis keressük a pontokhoz tartozó legkésőbbi indulási időket, amikor még t = 16-ra
12
s d
j
i
t+2
t+1
4t+4
2t
2t+4
d' s'
j
i
t+2
t+1
0.25t+1
0.5t
0.5t+2
EAs'd=-7
EAs'i=-8
EAs'j=-3
EAs's'=-16
1. ábra. A feladat gráfja, és a módosított gráf.
elérjük d-t. Egyszerűség kedvéért az éleken jelzett megérkezési függvények lineárisak, és minden
t ∈ R értékre érvényesek. Módosítsuk a gráfot az ismertetett eljárással, fordítsuk meg az éleket,
és írjuk át a hozzájuk rendelt függvényeket. Például az eredeti gráf jd éle és a hozzá tartozó
ajd(t) = 4 · t+4 függvény az új gráfban a dj élnek felel meg, és jelölje ennek megérkezési függvé-
nyét −a−1dj (−t) =
1
4· t+ 1 (amit a 3. változtatással képeztünk). Legyen d pont az új forrás (s′),
és az új indulási idő −16. Az új gráfon megoldva az EAs′∗(−16) problémát a következő megol-
dásokat kapjuk: EAs′s′(−16) = −16, EAs′j(−16) = −3, EAs′i(−16) = −8, EAs′d′(−16) = −7.
Mivel az LDvd(t) értékek megegyeznek az −EAs′v(−t) adatokkal, az LD∗d(t) feladat megoldása:
LDsd(16) = 7, LDjd(16) = 3, LDid(16) = 8, LDdd(16) = 16. �
13
A fentiek alapján az LD∗d(t) feladat visszavezethető az EAs∗(t) problémára. Hasonlóan, mint
ahogyan az EAs∗(t) megoldásából származtattuk az EAsd(t) feladat megoldását, az LD∗d(t)
problémát kell megoldani az LDsd(t) megoldásához. Abban az esetben ha, minden pontba kere-
sünk minden pontból legkésőbbi indulási időket, az LD∗∗(t)-re keresünk megoldást, amit meg-
kapunk, ha az LD∗d(t) feladatot megoldjuk minden d ∈ V célcsúcsra.
Előfordulhat, hogy nem egy konkrét t megérkezési időre és végcélpontra keressük a pontokhoz
tartozó legkésőbbi indulási időpontokat, hanem egy általunk meghatározott időintervallumnak
minden t elemére. Jelölje LD∗d(∗) ezt a feladatot.
4. Törtlineáris függvények
Gyakran használunk törtlineáris függvényeket az élekhez rendelt átjutási idők függvényének le-
írására. A gyakorlatban is sokszor csak ilyen formában kapjuk meg az adatokat. Minden élhez
adott mennyiségű interpolációs pontot rendelünk, ezeken az időpontokon pontos lesz az él átju-
tási ideje. Gyakran célszerűbb az átjutási idők helyett a megérkezési időkkel számolni. Vegyük
észre, hogy a fenti átjutási időkre, az élek megérkezési idő függvényei is törtlineáris függvények
lesznek. Hiszen
aij(t) = t+ hij(t) = t+mhij(t) · t+ bhij(t) = (1 +mhij(t)) · t+ bhij(t) ∀ij ∈ A
ahol mhij(t) az ij él átjutási időfüggvényének t időponthoz tartozó szakaszának meredeksége, és
bhij(t) az az érték amit a szakasz egyenese felvesz a t = 0 helyen. FIFO hálózatban mhij(t) ≥ −1.
Legyen az i1, i2, i3, . . . , ik a gráf egy p útja, ahol az élekhez hozzárendelt megérkezési függ-
vények törtlineáris függvények. Ekkor az i1 pontból indulva a t időpillanatban az ik-ba történő
megérkezés időpontját megadó ap(t) leképezés is törtlineáris. Ez a már ismert
ap(t) = aik−1ik(aik−2ik−1(. . . (ai2i3(ai1i2(t))) . . .))
megfigyelésből következik, hiszen zárt időintervallumban vett lineáris függvények kompozíciója
lineáris, és ilyen egymást nem lefedő szakaszok feletti függvények egy törtlineáris leképezést ad-
14
nak meg az időegyenesen.
t
hij(t)
t
aij(t)
t1 t2 t1 t2
m
n
n+t1
m+t2
2. ábra. Példa egy utazási idő függvényre, és a hozzá tartozó megérkezési idő függvényre.
Fontos megjegyezni, hogy az élek megtételéhez szükséges időt leíró függvények nem feltétlenül
folytonosak, és így a megérkezési időket megadó leképezések sem. Sokszor ilyen függvényekkel
kell dolgozni, ha tömegközlekedési hálózatokat modellezünk.
t
hij(t)
t
aij(t)
t1 t2 t1 t2
mn
n+t1
m+t2
3. ábra. Példa egy szakadásokat tartalmazó utazási idő függvényre, és a hozzá tartozó megérke-
zési idő függvényre. Gyakorlatban is hasonló lehet a helyzet, ha egy adott helyre tartó járatok
t1 és t2 időpontban indulnak.
15
5. Algoritmusok
5.1. Algoritmus az EAs∗(t) probléma megoldására
Adott G(V,A) irányított gráf egy meghatározott s ∈ V kiindulási ponttal és egy t0 indulási
idővel. Minden ij ∈ A, i, j ∈ V élhez hozzá van rendelve egy hij(t), t időponttól függő költ-
ségfüggvény, ami jelen esetben az átjutási időt adja meg akkor, ha i pontból t időpillanatban
indulunk. Az élekhez tartozó hij(t) függvényekre teljesül a FIFO tulajdonság, vagyis minden
ij ∈ A élre, ha t ≤ t′ akkor hij(t) + t ≤ hij(t′) + t′. A hij(t) + t megadja a j pontba érkezés
idejét, ha i csúcsból indulunk t időpontban, jelöljük ezt aij(t)-vel. Feladatunk megtalálni min-
den i ponthoz a lehetséges legkorábbi megérkezési időt, akkor ha s kiindulási pontból indulunk
t kezdési idővel, tehát EAsi(t)-t minden i ∈ V -re.
A 3. lemmában kimondtuk, hogy a statikus esethez hasonlóan, egy időfüggő hálózat pontjai
között is található olyan legjobb megérkezést biztosító út, melynek minden részútja is legjobb
megérkezést biztosít. Emiatt van már értelme időfüggő hálózatokban is annak, hogy fix kezdési
időpontokra, egy pontból induló, a többi pontba legjobb megérkezést biztosító utakat megadó
feszítő fenyőket keressünk. Statikus hálózatban Dijkstra algoritmusa egy ilyen fenyőt ad meg.
Időfüggő esetben, adott indulási időponttal egy hasonló algoritmussal az EAs∗(t) feladat könnye-
dén megoldható. A lényegi különbség a Dijkstra algoritmustól csupán annyi, hogy egy él hossza
függ a kezdőpontjához tartozó érkezési időtől, erre ügyelni kell az élek hosszának lehívásakor.
Ezt a módszert először Dreyfus [1] adta meg 1969-ben.
Eredetileg Dreyfus nem mondta ki, hogy az algoritmusa csak FIFO hálózatokban működik. Erre
később 1991-ben Ahn és Shin [3], 1993-ban Kaufman és Smith [4] mutatott rá.
Dreyfus algoritmusának pszeudo kódja:
Require: G(V,A), s ∈ V , t0 ∈ R+, aij(t) : R+ −→ R
+ ∀(i, j) ∈ E
∀i ∈ V − s : EAsi(t0)←−∞
EAss(t0) = t0
parent(s) = s
horizon←− s
16
settled = ∅
unseen = V − s
while horizon 6= ∅ do
legyen j ∈ horizon melyre EAsj(t0) minimális
settled←− j ←− horizon
for a j pontból kimenő összes ju élre do
if u ∈ horizon and EAsu(t0) > aju(EAsj(t0)) then
EAsu(t0) = aju(EAsj(t0))
parent(u) = j
end if
if u ∈ unseen then
EAsu(t0) = aju(EAsj(t0))
parent(u) = j
horizon←− u←− unseen
end if
end for
end while
Az algoritmus futási ideje megegyezik a Dijkstra algoritmus futási idejével. Tehát, ha a horizon
halmazt egy d-edfokú kupacban tároljuk, akkor éllistás tárolással O(|E|·logd|V |+d·|V |·logd|V |)
lesz a lépésszám.
5.2. Az EAs∗(∗) feladatot megoldó algoritmus
Az EAs∗(∗) problémánál, egy s ∈ V ponttól keressük a legkorábbi megérkezés időpontját a
G(V,A) irányított összefüggő gráf összes pontjába, azzal az általánosítással, hogy nem teszünk
föl konkrét indulási időpontot. Mivel t kezdési időpont változásával a v ∈ V pont EAsv(t) értéke
is megváltozik, ezért minden v ponthoz meg kell adni egy olyan függvényt, amely egy t ∈ R
(gyakorlatban t ∈ [tk, tv]) indulási időre megadja a legkorábbi megérkezési időpontot.
Minden uv ∈ A élhez tartozik egy auv(t) függvény, amely megadja, hogy u pontból elindulva
a t időpillanatban az uv élen, mikor érkezünk v pontba. Tegyük fel, hogy auv(t) egy törtline-
áris függvény minden uv élre. Jelöljük τuv(t′)-vel az auv(t) függvény t′ időpont utáni legelső
17
töréspontját. Legyen αuv(t′) az auv(t) függvény annak a darabjának a meredeksége, amelyhez
a t′ időpont tartozik, és legyen βuv(t′) ugyanezen darab egyenesének a t = 0 helyen vett értéke
(vagyis ahol metszi az ordinátát). Nem követeljük meg az auv(t) folytonosságát, a szakadási
pontok is töréspontok. Egy töréspont paraméterei, a tőle jobbra lévő törtlineáris függvény da-
rab paramétereivel egyeznek meg.
Feltesszük, hogy a auv(t) függvények megfelelnek a FIFO tulajdonságnak, vagyis egy uv élen
t′ időpontban elindulva nem később érkezünk v-be, mintha t′ + h időpontban indultunk volna,
ahol h > 0.
Belátható, hogy a fenti tulajdonsággal rendelkező megérkezési függvények használatával EAsu(t)
függvény egy törtlineáris függvény lesz. Legyen TPu[k] az EAsu(t) függvény k. töréspontjának
helye ∀u ∈ V -re. Jelöljük Mu(t)-vel az EAsu(t) függvény meredekségét t helyen, ERTu(t)-vel
pedig a t-hez tartozó szakasz egyenesének a t = 0-ban felvett értékét. A k. töréspontban és az
azt követő darabhoz tartozó szakasz paraméterei legyenek a jelöléseknek megfelelően Mu[k], és
ERTu[k].
Az EAs∗(∗) probléma megoldására B. Dean [2] megalkotott egy algoritmust, amely a kere-
sett függvényeket egy tk időponttól kiindulva az időben előre haladva fokozatosan állítja elő.
Ezt felhasználva, olyan legkorábbi t időpontokat keresünk, amelyek megsértik az optimalitási
feltételt, vagyis azon t értékeket melyre
auv(EAsu(t)) < EAsv(t)
Ha ismerjük azon megérkezési függvényeket, amik teljesítik az optimalitás feltételét a t időpont-
ban, akkor lesz egy olyan [t, t∗) intervallum, melyben a t időpontokhoz tartozó Mu(t), ERTu(t)
paraméterekkel számolva megkapjuk az optimális legkorábbi megérkezést minden pontra. Tehát
t′′ ∈ [t, t∗)-re EAsu(t′′) =Mu(t) · t′′ + ERTu(t) ∀u ∈ V .
Az algoritmus során az időben előre haladva keressük az egyes csúcsok megérkezési függvények
töréspontjait, és azon csúcsoknál, amelyeknél a megérkezési függvény paraméterei módosulnak,
javítást hajtunk végre. Javítás esetén rögzítjük a csúcs megérkezési függvényének új töréspont-
ját, majd a törésponthoz és a hozzá tartozó szakaszhoz a paramétereket is frissítjük. Ezeket a
18
paramétereket megkapjuk, ha a Dreyfus egy módosított algoritmusát futtatjuk az új töréspontra.
Három esetben jelenhet meg töréspont.
Első esetben, az élekhez tartozó auv(t) uv ∈ A megérkezési függvény töréspontja idézhet elő
változást. A megérkezési függvény jellege miatt igaz, hogy t′′ > t, ahol t′′ elegendően közel van
t-hez, akkor Mu(t′′) =Mu(t) és ERTu(t′′) = ERTu(t). Megnézzük, hogy t növelésével melyik él
megérkezési függvénynek töréspontját érjük el először. ∀uv ∈ A élre ha
Mu(t) · t′′ + ERTu(t) < τuv(EAsu(t))
teljesül, akkor egyik él függvényének sem értük el a töréspontját. Nekünk egy olyan legkisebb t∗
kell, ami először sérti meg a fenti feltételt egy (esetleg több) élnél. Tehát
Mu(t) · t∗ + ERTu(t) = τuv(EAsu(t))
egyenlőséget teljesítő t∗-k közül keressük a legkisebbet, vagyis az élekhez rendelt
t∗ =τuv(EAsu(t))− ERTu(t)
Mu(t)
értékek minimumát, jelöljük ezt c-vel.
A második eset amikor egy uv ∈ A él megsérti az optimalitás feltételét, vagyis az
αuv(EAsu(t)) · (Mu(t) · t′′ + ERTu(t)) + βuv(EAsu(t)) ≥Mv(t) · t
′′ + ERTv(t)
állítást. Mint az első esetben itt is a t′′ ≥ t-re az Mu(t′′) és a ERTu(t
′′) paraméterek nem
változnak. Ha egy uv élre és t∗ időpontra nem teljesül a fenti feltétel, akkor az azt jelenti, hogy
t∗ időponttól kezdve a bejárást, uv élen át már gyorsabban elérhető lesz v mint azon az úton,
amin eredetileg leghamarabb elértük. Az első esethez hasonlóan itt is azt az élet keressük, ami
leghamarabb rontja el a feltételt.
αuv(EAsu(t)) · (Mu(t) · t∗ + ERTu(t)) + βuv(EAsu(t)) =Mv(t) · t
∗ + ERTv(t)
ebből
αuv(EAsu(t)) ·Mu(t) · t∗ + αuv(EAsu(t)) · ERTu(t) + βuv(EAsu(t)) =Mv(t) · t
∗ + ERTv(t)
19
amiből látszik, hogy javításkorMv(t) értéket αuv(EAsu(t))·Mu(t)-re, a ERTv(t)-t pedig αuv(EAsu(t))·
ERTu(t) + βuv(EAsu(t))-re cseréljük. Végül a t∗-t keresve a
ERTv(t)− βuv(EAsu(t))− αuv(EAsu(t)) · ERTu(t)
Mv(t)− αuv(EAsu(t)) ·Mu(t)
hányadosokat vizsgáljuk minden élre. Azoknál az éleknél ahol Mv(t) ≤ αuv(EAsu(t)) ·Mu(t) biz-
tos nem kell javítani, hiszen ekkor a v pont eredeti megérkezési függvényéhez tartozó meredekség
kisebb, mint a most vizsgált út függvényének a meredeksége. Ebből kifolyólag a jelen állapotból
szemlélve semmilyen jövőbeli értékre nem érné meg ezt az új utat használni. Ekkor a hányadost
az algoritmusnak nem kell figyelembe vennie. Ugyanakkor Mv(t) > αuv(EAsu(t)) ·Mu(t) esetén
a fenti hányados már megad egy lehetséges töréspontot, ezen értékek minimumát jelöljük d-vel.
min(c, d) - nevezzük ezt globális töréspontnak - értéke lesz a következő időpont, ameddig a
pontok megérkezési függvényének paramétereit nem kell változtatnunk. Az algoritmus rögzíti a
kiszámolt paramétereket, majd min(c, d) kezdési időt beállítva újraszámolja a pontok megérke-
zési függvényének paramétereit (lehet olyan pont, amelyre ez nem változik), majd ezekkel újra
kiszámolja és felülírja az új min(c, d) értéket. Az algoritmus akkor áll meg, ha a frissen kiszámolt
globális töréspont kisebb tv-nél.
A harmadik eset lehet, amikor egy u csúcs megérkezési függvényének változása hatással van
a többi csúcs megérkezési függvényére. Az ilyen esetet kiváltó legkorábbi t időpont keresése
szükségtelen, hiszen az u csúcs megérkezési függvényének változásáért felelős legkorábbi t idő-
pontot a fenti két eset valamelyike megtalálja.
1: INPUT: tk, tv, G(V,A), s ∈ V, aij(t) : R+ −→ R
+ ∀(i, j) ∈ E
2: ∀v ∈ V : I(v) = 0
3: ∀v ∈ V − s :Mv[I(v)] =∞
4: ∀v ∈ V − s : EAv =∞
5: ∀v ∈ V − s : mv =∞
6: tcur = tk
7: Ms[I(s)] = 1
20
8: ERTs[I(s)] = 0
9: ms = 1
10: erts = 0
11: I(s) = 1
12: TPs[I(s)] = tk
13: while tcur ≤ tv do
14: horizon←− s
15: EAs = tcur
16: settled = ∅
17: unseen = V − s
18: while horizon 6= ∅ do
19: select i ∈ horizon minimizing EAi
20: settled←− i←− horizon
21: for ij ∈ A do
22: EAij = αij(EAi) · EAi + βij(EAi)
23: if j ∈ horizon then
24: if EAj > EAij then
25: EAj = EAij
26: mj = αij(EAi) ·mi
27: ertj = αij(EAi) · erti + βij(EAi)
28: end if
29: if EAj = EAij then
30: if mj > αij(EAi) ·mi then
31: mj = αij(EAi) ·mi
32: ertj = αij(EAi) · erti + βij(EAi)
33: end if
34: end if
35: end if
36: if j ∈ unseen then
37: EAj = EAij
38: mj = αij(EAi) ·mi
21
39: ertj = αij(EAi) · erti + βij(EAi)
40: horizon←− j ←− unseen
41: end if
42: end for
43: end while
44: for ∀u ∈ V do
45: if M [I(u)] 6= mu or ERT [I(u)] 6= ertu then
46: I(u) + +
47: TP [I(u)] = tcur
48: M [I(u)] = mu
49: ERT [I(u)] = ertu
50: end if
51: end for
52: tcur = tv
53: for ∀uv ∈ A do
54: c =τuv(EAu)− ERTu[I(u)]
Mu[I(u)]55: d =∞
56: if αuv(EAu) ·Mu[I(u)] < Mv[I(v)] then
57: d =ERTv[I(v)]− βuv(EAu)− αuv(EAu) · ERTu[I(u)]
Mv[I(v)]− αuv(EAu) ·Mu[I(u)]58: end if
59: if tcur > min(c, d) then
60: tcur = min(c, d)
61: end if
62: end for
63: end while
Jelölések. Az első (1) sor leírja a várt inputot. [tk, tv] időszakban keressük a G gráf V pontjain
a legkorábbi megérkezési függvényeket. Egy ij él megérkezési függvényét az aij(t) jelöli.
(2)-(12) inicializálás, a keresett megérkezési függvényeknek különböző szakaszokon felvett para-
métereit tömbökben tároljuk. Az Mu[a] megadja, az u pont a-dik töréspontjától jobbra található
szakasz meredekségét, ERTu[a] pedig azt az értéket ahol a szakasz egyenese az ordinátát metszi.
22
TPu[a] megadja a keresett függvény a-dik töréspontjának helyét (u ∈ V , a pozitív egész). Az
algoritmus ezeket a tömböket fogja feltölteni. tcur (time-current) lesz az aktuális időpont, amit
vizsgál az algoritmus. Ezen kívül minden u ponthoz tartozik egy mu és ertu változó, melyek u
pont megérkezési függvényének aktuális tcur időponthoz tartozó lineáris rész paraméterei. Az
I(v) (v ∈ V ) jelöli a v ponthoz regisztrált legutóbbi töréspont sorszámát.
(13)-(17) EAu, u ∈ V jelöli, hogy mi (a tcur indulási időponttal) a megérkezési idő az u pontba
a forrástól. A horizon, unseen, settled a V ponthalmaz részhalmazai, a futás során végig disz-
junktak.
(18)-(43) Legyen αuv(t) az uv él megérkezési függvényének meredeksége a t időpontban, βuv(t)
pedig ugyanezen a szakasz egyenesének és az ordináta metszéspontjának értéke. Ha t éppen uv
függvényének egyik töréspontjának helye, akkor az előbbi paraméterek a t-től jobbra lévő sza-
kasz paraméterei. EAuv jelöli v pontba érkezés idejét, ha azt közvetlenül az u pontból érjük el.
(53)-(62) τuv(t), uv ∈ A függvény megadja az uv él megérkezési függvényének t időponthoz
tartozó darabjának jobb határát. c a Mu(t) · t+ERTu(t) < τuv(EAu) képletből nyert, következő
lehetséges töréspont. Hasonlóan d az
αuv(EAu) · (Mu(t) · t′ + ERTu(t)) + βuv(EAu) > Mv(t) · t
′ + ERTv(t)
optimalizálási feltételből nyert következő lehetséges globális töréspont helye.
Mivel korábban említettük, hogy minden töréspont paramétere a tőle jobbra eső megérkezési
függvény darab paraméterével egyezik meg, ezért az algoritmus során nem igényel külön keze-
lést egy szakadás. Ugyanis a szakadási pontban lévő töréspontnál a Dreyfus algoritmus az előbb
említett paraméterekkel keres minimumot.
6. Implementálás
A fentebb ismertetett algoritmusok megvalósításra kerültek abból a célból, hogy adott bemeneti
halmazokon futtatva őket elemezhető eredményt adjanak.
6.1. Fejlesztői környezet
Részben saját választás, részben a rendelkezésre álló lehetőségek, valamint annak figyelembevé-
telével kerültek kiválasztásra a fejlesztéshez használt eszközök, hogy lehetőleg egyszerűen lehes-
23
sen kezelni őket, de elég hatékonyak legyenek, biztosítva ezzel a bonyolult eljárások hatalmas
mennyiségű bemeneti adatokat feldolgozó értelmes idő alatti lefutását.
A környezet így az alábbiak szerint alakult:
• Hardver: 64 bites PC
• Operációs rendszer: Linux Ubuntu disztribúció
• Fejlesztés C++ programnyelven
• Fejlesztő eszköz: g++ fordító, Lemon könyvtárral kiegészítve [5]
6.2. Programok
6.2.1. Felhasznált adatok
A felhasznált kiindulási gráfok nyilvánosan elérhető állományokban tárolódnak (9th DIMACS
Implementation Challenge: Shortest Path) [6]. Ezek szolgálnak a program egyik típusú bemeneti
adataként. Ezek egyszerű szöveg állományok az alábbi szerkezettel. Az állományok kvázi egy-
egy város vagy földrajzi terület közlekedési úthálózatát reprezentálják, így hatalmas méretűek
lehetnek.
Egy felhasznált input gráf néhány sora:
p 3353 8870
a 2958 2959 535
a 1494 1573 77
a 1590 1603 184
a 2634 2635 179...
......
...
A fenti példa formátuma: Dimacs Challenge 9 format. Ez a formátum a pontokhoz különböző
azonosítókat rendel, ez a szám minimum 1, de legfeljebb a pontszámmal egyezhet meg. Minden
sor első oszlopában egy betű szerepel. Ez p ha a sor a gráf pont és élszámáról tartalmaz informá-
ciót, a ha a sor a gráfnak egy élét írja le, c ha a sor kommentet tartalmaz. Az éleket leíró sorok
24
második oszlopában az él kezdőpontjának azonosítója, harmadik oszlopában az él végpontjának
azonosítója, utolsó oszlopában pedig az él megtételéhez szükséges átlagos időtartam található.
A másik meghatározó paraméter az egyes élek átjutási költségét időben leíró függvény. Sajnos a
fenti forrás nem szolgál élekhez tartozó átjutási függvényekkel, csupán átlagos átjutási időkkel.
Éppen ezért vált szükségessé egy ilyen függvényeket generáló kód megírása, ami csupán az át-
lagos átjutási időt használja inputként. Ez a program egy törtlineáris függvényt készít, ügyelve
arra, hogy a függvény értéke sose legyen a konstans input értéknél számottevően távolabb. A
generált törtlineáris függvény ciklikus (egy ciklus 24 órának felel meg) és az úthálózatokra jel-
lemző módon bizonyos időintervallumokban (csúcsforgalomban) magas átjutási időket adnak
meg. Ugyanezen törtlineáris függvények beállítástól függően 30, 60, 120 percenként törnek. A
függvények előállításakor az algoritmus mindig egy adott bizonytalansággal dolgozik, valamint
adott valószínűséggel szakadást is generál az outputban, a FIFO tulajdonság megtartása mellett.
A felépített függvényeket meghatározó paraméterek a kódban tömbökben kerültek rögzítésre.
Minden egyes élhez egy [24][2] méretű tömböt rendeltünk, melyet a feldolgozó algoritmus a fu-
tása során feltölt. Minden egyes tömbsor első elemébe a meredekséget (a), a másodikba az adott
törtlineáris darab egyenesének a nulla helyen felvett értékét írjuk (b). Értelemszerűen a tömb
[0][0]-ik eleme az első óra a paraméterét tartalmazza, míg a [0][1]-ik eleme a b paraméterét, és
így tovább a teljes 24 órára.
Egy t időponthoz az adott él törtlineáris függvényének értékét úgy kapjuk meg, hogy megkeres-
sük melyik órába esik a t. Vesszük az élhez tartozó tömbnek ezt a sorát és kiolvassuk a-t és b-t.
A kapott paraméterekkel az a · t+ b összefüggés felhasználásával kiszámoljuk a keresett értéket.
25
Egy él megérkezési függvényének az ábrája:
0
5
10
15
20
25
30
0 5 10 15 20 25
Meg
érke
zés
idej
e(p
erc)
Indulás (óra)
Törtlineáris függvény
A fenti nyilvánosan elérhető adatok mellett egy hálózati problémákat generáló program hasz-
nálatára is sor került. A GOTO [8] nevű program nyilvános, fejlesztője Andrew V. Goldberg,
Department of Computer Science, Stanford U.
6.2.2. Dreyfus implementáció
Feladat. Az EAs∗(t) problémát megoldó algoritmust szeretnénk implementálni. Készítésénél
sok kiegészítő illetve objektum került felhasználásra a Lemon könyvtárból, azonban maga a
Dreyfus-algoritmus külön került implementálásra. Az input a 6.2.1 fejezetben leírt generált át-
jutási idejű gráf. Az output egy tömb, amely a csúcsokhoz tartozó legkorábbi megérkezési időket
tartalmazta.
Futtatás. Az 5.1 fejezet pszeudo kódja alapján készült a program. Különbség, hogy itt az
élek hosszát mindig egy függvény adta vissza az él azonosítója, valamint az él kezdőpontjának
26
legkorábbi megérkezési ideje alapján. Kiemelendő, hogy a futásidő megegyezett a szintén lekódolt
Dijkstra algoritmus futási idejével.
Ellenőrzés. A futtatást rögtön egy ellenőrző rutin követte, ez a 2.3 fejezet lemmájának felté-
teleit ellenőrizte a pontokhoz rendelt megérkezési időkre.
6.2.3. Az EAs∗(∗) feladatot megoldó program
Feladat. Feladatunk az adott gráfban, adott időintervallumban a legkorábbi megérkezéseket
megadó függvények meghatározása minden csúcsra. Az input a 6.2.1 fejezetben leírt generált
átjutási idejű gráfok. Az output egy szöveges állomány, az alábbi formában:
3353 8870
3352 0 1 0.957866 46.5159 0 46.5159
3351 0 1 0.903232 78.773 0 78.7731
3350 0 1 0.905946 75.7778 0 75.7778
3349 0 1 0.909693 77.2694 0 77.2694...
......
......
......
Az első sor leírja az input gráf pont- és élszámát. Ezt követően minden sor egy bizonyos pont
eredmény függvényének egy töredékét írja le. Az első érték a pont azonosítója. A második
jelöli az aktuális törés idejét, a negyedik a törést követő szakasz egyenesének meredekségét,
ötödik ugyanezen egyenes nullában vett értékét. A harmadik oszlop megadja, hogy az aktuális
bejegyzés hányadik töréspontja a függvénynek. A hatodik oszlop jelzi a töréspont típusát, amit
az EAs∗(∗) algoritmus határozott meg, aszerint, hogy a globális törést egy él átjutási függvénye,
vagy az optimalitás feltétele indikálta. Az utolsó oszlop megadja a ponthoz tartozó legkorábbi
megérkezési időt a második oszlopban megadott időpontban.
Futtatás. Az algoritmus az 5.2 fejezet pszeudo kódja alapján működik. Hamar kiderült, hogy
a töréspontok viszonylag magas száma, valamint a pontok törtlineáris megérkezési függvénye-
ikhez tartozó paraméterek memóriaigénye jelentős. Vegyük észre, hogy a pszeudo kód a pontok
27
függvényét leíró, tömbben tárolt paraméterei közül mindig csak az utolsó rekordot használja.
Hogy elkerüljük a véges memória miatt adódó korlátot, a program az eredményt azonnal a ki-
meneti állományba írja. Bár így lassabb kicsit a feldolgozás, de csak a háttértár kapacitása szab
határt az algoritmusnak.
Ellenőrzés. A fenti program általában óriás kimeneti állományt állít elő még kisebb bemeneti
gráf esetén is. Így annak ellenőrzése, hogy az alap program mennyire dolgozik helyesen, manu-
álisan igen nehéz, szükséges egy ellenőrző rutin. Ez különböző t időpontokra futtatja Dreyfus
algoritmusát, majd a fenti program eredményét feldolgozva megvizsgálja, hogy a pontokhoz így
nyert legkorábbi megérkezési idők megegyeznek-e a pontokhoz tartozó megérkezési függvények
t pontban vett értékével. Az ellenőrzéshez használt 1000 darab t időpont véletlenszerűen került
kiválasztásra.
6.2.4. Forráskódok
A forráskódok, forrásadatok illetve a tesztállományok elérhetőek a mellékelt DVD-n, valamint
a következő hivatkozott linken [7].
7. Elemzés
A bemutatott módszereket végrehajtva a bemeneti gráfokon, az egyes csúcsokhoz egy olyan idő
szerinti függvényt rendeltünk, ami megmutatja, hogy adott s kiindulási pontból, t időpillanatban
történő indulás esetén, mikor érkezünk meg a csúcsba. Több ilyen - elég nagyméretű - szöveges
adatfájl áll rendelkezésünkre, azaz olyan mennyiségű adat birtokában vagyunk, amelyek elem-
zésével már bemutathatók a tendenciák.
Mivel a kiindulási gráfok városok illetve földrajzi területek közlekedési úthálózatai, így az ered-
ményekből következtethetünk egyes forgalmi eseményekre, szokásokra. Várhatóan visszaigazo-
lódnak majd a napi utazásaink során szerzett közlekedésre vonatkozó tapasztalataink. Bár az
megjegyzendő, hogy a kiinduló gráfok valóságot leíró teljessége, pontossága nem feltétlenül biz-
tosított, de a hatalmas rendelkezésre álló adatmennyiség miatt irányvonalak, tendenciák jó biz-
tonsággal meghatározhatók.
28
Az egyes konkrét elemzések mindig az előállított kimeneti állomány adatain alapulnak. Érte-
lemszerűen azonban annak csak annyi adatát használják fel, ami szükséges az eredmény megha-
tározásához. Tehát általában (lehet kivétel, ami a teljes adatkört használja) az egyes elemzések
elvégzése az adatok szűkítésével indul. Ezzel nem csak kezelhetőség, hanem az eredmény szem-
léletes megjeleníthetősége is biztosítható.
Általánosan az egyes konkrét elemzések az alábbi szerkezetben kerülnek bemutatásra:
• Probléma - Felveti a kérdést, amire az elemzés eredményeként választ kapunk
• Feldolgozás - Leírja, hogyan készítjük elő az adatokat, hatjuk végre a feldolgozást
• Eredmény - Leírja, szemlélteti a kapott eredményt
• Következtetés - Értelmezi a kapott eredményt
7.1. Megérkezési függvény
7.1.1. Probléma
Egy tetszőleges pont megérkezési függvényének elemzése, ha egy adott s pontból indulunk.
7.1.2. Feldolgozás
Első feladat egy leválogató szkript elkészítése volt, ami visszaadta a kiválasztott ponthoz tartozó
rekordokat az output állományból. Az így előállt halmaz feldolgozása után kapott koordinátákkal
készült el a lenti grafikon.
A kiinduló gráf (Róma közlekedési gráfja) 3353 csúcsot, és 8870 élt tartalmaz. Ezen futtatjuk
az EAs∗(∗) problémát megoldó algoritmust. Az így előállt adatokból leválogatjuk a fizikailag
legtávolabbi ponthoz tartozó rekordokat. Ez adja a grafikon bemeneti adathalmazát.
7.1.3. Eredmény
A vízszintes tengely nulla pontja éjfélt reprezentál, míg az 1200-as pont este nyolc órát. Így
29
0
200
400
600
800
1000
1200
1400
0 200 400 600 800 1000 1200
Meg
érke
zés
idej
e(p
erc)
Indulás ideje (perc)
Egy forrástól távoli pont megérkezési függvényeForrás megérkezési függvénye
szinte egy teljes nap bemutatásra került.
Az ábrán bemutatott [0, 1200] időintervallumra vonatkozó törtlineáris megérkezési függvény 921
darab töréspontot tartalmaz.
7.1.4. Következtetés
A fenti grafikon két függvényt ábrázol. A szaggatott vonal megadja azt, hogy az indulás idejében
érkezünk a kiindulási pontra. Ennek ábrázolása azért célszerű, hogy a távoli pontba való eljutási
idő is szemléletes legyen. Hiszen a két függvény különbsége pont ezt mutatja.
A 6.2.1 fejezetben említésre került, hogy a gráf és éleihez tartozó átjutási függvények egy köz-
lekedési úthálózatot imitálnak. Ezzel összhangban az eredmény grafikonon visszatükröződnek a
gyakorlatban megtapasztalt közlekedési szokások. Például a reggeli csúcsforgalom, ami láthatóan
öt óra körül kezdődik, és olyan fél nyolc - nyolc körül éri el csúcspontját.
Nyilvánvalóan ez nem olyan meglepő, hiszen a gráf élek átjutási idejeinek meghatározásakor
figyelembe vételre kerültek az általános közlekedési szokások.
30
7.2. Töredezettség sűrűség
7.2.1. Probléma
Azt kívánjuk vizsgálni, hogy milyen összefüggés van egy pont megérkezési függvényének törede-
zettsége, és a kiindulási ponttól való fizikai távolsága között.
7.2.2. Feldolgozás
Ugyanazt a módszert és bemeneti adathalmazt használjuk, mint az előző elemzésben, annyi el-
téréssel, hogy három csúcsot vizsgálunk, egy forráshoz közelit, egy nem messzit, és egy távolit.
Róma közlekedési gráfján futtatjuk az EAs∗(∗) problémát megoldó algoritmust. Az így elő-
állt adatokból leválogatjuk a 3 csúcshoz tartozó rekordokat. Ez adja a grafikonok bemeneti
adathalmazát.
7.2.3. Eredmény
0400800
12001600
0 200 400 600 800 1000 1200
0400800
12001600
0 200 400 600 800 1000 1200
0400800
12001600
0 200 400 600 800 1000 1200
Egy forráshoz közeli pont
Egy forrástól nem túl messzi pont
Egy forrástól távoli pont
A fenti ábrán a három csúcs megérkezési függvényének a 0 és 1200 perc között előforduló tö-
31
réspontjainak halmaza látható. Egy töréspont vízszintes koordinátája megadja a hozzá tartozó
csúcs megérkezési függvényének egy törési helyét, a függőleges koordináta pedig a törés idő-
pontjában kiszámolt legkorábbi megérkezést. A forráshoz közeli csúcs megérkezési függvényében
96, a forrástól nem túl messzi pont függvényében 486, a forrástól legmesszebbi csúcs függvényé-
ben pedig 921 törés fordul elő. Az összes csúcs megérkezési függvényében található töréspontok
átlaga 897.
7.2.4. Következtetés
Az ábrán látható, hogy a legtávolabbi pont megérkezési függvényében van a legtöbb, míg a leg-
közelebbi függvényében van a legkevesebb törés. Ez megfelel az elvárásoknak az alábbiak miatt.
Tudjuk, hogy az élekhez tartozó átjutási függvények szabályos időközönként törnek.
Ha egy élen olyan t időpillanatban indulunk el, mely t-hez tartozó érkezési idő eléri a szabályos
időközönkénti törést, akkor az adott élt követő él végpontjának megérkezési függvényében a t
időpontban törés lesz.
Így értelemszerűen minél több élből áll egy út, annál több törés várható az elért pont megérke-
zési függvényében.
Főleg a legközelebbi csúcsra vonatkozó törésponthalmazra jellemző, hogy vannak időszakok,
amikor ritkább a megérkezési függvény töredezettségének sűrűsége. Ez visszavezethető az élek-
nél beállított átjutási függvények karakterisztikájára, ahol vannak olyan időszakok ahol nincs
óránkénti meredekség váltás, azaz a függvény több órán át lineáris.
7.3. Rövid átjutási idők
7.3.1. Probléma
Olyan gráfokat veszünk, ahol az egyes élek átjutási idejét kicsire állítjuk, és azt vizsgáljuk, hogy
az EAs∗(∗) problémát megoldó algoritmus által meghatározott töréspontok sűrűsége hogyan
változik ekkor, a szokásos méretű átjutási időkkel készített esethez képest.
32
7.3.2. Feldolgozás
Kiindulásként az eredeti gráf (Róma úthálózata) éleihez rendelt értékek kerültek módosításra.
Vizsgálatra kerültek olyan gráfok, amelyekben az élek költségértéke az eredeti élértékek 100, 50
illetve 10 százaléka. Mivel az élekhez tartozó átjutási függvények generálása során, az eredeti
gráf éleinek költségértékei a kiinduló pontok, ezért az egyes átjutási függvények maximuma is
változik (6.2.1).
Az így előállt három új gráfon, az EAs∗(∗) feladatot megoldó algoritmus által megadott összes
töréspont viselkedése vizsgálatra és összehasonlításra került.
7.3.3. Eredmény
0200400600800
0 50 100 150 200 250 300 350 400 450
0200400600800
0 50 100 150 200 250 300 350 400 450
0200400600800
0 50 100 150 200 250 300 350 400 450
100%
50%
10%
A 0 és 450 perc között előfordult töréspontokat mutatják a fenti diagramok a különböző ese-
tekre. A diagramok függvényei a töréspontok darabszámát mutatja adott kis időintervallumon.
Tehát amely időpont körül nagyobb a töréspontok sűrűsége, ott nagyobb az érték.
A töréspontok átlagos száma a diagramok sűrűsödési csomópontjaiban az alábbi:
33
100% esetén 2250
50% esetén 2129
10% esetén 2082
7.3.4. Következtetés
Mint ahogyan a diagramokon látható, minél kisebbek az élek átjutási értékei, a töréspontok
egyre inkább, az élekhez meghatározott törtlineáris átjutási függvények szabályos (óránkénti)
töréspontjaiban sűrűsödnek.
Ez megfelel az elvártaknak, hiszen az EAs∗(∗) feladatot megoldó algoritmus működése során
jellemzően a szabályos töréspontok elérésekor keletkezik leggyakrabban új töréspont. Nyilván
rövidebb átjutási idejű élek esetén kisebb az az időintervallum, mikor elérhetjük az élek függvé-
nyére jellemző szabályos töréspontot.
Ugyanezen okból különbözik az egyes esetek pontsűrűségének mértéke is, azaz nyilvánvalóan
nagyobb átjutási idők esetén, ugyanannyi töréspont nagyobb időintervallumon szóródik, mint
kisebb átjutási idők esetén.
7.4. Approximáció
7.4.1. Probléma
Az EAs∗(∗) algoritmus az indulási idők folytonos változása alapján határozza meg minden egyes
ponthoz annak optimális megérkezési függvényét.
A probléma megoldására az idő diszkrét változtatásával is van lehetőség, hiszen a diszkrét idő-
pontokban meghatározott optimális értékeket alapul véve képezhetünk megérkezési függvényeket
az egyes pontokhoz.
Ezt többféleképpen is megtehetjük:
Az egyik módszer lehet, hogy az egyes pontokban az egymást követő diszkrét indulási időpon-
tokhoz kapott optimális megérkezési idő értékeket egyszerűen egyenessel összekötjük és az így
kapott törtlineáris függvényt tekintjük a pont megérkezési függvényének. (1. módszer.)
Egy másik módszer lehet, hogy a meglévő EAs∗(∗) eljárást módosítjuk úgy, hogy ne önmaga
34
határozza meg a következő töréspontot, hanem a megadott diszkrét időpontokon keressen op-
timumot. (2. módszer) Ekkor a számítás nem csak a megérkezés idejét adja meg, hanem a
megérkezés időpontjához tartozó függvényparamétereket is, nevezetesen a görbe pont körüli me-
redekséget és a 0 ponthoz tartozó ordináta értékét. Ez esetben a megérkezési függvény úgy
képezhető, hogy az egyes diszkrét időpontokhoz tartozó értékekből a kapott függvényparamé-
terekkel egyenest indítunk egészen a következő diszkrét időpontig. Látható, hogy az így kapott
megérkezési függvény - ellentétben az (1) módszer által előállítottal - szakadásokat mutathat a
diszkrét pontokban.
Egy harmadik módszer lehet (3. módszer), hogy adott diszkrét pontokhoz tartozó megérkezési
függvényértékekből a ponthoz tartozó függvényparaméterekkel egyenest állítunk. Ha ez az egye-
nes metszi az előző diszkrét pont hasonlóan képzett egyenesét, akkor a metszésponthoz tartozó
időpontot, mint töréspont regisztráljuk. Ha nincs metszéspont, akkor az (1) módszert alkalmaz-
zuk.
Az EAs∗(∗) feladatot megoldó algoritmus által előállt megérkezési függvény feltételektől függő
darabszámú és eloszlású töréspontot tartalmaz, míg a fenti három módszerrel előállított függ-
vényben a megadott diszkrét pontokban vannak a töréspontok. A harmadik módszer esetén
általában a diszkrét pontok között van egy töréspont vagy maga a diszkrét pont a töréspont.
Az előbbi módszerek felhasználásával minden egyes csúcshoz rendelkezünk három approximációs
megérkezési függvénnyel. Érdekes lehet az alábbiak vizsgálata.
• Tetszőlegesen kiragadott csúcs esetén, mekkora a diszkrét esetek eltérése, a pontos megér-
kezési függvénytől idő szerint.
• Hogyan változik a karakterisztikája az előbbi eltérésnek, ha növeljük a diszkrét pontok
számát adott időintervallumon.
7.4.2. Feldolgozás
A bemeneti gráfokon többféle feldolgozást végzünk. Felhasználjuk Róma úthálózati gráfját il-
letve egy véletlen generált gráfot (pontszám: 3534. élszám: 26754).
A gráfokból kiválasztunk egy pontot, és ezek megérkezési függvényét közelítjük az approximá-
ciós eljárásokkal.
35
Az eddig is használt EAs∗(∗) feladatot megoldó algoritmus futtatása mellett, meghatározott
diszkrét pontokra futtatjuk a fenti approximációs módszereket. Először 60 perces időközökre
osztjuk a vizsgált 400 perces időintervallumot és így megkapjuk a 0, 60, 120, . . . diszkrét pon-
tokat.
Ismételten lefuttatjuk a három eljárást úgy, hogy növeljük a diszkrét pontok sűrűségét az előbbi
időintervallumon (15, 5, és 1 perces időközök).
Ekkor rendelkezésünkre áll az összes megérkezési függvény egy kiválasztott ponthoz, amivel a
kívánt vizsgálódást megtehetjük.
7.4.3. Eredmény
Róma úthálózatán:
02468
10
0 50 100 150 200 250 300 350 400
05
101520
0 50 100 150 200 250 300 350 400
02468
10
0 50 100 150 200 250 300 350 400
(1) módszer - 60 perces diszkrét pontok
(2) módszer - 60 perces diszkrét pontok
(3) módszer - 60 perces diszkrét pontok
36
012345
0 50 100 150 200 250 300 350 400
0123456
0 50 100 150 200 250 300 350 400
012345
0 50 100 150 200 250 300 350 400
(1) módszer - 15 perces diszkrét pontok
(2) módszer - 15 perces diszkrét pontok
(3) módszer - 15 perces diszkrét pontok
00.5
11.5
22.5
33.5
0 50 100 150 200 250 300 350 400
00.5
11.5
22.5
33.5
0 50 100 150 200 250 300 350 400
00.5
11.5
22.5
33.5
0 50 100 150 200 250 300 350 400
(1) módszer - 5 perces diszkrét pontok
(2) módszer - 5 perces diszkrét pontok
(3) módszer - 5 perces diszkrét pontok
37
00.050.1
0.150.2
0.25
0 50 100 150 200 250 300 350 400
00.050.1
0.150.2
0.25
0 50 100 150 200 250 300 350 400
00.050.1
0.150.2
0.25
0 50 100 150 200 250 300 350 400
(1) módszer - 1 perces diszkrét pontok
(2) módszer - 1 perces diszkrét pontok
(3) módszer - 1 perces diszkrét pontok
Véletlen generált gráfon:
00.0050.01
0.0150.02
0.0250.03
0 50 100 150 200 250 300 350 400
00.0020.0040.0060.0080.01
0.012
0 50 100 150 200 250 300 350 400
00.00050.001
0.00150.002
0.0025
0 50 100 150 200 250 300 350 400
(1) módszer - 1 perces diszkrét pontok
(2) módszer - 1 perces diszkrét pontok
(3) módszer - 1 perces diszkrét pontok
38
A fenti diagrammok időeltéréseket (percben) ábrázolnak, azaz minden egyes approximációs függ-
vény eltérését mutatják a pontos EAs∗(∗) feladatot megoldó algoritmus által előállított függ-
vénytől.
7.4.4. Következtetés
A várakozásnak megfelelően a három függvény a diszkrét pontokban egyforma, azaz pontos.
Erre a használt algoritmusokból következtethettünk is, hiszen mindegyik algoritmus az indulási
pontokhoz a dreyfus algoritmus segítségével határozza meg az optimális érkezést.
Az is várható volt, hogy a diszkrét pontok növekedésével a hiba abszolút értéke csökkeni fog.
Meglepő azonban, hogy az (1) módszerrel generált megérkezési függvény hibája, kisebbnek bizo-
nyult, mint a (2) módszerrel előállt megérkezési függvény hibája. A diszkrét pontok sűrűsödésével
a (3) módszer közeledik leggyorsabban az optimálishoz.
Érdekes lehet, ha a diszkrét pontokat nem szabályszerű időközökre választjuk, ennek kutatása
túlmutat a jelen dolgozaton.
Futási idők a Róma úthálózaton:
EAs∗(∗) algoritmus 2752.24 sec
1 percenkénti 5 percenkénti 15 percenkénti 60 percenkénti
(1) módszer 28.06 6.24 sec 2.37 sec 0.78 sec
(2) módszer 29.15 6.57 sec 2.82 sec 1.05 sec
(3) módszer 36.91 9.03 sec 3.91 sec 1.85 sec
Futási idők a véletlen generált gráfon:
EAs∗(∗) algoritmus 2206.12 sec
39
1 percenkénti
(1) módszer 67.02 sec
(2) módszer 75.89 sec
(3) módszer 79.23 sec
Megállapítható a fenti eredményekből, hogy az approximációs eljárások igen jól közelítik a pon-
tos értékeket. Futási idejük lényegesen kisebb a pontos számításnál. Így a gyakorlatban célszerű
valamelyik approximációs módszert használni.
40
Hivatkozások
[1] S. Dreyfus (1969). "An apprasial of some shortest-path algorithms". Operations Research
17, 395-412
[2] B. Dean (1999). Continuous-Time Dynamic Shortest Path Algorithms. Master’s Thesis, MIT
Department of Computer Science.
[3] B. H.Ahn, J. Y. Shin (1991) "Vehicle routing with time windows and time-varying congest-
ion". J. Opl. Res. Soc. 42, 393-400
[4] D. E. Kaufman, R. L. Smith (1993). "Fastest paths in time-dependent networks for
intelligent-vehicle-highway system application". IVHS Journal 1, 1-11
[5] http://lemon.cs.elte.hu/trac/lemon
[6] http://www.dis.uniroma1.it/ challenge9/download.shtml
[7] http://dl.dropbox.com/u/13312187/szd/feltolt.tar.gz
[8] http://www.avglab.com/andrew/
41