42
Útvonalkeresés időfüggő hálózatokban Szakdolgozat 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

Útvonalkeresés időfüggő hálózatokbanweb.cs.elte.hu/blobs/diplomamunkak/bsc_matelem/2011/debreczeni_donat.pdf · Debreczeni Donát Eötvös Loránd Tudományegyetem Természettudományi

  • 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

Nyilatkozat

A szakdolgozat szerzőjeként fegyelmi felelősségem tudatában kijelentem, hogy a dolgozatom ön-

álló munkám eredménye, saját szellemi termékem, abban a hivatkozások és az idézések standard

szabályait követtem, mások által írt részeket megfelelő idézés nélkül nem használtam fel.

42