Heading 1

Seotud dokumendid
lvk04lah.dvi

raamat5_2013.pdf

vv05lah.dvi

Image segmentation

efo03v2pkl.dvi

IMO 2000 Eesti võistkonna valikvõistlus Tartus, aprillil a. Ülesannete lahendused Esimene päev 1. Olgu vaadeldavad arvud a 1, a 2, a 3,

Microsoft Word - essee_CVE ___KASVANDIK_MARKKO.docx

Antennide vastastikune takistus

Matemaatiline analüüs IV 1 3. Mitme muutuja funktsioonide diferentseerimine 1. Mitme muutuja funktsiooni osatuletised Üleminekul ühe muutuja funktsioo

Eesti kõrgusmudel

3D mänguarenduse kursus (MTAT ) Loeng 3 Jaanus Uri 2013

Andmed arvuti mälus Bitid ja baidid

Microsoft Word - 56ylesanded1415_lõppvoor

Polünoomi juured Juure definitsioon ja Bézout teoreem Vaadelgem polünoomi kus K on mingi korpus. f = a 0 x n + a 1 x n a n 1 x

IFI6083_Algoritmid_ja_andmestruktuurid_IF_3

Mida räägivad logid programmeerimisülesande lahendamise kohta? Heidi Meier

Matemaatika ainekava 8.klass 4 tundi nädalas, kokku 140 tundi Kuu Õpitulemus Õppesisu Algebra (65 t.) Geomeetria (60 t.) Ajavaru kordamiseks (15 õppet

Word Pro - digiTUNDkaug.lwp

8.klass 4 tundi nädalas, kokku 140 tundi Hulkliikmed ( 45 tundi) Õppesisu Hulkliige. Hulkliikmete liitmine ja lahutamine ning korrutamine ja jagamine

Mining Meaningful Patterns

HCB_hinnakiri2017_kodukale

Võistlusülesanne Vastutuulelaev Finaal

prakt8.dvi

loeng7.key

EDL Liiga reeglid 1. ÜLDSÄTTED 1.1. EDL Liiga toimub individuaalse arvestuse alusel, kus mängijad on jagatud hooaja EDL Liiga tulemuste põhj

Praks 1

Neurovõrgud. Praktikum aprill a. 1 Stohhastilised võrgud Selles praktikumis vaatleme põhilisi stohhastilisi võrke ning nende rakendust k

Tartu Kutsehariduskeskus IKT osakond Merlis Karja-Kännaste ASUTUSE DOKUMENDIREGISTRI AVALIK VAADE Analüüs Juhendaja Mirjam-Merike Sõmer Tartu 2015

Ülesanne #5: Käik objektile Kooli ümberkujundamist vajava koha analüüs. Ülesanne #5 juhatab sisse teise poole ülesandeid, mille käigus loovad õpilased

loogikaYL_netis_2018_NAIDISED.indd

Tala dimensioonimine vildakpaindel

PowerPoint Presentation

Microsoft PowerPoint - Keskkonnamoju_rus.ppt

Lisa I_Müra modelleerimine

Treeningvõistlus Balti tee 2014 võistkonnale Tartus, 4. novembril 2014 Vastused ja lahendused 1. Vastus: 15, 18, 45 ja kõik 0-ga lõppevad arvud. Olgu

VKE definitsioon

TARTU ORIENTEERUMIS- NELJAPÄEVAKUD neljapäevak Tehvandi, 1. august Ajakava: Start avatud: Finiš suletakse: Asukoht: Võistlu

I Generaatori mõiste (Java) 1. Variantide läbivaatamine Generaator (ehk generaator-klass) on klass, milles leidub (vähemalt) isendimeetod next(). Kons

Kiekim mees kirjeldus.docx

Saksa keele riigieksamit asendavate eksamite tulemuste lühianalüüs Ülevaade saksa keele riigieksamit asendavatest eksamitest Saksa keele riigi

HCB_hinnakiri2018_kodukale

01_loomade tundmaõppimine

Microsoft Word - Toetuste veebikaardi juhend

Microsoft PowerPoint - KESTA seminar 2013

(10. kl. I kursus, Teisendamine, kiirusega, kesk.kiirusega \374lesanded)

Excel Valemite koostamine (HARJUTUS 3) Selles peatükis vaatame millistest osadest koosnevad valemid ning kuidas panna need Excelis kirja nii, et

Fyysika 8(kodune).indd

Tants on loodud 1985.aasta tantsupeoks Muusika Lepo Sumra Koreograafia Helju Mikkel koostöös Lille- Astra Arraste ja "Sõlesepad" tantsurühma meestega.

Kaupmehed ja ehitusmeistrid Selle laiendusega mängimiseks on vajalik Carcassonne põhimäng. Laiendit võib mängus kasutada täielikult või osaliselt ning

efo09v2pke.dvi

6 tsooniga keskus WFHC MASTER RF 868MHz & 4 või 6 tsooniga alaseade SLAVE RF KASUTUSJUHEND 6 tsooniga WFHC RF keskus & 4 või 6 tsooniga alaseade SLAVE

Praks 1

Õppeprogramm „vesi-hoiame ja austame seda, mis meil on“

Programmi Pattern kasutusjuhend

PÄRNU TÄISKASVANUTE GÜMNAASIUM ESITLUSE KOOSTAMISE JUHEND Pärnu 2019

Kasutusjuhend Dragon Winch vintsile DWM, DWH, DWT seeria Sisukord Üldised ohutusnõuded... 3 Vintsimise ohutusnõuded... 3 Kasulik teada... 4 Vintsimise

Abiarstide tagasiside 2016 Küsimustikule vastas 137 tudengit, kellest 81 (60%) olid V kursuse ning 56 (40%) VI kursuse tudengid. Abiarstina olid vasta

NR-2.CDR

Pimeda ajal sõitmine

Praks 1

ArcGIS Online Konto loomine Veebikaardi loomine Rakenduste tegemine - esitlus

Microsoft Word - Errata_Andmebaaside_projekteerimine_2013_06

Microsoft PowerPoint - Kindlustuskelmus [Compatibility Mode]

SEPTIKU JA IMBVÄLAJKU KASUTUS-PAIGALDUS JUHEND 2017

Septik

Microsoft PowerPoint - loeng2.pptx

2016 aasta märtsi tulumaksu laekumine omavalitsustele See ei olnud ette arvatav Tõesti ei olnud, seda pole juhtunud juba tükk aega. Graafikult näeme,

SH_Rogaini_AjaO

Slide 1

G OSA A VARIANT RESPONDENDILE ISE TÄITMISEKS

Sügis 2018 Kõrgema matemaatika 2. kontrolltöö tagasiside Üle 20 punkti kogus tervelt viis üliõpilast: Robert Johannes Sarap, Enely Ernits, August Luur

QUANTUM SPIN-OFF - Experiment UNIVERSITEIT ANTWERPEN

Õppimine Anne Villems, Margus Niitsoo ja Konstantin Tretjakov

Page 1 of 6 Otsid teistmoodi eluviisi? Kommuun - uued energiasäästlikud ridaelamud Tabasalu parkmetsas! Kuigi Tallinn ja Harjumaa on uusarenduste ülek

6. KLASSI MATEMAATIKA E-TASEMETÖÖ ERISTUSKIRI Alus: haridus- ja teadusministri määrus nr 54, vastu võetud 15. detsembril E-TASEMETÖÖ EESMÄRK Tas

Sissejuhatus mehhatroonikasse MHK0120

PIKSELOITS Täpsustused 15.oktoobri 2018 seisuga Tants on loodud 1985.aasta tantsupeoks Muusika Lepo Sumra Koreograafia Helju Mikkel koostöös Lille- As

PowerPoint Presentation

Operatsioonisüsteemide ehitus

Microsoft Word - requirements.doc

M16 Final Decision_Recalculation of MTR for EMT

(Microsoft Word - T\366\366leht m\365isaprogramm 4-6 kl tr\374kkimiseks.doc)

Hoia oma arvuti turvaline ja kiire 1.Leia start nupust alustades Juhtpaneel 2.Juhtpaneeli aadressiribalt leia Kõik juhtpaneeli üksused 3.Avanenud tööa

Tarkvaraline raadio Software defined radio (SDR) Jaanus Kalde 2017

DVD_8_Klasteranalüüs

Taskuprinter KASUTUSJUHEND

Microsoft Word - KOV_uuringu_analyys.doc

Projekt: Sööbik ja Pisik Tartu Lasteaed Piilupesa Koostajad: Merelle Uusrand ja Ülle Rahv Sihtgrupp: 4 5aastased lapsed Periood: veebruar märts 2017 P

Tootmine_ja_tootlikkus

ITI Loogika arvutiteaduses

loeng2

Matemaatilised meetodid loodusteadustes. I Kontrolltöö I järeltöö I variant 1. On antud neli vektorit: a = (2; 1; 0), b = ( 2; 1; 2), c = (1; 0; 2), d

Remote Desktop Redirected Printer Doc

laoriiulida1.ai

Lisa 2 Maanteeameti peadirektori käskkirjale nr 0250 Kattega riigimaanteede taastusremondi objektide valikumetoodika Maanteeamet Tallinn 20

Tuustep

Tartu Ülikool

4. KIRURGIA Üliõpilase andmed. Need väljad täidab üliõpilane Praktikatsükli sooritamise aeg Kirurgia praktikatsükkel Ees- ja perekonnanimi Matriklinum

6

Väljavõte:

Pärnu Sütevaka Humanitaargümnaasium Optimaalse tee leidmine kahe punkti vahel etteantud kolmemõõtmelisel maastikul Lõputöö / aastatöö Prima /Secunda aste Dan Bogdanov / Martin Kapp Juhendaja: Ahto Truu 2001

Sisukord Sissejuhatus... 7 1. Ülesande kirjeldus... 9 1.1 Optimaalsete teekondade leidmise ülesanne maastikul...9 1.2 Sisendandmed...9 1.3 Väljundandmed... 9 2. Varasemad tööd ja kasutatud algoritmid... 11 2.1 Allikad...11 2.2 Erinevad meetodid optimaalsete teekondade otsinguks...11 2.2.1 Ühtlane maastiku võrejaotus ja erinevad graafiotsingud... 11 2.2.1.1 Laiuti otsing graafis... 12 2.2.1.2 Dijkstra algoritm...13 2.2.1.3 Sügavuti otsing graafis... 14 2.2.1.4 Iteratiivselt süvenev sügavuti otsing graafis...15 2.2.1.5 Parim-enne otsing...16 2.2.1.6 A* algoritm...16 2.2.2 Ebaregulaarset osajaotust kasutavad algoritmid ning optika analoogiate kasutamine...18 2.3 Maastiku esitus puustruktuuri abil ja selle eelised... 19 3. Algoritmi kirjeldus... 20 3.1 Maastiku sõrestiku loomine... 20 3.2 Rajapunktide leidmine...23 3.3 Graafi koostamine... 24 3.3.1 Kahendpuu harude polaarsus ja liikumine mööda kahendpuud...25 3.3.1.1 Polaarsus...25 3.3.1.2 Liikumine kahendpuus... 25 3.3.2 Rajapunktide sidumise reeglid... 26 3.3.3 Teelõikude pikkuse arvutamine... 28 3.4 Graafiotsing...29 3.4.1 Eessõna algoritmile...29 3.4.2 Algoritmi sammud... 29 3.4.3 Algoritmi töö tulemus...31 4. Laiendused... 32 4.1 Kahekordne otsing...32-3 -

4.2 Täpsemad energiakuluarvutused... 32 4.3 Optikaseaduste kasutamine optimaalse tee leidmisel...33 4.4 Väikeste pöörete silumine... 34 Kokkuvõte... 35 Kasutatud materjalid...36 Lisa 1: Rakendusprogramm...39 Sissejuhatus... 39 Programmi disain... 39 Kasutatud vahendid... 40 Klassimudel...40 Klassimudeli joonis... 40 Põhiklassid...41 Kõrguskaart - class ttheightmap...42 Kirjeldus...42 Avalikud meetodid... 42 Kaitstud andmed...43 Algoritmi tuum - class tttraverser...43 Kirjeldus...43 Avalikud meetodid... 44 Kaitstud funktsioonid... 45 Avalikud andmed... 45 Kaitstud andmed...45 Lapp - class ttpatch...47 Kirjeldus...47 Avalikud meetodid... 47 Kaitstud meetodid... 49 Kaitstud andmed...49 Kasutatud andmestruktuurid...50 Puustruktuuri kolmnurk - struct tttrinode...50-4 -

Kirjeldus...50 Avalikud andmed... 50 Rajapunkt - struct ttwaypoint...52 Kirjeldus...52 Avalikud andmed... 52 Rada - struct ttroad... 52 Kirjeldus...52 Avalikud andmed... 52 Radade nimekiri - class ttroadlist...53 Kirjeldus...53 Avalikud meetodid... 53 Eraldatud andmed...54 Rajapunktide nimekiri - class ttnodelist... 54 Kirjeldus...54 Avalikud meetodid... 54 Eraldatud andmed...55 Резюме...56 Summary... 58-5 -

Sissejuhatus Optimaalsete teekondade leidmise ülesannete juures on alati üks ühine joon üritatakse saavutada suurimat võimalikku kasutegurit. See võib olla näiteks vähim teepikkus või energiakulu või mõlemad seotult. Oma töös kirjeldame teede otsimise algoritmi, mis suudab leida lühima tee kahe punkti vahel arvestades maastiku iseärasusi (tõusudest ja langustest tingitud teepikkuse muutuseid ja ka energiakulu, mis muutub erinevate tõusunurkadega teedel liikumisel). Töö alguses toome me välja ülesande üleüldise kirjelduse. Andmed, mida algoritm tulemusteni jõudmiseks vajab ja ka üldise väljundi kirjelduse, milleni programm peab jõudma. Pärast ülesande püstitamist asume analüüsima olemasolevat informatsiooni. Sealjuures räägime samas valdkonnas varem ilmunud töödest ja erinevatest optimaalse tee leidmiseks mõeldud algoritmidest. Oma töös oleme välja toonud teekonnaotsingute kaks põhilist liiki. Esiteks on meetodid, kuhu ka meie algoritm kuulub see on maastiku jaotamine võrestikuks ja seejärel sellel graafiotsingu läbiviimine. Teine suund on küll teatud tingimustes oluliselt täpsem ja optimaalsem, kuid samas on see keerukam ja ressursinõudlikum meetod: optika analoogiate kasutamine geomeetrias. Graafiteooria tunneb suurt hulka erinevaid algoritme, meie oleme välja valinud neist kuus tuntuimat ja enimkasutatavat - laiuti ja sügavuti otsingu koos täiendustega ning kaks heuristilist meetodit. Järgmise peatükina esitamegi ülevaate enda algoritmist. Peatükk kirjeldab lähteandmete otsingueelset ettevalmistust. Selgitame, kuidas programm töötleb sisendina antavat maastikku ja kuidas ta seal ringi liikuda suudab. Selgitatakse kasutatud andmestruktuure ja graafi koostamise põhimõtteid. Seejärel jõuame otsingu enese juurde. Otsingu kirjeldusele eelneb ka selgitav osa kasutatud terminoloogiast ning kirjeldus, kuidas ja mille alusel üldse optimaalset teed otsima hakatakse. Pärast seda käsitleme kasutatud graafiotsingualgoritmi A* (loe: a-tärn) juurde: A* on küllalt keerukas algoritm, mis on aga samas üks täpsemaid üldse. Veel kirjeldame selle algoritmi üldiseid põhimõtteid ja seda, kuidas meie teda programmis rakendanud oleme. - 6 -

Pärast algoritmi selgitust toome me välja ideed, mida ehk tulevikus edasi tuleks arendada. Need on seotud juba veelgi laialdasemate teedeotsingumeetoditega ja sellega, kuidas saaks siinkirjeldatut täpsemaks muuta. Näidetena oleme toonud välja kahekordse teedeotsingu meetodi, kuid ka optikaseaduste kasutamise käesoleva algoritmi juures. Kirjeldame ka otsingul tekkivaid võimalikke ebatäpsusi, mis algoritmi praeguse kuju juures esineda võivad. Samas arutleme ka võimalike lahenduste üle, mida tulevastes töödes kindlasti uurida tuleks. - 7 -

1. Ülesande kirjeldus 1.1 Optimaalsete teekondade leidmise ülesanne maastikul Kirjeldatav algoritm annab lahenduse optimaalse teekonna leidmise probleemile lineaarse maastiku kahe punkti vahel eeldusel, et selline teekond eksisteerib. Teekonna leidmisel võtame arvesse läbitava teekonna pikkust ja läbimisraskust, asetades teepikkuse suhtesse läbitava maastiku iseärasustega, milleks võivad olla pinna tõus ja langus ning nendest tulenevad energiakulu muutused. Algoritm annab optimaalse teekonna kahe kindla punkti vahel, seega on ta peamine eesmärk eelplaneerimine, mitte reaalajas parima liikumissuuna valik. Maastikku käsitleme deformeerunud tasandina, kus igale tasapinna punktile on antud vertikaalne kaugus nulltasandist. Lahendus ei käsitle eraldi maastikul esinevaid vorme, näiteks veekogusid, metsi ja soid, küll aga võib neid tingimusi simuleerida, omistades maastiku eri piirkondadele raskuskoefitsiendi, mis väljendab liikumisel kuluva energiahulga muutumist võrreldes lihtsaima pinna (näiteks rohumaa) läbimisel kuluvaga. 1.2 Sisendandmed Oma lahenduse lähteandmetena vajame me informatsiooni maastiku ja teekonna algus- ning lõpppunkti kohta. Maastiku lähtevorminguna kasutame kõrguskaarti ehk siis maapinna horisontaalkoordinaatide kõrguste tabelit määratud vahemaade tagant maastiku võrekujult võetud näitajate järgi. Teavet maastiku iseärasuste kohta loeme vajadusel eraldi kaardilt, mis sisaldab kõigi erinevate läbitavusastmetega piirkondade koordinaate ja kulukoefitsiente. Algoritmi tööd saab reguleerida vastavalt määravamale faktorile - kui tähtsam on tee lühidus ning tõusu ja langust arvesse võtta ei ole vaja, siis saab teepikkuse ja energiakulu vahelise suhte niiviisi seada. 1.3 Väljundandmed Töö tulemusena väljastab algoritm järjestatud punktide jada, mis moodustavad maastikul valitud algus- ja lõpp-punkti vahele jääva optimaalse teekonna võimalikult parima lähenduse, võttes arvesse kõiki liikumiskiirust ja energiakulu mõjutavaid tegureid. Kui need punktid vastavalt antud järjekorrale sirgetega ühendada, moodustubki tegelik marsruut. Reaalses elus ei ole selline sirgjooneline liikumine alati teostatav, kuid ka ainuüksi leitud - 8 -

rajapunktide järgimine võib teekonda oluliselt lühendada. - 9 -

2. Varasemad tööd ja kasutatud algoritmid 2.1 Allikad Optimaalsete teekondade leidmise probleem on küllalt palju käsitlust leidnud. Seda teemat käsitlevate uuringutega tegeletakse paralleelselt teiste tehisloogika loomise püüetega. Optimaalsete teekondade leidmise algoritmid leiavad tehnilist rakendust liikumise eelplaneerimisega tegelevates süsteemides ja ka autonoomsetes robotüksustes. Sarnaseid meetodeid kasutavad ka kosmoseuuringutega tegelejad kulguritele parima liikumissuuna andmiseks. Ja loomulikult kasutavad lühimate teede leidmist küllalt palju mängude programmeerijad oma loodavate tegelaste liikumise juhtimiseks. Sellest tuleneb ka fakt, et selliseid uurimusi rahastab tavaliselt sõjavägi, kosmoseuurijad või suured arvutimängude tootjad. 2.2 Erinevad meetodid optimaalsete teekondade otsinguks 2.2.1 Ühtlane maastiku võrejaotus ja erinevad graafiotsingud Teekondade otsingu algoritmid töötavad tavaliselt maastiku mudeli peal. Lihtsaim neist on maastiku ühtlane võrejaotus, mille puhul otsinguväli jaotatakse ühtlasteks osadeks, näiteks ruudukujulisteks tükkideks, mis moodustavadki võre, ning igale ruudule omistatakse selle ruudu läbimisel kuluva energia hulk. Niimoodi saadakse mudel, mida on väga lihtne kasutada, kuid millel on ka mitmeid puudusi: Kindel ruudustik (või mis iganes jaotus) ei võimalda täiesti optimaalseid teekondi, sest tekivad nurgelised, siksak-trajektoorid ning kohad, kus "lõigates" saaks kiiremini. Alati ei ole kerge otsustada, kui detailseteks osadeks tuleks maastik jaotada. Suurte pindade peale läheb palju kaotsi, kuid suurema jaotuse puhul võib täpsemalt eristuvate vormide esitus kesiseks jääda. Igal võrejaotuse osal on oma kindel energiakulu väärtus, samas võib ta katta mitut tegelikult eri regioonides asuvat ja eri kuluväärtust omavat pinnatükki. Mõningaid liikumissuundi eelistatakse täiesti ebaõiglaselt teistele, näiteks ruudustiku kujul esitatud võres on kasutusel peamiselt horisontaalne, vertikaalne ja diagonaalne liikumine. Aga esineda võib ka juhtumeid, kus näiteks ratsukäik võimaldaks veelgi rohkem optimiseerimist. - 10

Kõik sammud pole võrdsed - diagonaalseid samme näiteks tuleks lugeda pikemateks jne. Kõik neist puudustest ei ole väga määravad, kuid maastikul tulevad nad tõsisemalt esile. Saadava ruudustiku baasil koostatakse siis lõpuks graaf, kus kõik ühendusteed omavad ruudud märgitakse graafis ühendatud tippudeks. Seega võib igast tipust väljuda kuni kaheksa serva, mida mööda liikudes läbitaksegi simuleeritavat maastikku. Sellisel mudelil on graafiotsingu meetodite kasutamise väga lihtne, mistõttu mängudes kasutatakse neid laialdaselt. Ülevaate nende kasutusest mängude programmeerimise seisukohalt on andnud Stout 1. Ta on kirjeldanud ka algoritme, mis võimaldavad teekondade leidmist nö. "lennult", see tähendab ilma ette arvutamata. Neid algoritme siin aga ei käsitleta, sest nad ei anna eriti täpseid tulemusi ja praegused protsessorid on piisavalt võimsa arvutusjõudlusega, et suurem osa teekondadest ette planeerida, reaalajas "mõtlemise" asemel. Järgnevalt annamegi ülevaate levinumatest graafiotsingumeetoditest, nende eripäradest, headest ja halbadest külgedest. Iga tüübi juures on ka toodud näited algoritmi käitumisest erinevate ülesannete puhul. (Algoritmide tööd demonstreerivad joonised on tehtud Bryan Stouti enda loodud programmi Path Search Demo abil, mis võimaldab luua tasapinnalise ruudulise otsinguvälja erineva energiakuluga ruutudest ning seal peal määratud algus- ja lõpp-punkti vahel kirjeldatud algoritmide abil lühimaid teekondi leida. Joonistel tähistab roheline ring lähte- ja punane sihtpunkti.) 2.2.1.1 Laiuti otsing graafis Üks levinumaid algoritme teadaoleva moega pinnal optimaalsete teekondade leidmiseks ongi laiuti otsing - "laineharja järgimine" (ing. k wavefront propagation). Algoritm ise töötab nagu vette kukutatud kivi - liigutakse järjest kõikidele algustipule lähimatele ruutudele ning sealt samamoodi edasi. Niimoodi laieneb otsimispiirkond lainena järjest ning kui jõutakse sihtpunktini, siis leitakse tagasitee mahajäetud viitade abil. Jääb veel üle kontrollida, kas leidub kiiremaid teekondi. Selleks kontrollitakse läbi kõik sihtpunktini viivad teekonnad. Lihtne laiuti otsing on toodud joonisel 2.1a. 1 Stout, W. B., Smart Moves: Intelligent Path-Finding - 11

Joonis 2.1a - laiuti otsing Joonis 2.1b - laiuti otsing energiakuludega Selline algoritm on väga lihtne ja kerge realiseerida. Näiteks võib iga külastamata tipu naabertipud lisada vabade tippude nimekirja, milleks sobib hästi FIFO (first-in first-out) tüüpi järjekord. Siis võetakse vabad tipud järjest läbi ja iga tipu juures külastatakse vastavalt selle "vabu" naabertippe. Algoritmil on siiski ka mitmeid vajakajäämisi. Ta on küllalt raiskav, sest otsib pimedalt igast suunast. Mõnede lihtsate lisandustega on võimalik küll otsimist tõenäolisse sihtpiirkonda suunata. Ilma sellise abita jätab otsingu käik väga mõttetu mulje. Nagu ilmneb ka jooniselt 2.1b, ei arvestata väga hästi energiakulu. Nimelt peaks lühim teekond minema ümber viirutatud ala (antud näites oli viirutatud ruudu ületamine kaheksa korda kulukam kui tavalise ruudu läbimine). Algoritmile on tehtud mitmeid täiendusi, ligikaudu kaks korda saab vähendada tehtava töö hulka, alustatades korraga kahte otsingut, ühte algus- ja teist lõpp-punktist. Kiirusele see siiski suurt juurde ei lisa. Ka on katsetatud rekursiivset pinna jaotamist detailsemateks osadeks ning järskude kurvide lõikamist vähem teravateks. Nii saavutatakse täpsemad tulemused, kuid see on lisatöö ja parandab tulemusi peaaegu igasuguse graafiotsingu puhul. 2.2.1.2 Dijkstra algoritm Taani matemaatik E. Dijkstra töötas välja võrdlemisi klassikalise algoritmi otsinguks graafides, kus servade läbimise kulu on erinev. Igal sammul vaatab algoritm algtipule lähimat tippu ja selle naabreid ning märgib või uuendab igaühe kaugust alguspunktist. Sellise lähenemise eelised lihtsa laiuti otsingu ees on teekonna pikkuse ja energiakulu arvestamine ning nõnda "heade" servade leidmine, mida mööda on võimalik kiiremini liikuda. Siin kasutatav tippude järjekord tuleb programmeerida nn. prioriteetidega järjekorraks, kust esimesena väljuvad tipud, mis on kõige kõrgema prioriteediga - antud juhul tähendab see tippe, mille kaugus otsingu algtipust on kõige väiksem. - 12

Joonis 2.2a - Dijkstra algoritm Joonis 2.2b - Dijkstra algoritm ja energiakulu Nagu nähtub joonistelt 2.2a ja 2.2b, töötab Dijkstra algoritm küllaltki hästi, võttes korrektselt arvesse kulukamate tsoonide läbimist. Kuid nagu laiuti graafiotsingki, ei võta see algoritm üldse arvesse lõpp-punkti suunda ning otsib samuti "pimesi". Siiski, kuna ta leiab optimaalse teekonna ning "saab aru" ka energiakulude süsteemist, on Dijkstra algoritm küllaltki populaarne. 2.2.1.3 Sügavuti otsing graafis Sügavuti otsimise peamine erinevus laiuti otsimisest on graafis liikumisel servade ületamise järjekord. Kui laiuti otsimisel oli otsing laineline, siis sügavuti otsingul minnakse valitud teed mööda nii kaugele kui võimalik. Et otsing lõpeks, tuleb mõistlikule kaugusele panna piir, kust tullakse tagasi järgmist haru uurima. Sellist süsteemi programmeerides on otstarbekas kasutada rekursiooni, kuid see pole kohustuslik. Võib ka lihtsalt laiuti otsingus kasutatud FIFO-tüüpi järjekorra asendada LIFO (last-in first-out) magasiniga. Rekursioonil tuleb hoolsalt jälgida, et tippude külastatust märgitaks korrektselt. Nii välditakse samade tippude läbimist uute radade otsingul. Kui algoritmi rakendatakse geomeetrilisel teekonnaotsingul, võib algoritmile lisada täiendusi "rumaluste" vältimiseks. Üks võimalus on kõikide tippude kohta temani seni jõudnud lühima teekonna pikkuse väärtuse hoidmine. Nüüd võib tipu läbimise keelata, kui sinna jõudes on kulunud juba rohkem kui teadaolevalt lühimat teed tipuni jõudmiseks kulus. Teiseks võib määrata, et kõigepealt jätkatakse uue haru loomisel otsingut sihtpunkti suunas. Nende kahe lisandusega saavutab algoritm arvestatava kiiruse ja efektiivsuse. - 13

Joonis 2.3a - sügavuti otsing Joonis 2.3b - sügavuti otsing energiakuludega Nagu näha jooniselt 2.3a, leiab kõigi kirjeldatud lisandustega sügavuti otsing lühima tee kiiresti ja lihtsalt. Ka see otsinguväli, millel lihtne laiutiotsing andis ebaoptimaalse lahenduse, ei ole algoritmile probleemiks. Nagu näha jooniselt 2.3b, leiab ta lühima tee ümber viirutatud ala. Kuid see toimib vaid siis, kui äralõiked toimuvad sobivalt sügavuselt. Parimad tulemused saavutatakse siis, kui otsing peatatakse täpselt sellisel sügavusel, kui pikk on optimaalne teekond. Probleemiks on aga see, et otsingu alguses ei ole õige sügavus teada ja saab teha vaid hinnanguid. Joonistel kujutatud otsingutel arvutati sobivaimad väärtused ise välja (esimesel joonisel 11, teisel 15). Kui sügavus on väiksem, et jõuta kunagi kohale. Kui aga suurem (näiteks 25, tekivad juba väiksed kõrvalekalded, mida näitavad joonised 2.3c ja 2.3d. Joonised ei kujuta tegelikult seda, kui palju variante läbi proovitakse, vaid ainult viimast. See on tingitud sügavuti otsimise loomusest. Algoritmi töö on jälgitav vaid reaalajas, liikumine otsinguprotsessi käigus jätab mulje kogu kaardi läbikompimisest. Joonis 2.3c - sügavuti otsing liigse sügavusega Joonis 2.3d - energiakuluga liig-sügav otsing 2.2.1.4 Iteratiivselt süvenev sügavuti otsing graafis Kuna sügavuti otsing nõuab otsingu peatamist teatud sügavusel, võib tekkida kaks situatsiooni. Esiteks, kui teekond lõigatakse ära liiga vara, ei tarvitse otsing sihini jõuda. Kui aga liiga hilja, võib suur hulk aega minna raisku ummikteid läbi otsides või liiga raskeid maastikke läbides. Üks lahendus on otsingusügavuse pidev suurendamine pärast iga "ringi", kusjuures algseks sügavuseks on soovitatav panna alguspunkti kaugus lõpp-punktist, kui mõlemad punktid on samal - 14

sirgel. Senitutvustatud "toorest jõudu" kasutavatest algoritmidest on see kõige optimaalsem. Selle algoritmi tööd näitavad joonised oleksid täpselt samasugused nagu 2.3a ja 2.3b, sest ta leiab automaatselt õige sügavuse. 2.2.1.5 Parim-enne otsing Nõndanimetatud parim-enne meetod (inglise keeles best-first) on kirjeldatud otsingumeetoditest esimene, mis oma töös ka heuristiliselt olukorda hindab ja võtab arvesse teavet, mis otsingupiirkonna kohta olemas on. Ta sarnaneb Dijkstra algoritmile, kuid selle asemel, et tippe sorteerida nende kauguse järgi alguspunktist, hinnatakse ligikaudselt ära tippude kaugus lõpppunktist ja koordineeritakse otsingut nende andmete järgi. Neid väärtuseid ei ole ka vaja otsingu käigus uuendada, sest nad on konstantsed. Joonis 2.4a - Parim-enne algoritm Joonis 2.4b - Parim-enne algoritm ja energia See on ka senikirjeldatutest kiireim algoritm. Tõesti, ka jooniselt 2.4a nähtub, et ta liigub peamiselt õiges suunas, "vaadates" kõrvale vaid selleks, et suuna õigsuses veenduda. Algoritmi vigadeks on aga serva läbimisel kuluva energiaga mittearvestamine ja vahetevahel tekkivad "sakilised" rajad, mis tulenevad liialt väiksest heuristilisest faktorist. Jooniselt 2.4b on näha, kuidas "küntakse" läbi energiakulukama tsooni ilma, et sellest väljagi tehtaks. 2.2.1.6 A* algoritm Parim tuntud algoritmidest teekondade otsingul on nõndanimetatud A-tärn (inglise keeles A-star) algoritm. See heuristiline otsing hindab iga graafi tipu seda läbiva optimaalse teekonna hinnangulise pikkuse järgi. Iga tipu väärtus väljendub valemis A* kombineerib edukalt Dijkstra algoritmi seniste teekondade jälgimise veel läbida jäänud teekonna - 15

pikkuse heuristilise hinnanguga, mida kasutas parim-enne algoritm. A* omab mõningaid huvitavaid omadusi. Optimaalne tee leitakse igal juhul, kui h(n) on korrektne, see tähendab, mitte kunagi suurem kui tegelik läbida jäänud tee. Niimoodi kasutatakse heuristilist funktsiooni kõige efektiivsemalt. Mitte ükski teistest algoritmidest, mis kasutavad samasugust heuristikat optimaalsete teekondade leidmiseks, ei käi läbi nii vähe tippe kui A* (erinevaid tippe läbivad, kuid pikkuselt võrdseid teekondi arvesse ei võeta). Joonis 2.5a - A* algoritm Joonis 2.5b - A* algoritmi energiakulukäsitlus A* tuleb väga hästi toime kõigi senikasutatud näidetega, nagu on näha joonistel 2.4a ja 2.4b. Heuristiliseks teguriks on valitud 1, mis on lihtsate pindade peal parim valik. Kui tegur muuta aga liiga suureks, hakkab algoritm oma "intuitsiooni" liiga aktiivselt kasutama. Näiteks joonisel 2.5c on A* heuristilise teguriga 5 valinud optimaalsest veidi kõverama tee. Samuti 2.5d, kus heuristilise teguriga 8 hakkab algoritm nurki maha lõikama. Joonis 2.5c - A* heuristilise teguriga 5 Joonis 2.5d - A* heuristilise teguriga 8 Mida suuremaks heuristilist tegurit muuta, seda rohkem kasutab algoritm otsingul lõpp-punkti suunas minekut (parim-enne-tehnika). Kui see tegur on väike, käitub A* suhteliselt sarnaselt Dijkstra algoritmile. Võibki väita, et A* on Dijkstra ja parim-enne süntees, mis omab mõlema parimaid omadusi. Rakendustes tuleb nende poolte vahele leida aga sobiv tasakaalupunkt. - 16

2.2.2 Ebaregulaarset osajaotust kasutavad algoritmid ning optika analoogiate kasutamine Rowe ja Richbourg uurisid optimaalsete teekondade leidmist üle tasandi läbitavusraskuselt ja kujult erinevate regioonide 2. Selles töös näitasid nad, et kui pinda ei jaotata kindlateks ühesugusteks osadeks, siis teine võimalus on regioonide kujule jätmine, kusjuures viimased ei pea olema korrapärased kujundid. Siiski nõuavad põhiosa algoritmidest hulknurkseid ja soovitatavalt kumeraid (alam)regioone. Tekkivas olukorras on võimalik tasapinda käsitleda kui optilist keskkonda, mille eri regioonidel on erinev optiline läbitavus. Ning kuna Fermat' printsiibi järgi on aeg, mis kulub valgussignaalil ühest punktist teise jõudmiseks, tegeliku trajektoori (valguskiire) korral kõigi võimalike naabertrajektooridega võrreldes ekstreemne (üldiselt minimaalne), siis on võimalik "valguskiiri jälitada" ning leida punktid, mida nad läbiksid analoogses optilises keskkonnas ja kus toimuks pöörded teel (valguse murdumine). Snelli murdumisseaduse järgi, kus sin α 1 on langemisnurk ja sin α 2 on murdumisnurk ning valguse kiirus lähte- ja sihtkeskkonnas on vastavalt n 1 ja n 2, avaldub murdumisnurk järgmises valemis: Lühimate teekondade otsingul võib seda valemit tõlgendada nii, et n 1 ja n 2 on ühe pikkusühiku läbimiseks kuluv energiahulk lähte- ja sihtregioonis ning α 1 ja α 2 on nurgad regiooni selle serva, kus pööre toimub, ristsirge ja lähtesuuna vektori ning sihtsuuna vektori vahel. Ehk siis murdumisseadus toimib võrdselt hästi nii valguskiirte kui teekondade suhtes. See on ka põhjus, miks eelistatakse hulknurkseid regioone - kõveratel on ristsirgete leidmine geomeetriliselt komplitseeritum. Samasugust lähenemist ruumilises keskkonnas kirjeldavad Rowe ja Davis 3. Selle töö peamine saavutus on ruumilise maastiku jaotamine võrdsete kuupide asemel ebaregulaarseteks hulktahukateks. Teine huvitav laiendus on võimalus teekonna otsingut panna sõltuma teatud 2 Rowe, N. C., Richbourg, R.F., An Efficient Snell's-Law Method for Optimal-Path Planning Across Multiple Twodimensional Irregular Homogeneous-Cost Regions 3 Rowe, N. C., Lewis, D. H., Vehicle path-planning in three dimensions using optics analogs for optimizing visibility and energy cost - 17

vaatlejate asukohtadest. Näiteks võib määrata "soovitavad" vaatlejad, kelle vaatevälja võiks enamus teekonnast jääda ning "ebasoovitavad" vaatlejad, kelle vaatevälja ei tohiks sattuda. Praktiliste rakendustena võib vaadelda esimesel juhul näiteks lennukite trajektooride planeerimist nii, et nad jääks pidevalt lennujuhtimiskeskuste vaatevälja ja teisel juhul liikumine vaenulike üksuste jaoks nähtamatuks jäädes. Palju kasu annab algoritm ka autonoomsete kosmoseuuringuseadmete liikumise planeerimisel. Lihtsa füüsikalise mudeli teekonnaotsingutes kasutamiseks annavad Rowe ja Ross 4. Mõeldud on see mudel küll veokite ja mobiilsete robotite jaoks, sest energiakulu arvutamisel võetakse arvesse gravitatsioon, hõõrdejõud, veojõud ning ka tõus ja langus. Eeldatakse, et pööretel on energiakulu kasv minimaalne ning liikuval objektil kiirendust ei ole. Eraldi huvitavaks uurimuseks on Rowe'i uurimus teekonna leidmiseks tasapinnal, kus on ka läbimatud takistused, energiakulu vähendavad teed ja seda suurendavad veekogud 5. Töö annab huvitava heuristilise analüüsi meetodi pöörete optimaalsuse leidmiseks. 2.3 Maastiku esitus puustruktuuri abil ja selle eelised Kuna maastik on enamasti ebaühtlase ehitusega, siis leidub seal väga erineva pinnamoega kohti. Seega ükski tasakaalustatud või staatiline andmetüüp ei oleks maastiku kuju talletamiseks mäluvajadust ja kasutuslihtsust arvestades optimaalne. Parema tulemuse annavad täisdünaamilised ja ebaühtlust võimaldavad andmetüübid, milleks sobib täielikult puustruktuur. Kui ühtlane võrejaotus ei võimalda maastikuga täpselt kohaneda, siis puud suudavad seda. Sellega on võimalik vabaneda ühtlaste võrede poolt seatavatest piirangutest. Maastike esitamisel on kasutatud mitut tüüpi puid, nii kahendpuid, neljandpuid kui ka kaheksandpuid, kuid üks lihtsam neist on kolmnurkade kahendpuu, mida kirjeldab algoritm ROAM 6. Algoritmi põhiline kasutusvaldkond on maastike visuaalne kujutamine, mis leiab rakendust arvutimängudes ja simulatsioonides. Meie kasutame selle algoritmi juurest ainult triangulatsioonimeetodit ja puustruktuuri, jättes kujutise genereerimise esialgu kõrvale. 4 Rowe, N. C., Ross, R. S., Optimal grid-free path planning across arbitrarily-contoured terrain with anisotropic friction and gravity effects. 5 Rowe, N. C., Roads, Rivers, and Obstacles: Optimal Two-Dimensional Path Planning around Linear Features for a Mobile Agent. 6 Duchaineau et al, ROAMing Terrain: Real-Time Optimally Adapting Meshes. - 18

3. Algoritmi kirjeldus 3.1 Maastiku sõrestiku loomine Oma mudelis vaatame maastikku kui deformeerunud tasandit, seega on iga tema tasapinnakoordinaadi kohta üks muutuv suurus - kaugus sellest tasapinnast või lihtsamalt öeldes kõrgus. De facto standardiks ongi saanud maastike esitamine kõrgusväljade ehk -kaartidena 7. Need on kahemõõtmelised massiivid, kus iga elemendi väärtus on ühe kindla punkti kaugus nulltasandist. Mida rohkem on punkte, seda suurem või detailsem on saadav maastik. Üks kõige olulisem osa kõrguskaardi juures ongi mõõtkava ehk kahe määratud punkti omavaheline kaugus reaalsel maastikul. Mida väiksem see kaugus on, seda lähem on mudel tõelisusele. Sellise meetodiga saab esitada sisuliselt ükskõik millise kuju ja ulatusega maastikku. Kõrguskaartide juures on segavateks teguriteks nende suurus ja töötlemisaeglus. Seepärast asendatakse kiirust nõudvas või reaalajas toimuvas protsessis kõrguskaart mõne optimaalsema struktuuriga. Meie algoritmi töötamiseks on vaja maastikul määrata rajapunktid, mida mööda lühima teekonna leidmine toimub. Selleks tuleb maastik jaotada hulknurkseteks piirkondadeks, mille keskpunkte saaks vaadelda teetähistena. Selge on, et hulknurki ja seega ka rajapunkte peab olema piisavalt palju, et maastiku detailsus kaduma ei läheks, samas ei ole praktiline ka suuri ühtlasi pinnatükke väiksemateks lahutada. Kõige lihtsam ja praktilisem on maastik jaotada kolmnurkadeks, sest kõrguskaardi võrgustik on üldjuhul ruudukujuline ning maastikul saab igal nelja ruutu moodustava tipu vahele paigutada täpselt kaks kolmnurka. Kolmnurk on lihtsalt käsitletav geomeetriline kujund ja seega on kolmnurkadena esitatud sõrestikku lihtne kasutada. Maastiku triangulatsiooniks kasutame kolmnurkade kahendpuu struktuuri, mida selgitab järgnev joonis. 7 McNally, S. Binary Triangle Trees and Terrain Tesselation. - 19

a = 0 p a a = 1 p a K K 0 K 1 p 0 p 1 p 0 p k p 1 a = 2 a = 3 a = 5 a = 6 Joonis 3.1: Kolmnurkade kahendpuu astmed 0-5 Joonisel on toodud kolmnurkade kahendpuu esimesed kuus astet. Puu tüvi ehk põhikolmnurk on K = (p a ; p 0 ; p 1 ), täisnurkne võrdhaarne kolmnurk kõige madalamal jaotuse astmel (a = 0). Järgmisel astmel (a = 1) on K poolitatud sirgega kolmnurga tipu p a ja kolmnurga aluse (p 0 ; p 1 ) keskpunkti p k vahel. K 0 = (p k ; p a ; p 0 ) ja K 1 = (p k ; p a ; p 1 ) on tüvikolmnurga K tütarkolmnurgad. Iga a rekursiivse sammuga poolitatakse eelpoolkirjeldatud moel kõik kolmnurgad, ehk siis nende arv suureneb geomeetrilises progressioonis. Puusse, mille aste on a mahub maksimaalselt n = 2 a kolmnurka. Kahendpuu struktuur võimaldab vähendada ka arvutirakenduse mäluvajadust, sest puus hoitakse ainult info kolmnurga suhete kohta teiste puu kolmnurkadega. Meie lahenduses hoitakse puus ka teavet kolmnurga eellase kohta puus ning iga viidet igale rajapunktile. Antud kolmnurga/punkti koordinaatide teadmiseks jälgitakse puus ringi liikumisel enda asukoha muutumist koordinaatsüsteemis. Kui on vaja antud punkti kõrgust nulltasandist, loetakse see väärtus kõrguskaardilt. - 20

Täisnurkne tipp Vasak naaber Parem naaber Vasak tipp Vasak tütarkolmnurk Tüvikolmnurk Keskmine tipp Parem tütarkolmnurk Parem tipp Baasnaaber Joonis 3.2: Viis põhilist suhet kolmnurkade kahendpuus Joonisel on kujutatud algoritmis defineeritud suhted puus asetsevate kolmnurkade vahel. Tüvikolmnurga tütarkolmnurki käsitlesime üldstruktuuri juures. Igal puu kolmnurgal on ka naabrid: tüvikolmnurga hüpotenuusi jagav baasnaaber ning vasak ja parem naaber, mille hüpotenuusideks on vastavalt tüvikolmnurga vasak ja parem kaatet. Puu kolmnurk koos oma baasnaabriga moodustavad ruudukujulise "teemandi". Kõigi puuga teostatavate operatsioonide käigus tuleb jälgida, et need suhted oleksid pidevalt paigas. Ning kui suurema maastiku esitamiseks on teemandina kokku pandud kaks puud, siis tuleb ka nende omavahelised suhted lõpptippudes ära määrata ning põhikolmnurk ühendada baasnaabriga. Kolmnurkade kahendpuu viis põhisuhet määravad ära kolmnurkade kahendpuu ühe põhireegli - naaberkolmnurkade aste puus võib olla kas võrdne või erineda ühe võrra. Seda reeglit tuleb kolmnurki puus poolitades ja liites jälgida, sest muidu lähevad suhted puus paigast ära. Harvad ei ole ka juhud, kus ühe kolmnurga poolitamine toob kaasa mitme järgneva kolmnurga poolitamise. Kahte sellist võimalust on kujutatud joonisel 3.3. Kui me poolitame kolmnurga A, siis peame poolitama ka temaga teemandi moodustava kolmnurga B. Rekursiivne näide on aga - 21

kolmnurga C poolitamine, mis toob automaatselt kaasa B A C D kolmnurga D poolitamise, sest muidu jääks viimase kaatetile kahe teise kolmnurga küljed, mida aga juhtuda ei tohi. Veel üks tähtis fakt puu kohta on ka see, et ükskõik millisest triangulatsioonist võib saada poolitamis- ja ühendamisoperatsioonidega ükskõik millise teise. Joonis 3.3: Rekursiivne poolitamine käsitleda. Kolmnurkade kahendpuu kasutamine annab maastikule nii lihtsuse kui täpsuse, kohandudes täpselt sõrestikule ja võimaldades vajadusel antud piirkonda detailsemalt Soovitud kolmnurki poolitades saame soovitud piirkonna veelgi väiksemateks osadeks jaotada ja nii leida rohkem rajapunkte ning täpsema lähenduse otsitavale optimaalsele teekonnale. Et puustruktuur võib suurte maastikute puhul väga keerukaks muutuda, on otstarbekas jaotada maastik veel ruudukujulisteks "lappideks". Neid kokku seades võib luua väga erineva kuju ja ulatusega maastikke. Iga lapp koosneb kahest teemandiks kokku pandud kahendpuust. Nii hoitakse ära väga mahukaks muutuvate puudega kaasnev töötlemisaja suurenemine. Kindla kolmnurga leidmiseks ei pea me läbi käima tervet maastikustruktuuri. Otsinguruumiks on vaid koordinaatide järgi valitava lapi kaks poolt. 3.2 Rajapunktide leidmine Pärast triangulatsiooni on algoritmi edasiseks tööks vaja leida rajapunktid, mille abil me lühima tee leiame. Rajapunktid on nagu ristmikud, mille vahel on teed. Meie ülesanne on leida optimaalne rajapunktide hulk nii, et punktide arvust piisaks esialgseks otsinguks ning neid ei oleks ülearu palju. Kui algne teekond on leitud, muudame sellele tee ümber olevat piirkonda teralisemaks, poolitades kahendpuus kolmnurki ja lisades rajapunkte täpsemaks otsinguks ja teekonna silumiseks. Punktide leidmisel võtame aluseks maastiku esimese ruumilise sõrestiklähenduse ehk eelmisel tööetapil leitud kolmnurkade puu. Rajapunktidena kasutame kõiki kolmnurkade tippe ja samuti ka iga kolmnurga massikeset ehk tsentroidi. Kõik need punktid lisamegi rajapunktide loetellu. Et kolmnurga tippude koordinaadid on meil teada, on vaja leida vaid massikeskme omad. - 22

B kõrguse kui ühe mediaani toodud suhtes. Kolmnurga massikese asub kolmnurga mediaanide Massikeskme leidmiseks loeme kõrguskaardilt punktide A, B ja C koordinaadid. Siis leiame punktide A ja B koordinaatide abil punkti D koordinaadid. Punkt D on aluse poolitaja, millest väljub mediaan m c. C m lõikepunktis (vt. joonis 3.4). Võrdhaarsel kolmnurgal c a b M kattub hüpotenuusile tõmmatud mediaan m c m b m a kõrgusega ning on seega risti küljega c. Kuna D A tsentroid jaotab mediaani suhtes 1:2 nii, et üks c Joonis 3.4: Kolmnurga ABC kolmandik jääb külje ja kaks kolmandikku tipu mediaanid ja tsentroid M suunas, siis peame massikeskme leidmiseks jaotama D = x A x 2 B ; y A y 2 B ; z A z 2 B Koostan sirge DM vektori m teades, et see on kolm korda lühem kui mediaan m c (sirge DC). m = x C 3 x D ; y C 3 y D ; z C 3 z D Punkti M koordinaadid saan lihtsast punktile vektori liitmise tehtest. M = D+ m Punkti M väärtuseks saab punktidega A, B ja C antud kolmnurga massikeskme asukoht ruumis. 3.3 Graafi koostamine Selleks, et korralikult mõista kahendpuus asuvate erinevate kolmnurkade vahelisi seoseid, tuleks esmalt lahti seletada järgmised mõisted. - 23

3.3.1 Kahendpuu harude polaarsus ja liikumine mööda kahendpuud 3.3.1.1 Polaarsus Miks nimetatakse kolmnurga kahendpuud just niimoodi? Põhikolmnurk jaotatakse pooleks ja selle tütarkolmnurgad omakorda pooleks nii tekivad vastavalt vasemad ja paremad tütarkolmnurgad. Siit tekivad ka puu juurde mõisted vasak ja parem tütarkolmnurk. Need on tegelikult puu ühest tipust lähtuvad vasem ja parem serv. Iga harunemisega ehk kolmnurga poolitusega tekib uus madalam aste. Astmeid hakatakse lugema alates esimesest jagunemisest, kus on ainult vasak (V) ja parem (P) serv. Seda nimetamegi me polaarsuseks vasaku ja parema vastandpaarsust. Just selline peegeldumine (polaarsus) esineb kahendpuus täielikult. Sisuliselt on joonisel 3.5 näha lihtne polaarsuse näide: vasak haru ja parem haru on täiesti vastupidised polaarsed. Polaarsetel tippudel on teatud kindlate seaduspärasuste kohaselt kõrgemad astmed kattuvad ja madalamad polaarsed. Kui võtta puu samal astmel kaks suvalist punkti, on nende alamad astmed apolaarsed seni, kuni nad jagunemisel erinevatesse harudesse satuvad. Sellel astmel on nad astmeliselt polaarsed. 3.3.1.2 Liikumine kahendpuus Joonis 3.5 Puu haruneb kui ühest tema tipust lähtub mingi hulk servi, meie juhul kaks. Mööda puud liikumine algab puu juurest, mis jaguneb kaheks haruks see esimene jagunemine on puu esimene aste (juur ei ole veel aste ta on kõige alus ja ise jaotumata). Need kaks tekkinud haru jaotuvad ka omakorda - 24

kaheks (kui toimub edasine kolmnurkade poolitamine), mis tähendab, et see on juba teine haru. Sama malli järgi arvestatakse harude astmeid kuni kõige madalama oksani (väikseima tütarkolmnurgani kogu maastikukaardil). Seoseid aga arvestame me mitmete erinevate harude vahel. Selleks, et liikuda kahendpuuga opereerides mõne puu tipu ehk kolmnurga juurest maastikul esimese kõrval asuvale kolmnurgale on vaja puus kõrgemale astmele minna vähemalt ühe astme võrra. Järgnevalt oleme defineerinud viis reeglit kahe kolmnurga vahel ühendusteede loomiseks. Need reeglid kehtivad kõigi selliste kolmnurkade korral, mis on juba lõplikult jagunenud ja edasi ei harune. 3.3.2 Rajapunktide sidumise reeglid Omavahel seotakse: 1) Ühe kolmnurga siseselt ühendatud tipud. Kui hetkel vaadeldav rajapunkt on kolmnurga tipus, mitte tema raskuskeskmes, on tema võimalikeks liikumispunktideks sama kolmnurga kummadki tipud. Sama reegel kehtib kõigis tippudes ja loomulikult kahesuunaliselt (st. vaadeldavast järgmisest punktist on käesolevasse punkti samuti võimalik tulla). Siin tuleb aga tähele panna seda, et seoseid luuakse kahe punkti vahel tegelikult kaks mõlema suuna jaoks üks. See on tingitud sellest, et eri suundades on liikumisel kuluva energia hulk erinev. Nende sidemete loomisel lisandub graafi iga kolmnurga juures kuus (3 tippu 2 sidet) ühendusteed. 2) Ühe kolmnurga siseselt ühendatud tipud tsentroidiga. Kolmnurga iga tipp on alati ühendatud kolmnurga raskuskeskmega. Võttes arvesse eelmist reeglit, leiame, et kolmnurga tipust on alati võimalik liikuda tipust kolmnurga keskele või teise tippu. Tipust kolmnurga keskele liikumisel on väga oluline omadus: üks suvalise kolmnurga tipus asuv rajapunkt on ühe või mitme kolmnurga tipuks ja selle järgi saame teada, mitu võimalikku liikumissuunda on kolmnurga tipust. Võimalike teede hulga leidmiseks ühest kolmnurga tipust kasutame järgmist valemit: x = 2n, kus n = kolmnurkade arv, kuhu ta ise kuulub, tingimusel, et see tipp ei ole vaadeldava kaardi üheski nurgas. Vastasel korral x = 2n + 1. - 25

3) Radadega on ühendatud kolmnurga kaks tütart. Kui baaskolmnurk jaguneb tekib vasak ja parem tütar. Nende tütarde massikeskmete vahele tekibki kõige algsem mitme kolmnurga rajapunktide vaheline tee. Kahendpuus ühe tüvikolmnurga kahe tütarkolmnurga leidmiseks tuleb leida antud kolmnurgale teine kolmnurk, mille kõikide harude poolused esimesega eelviimaseni kattuvad, kuid viimane aste on polaarne (nt. kui on puus asuv kolmnurk on VVPP, siis temaga tuleb ühendada VVPV. 4) Tüvikolmnurga suhe baasnaabriga. Nagu ülalpool mainitud, eeldab ka see reegel, et nii tüvikolmnurk kui baasnaaber on lõplikult jagunenud. Sellisel juhul ühendatakse kaks omavahel hüpotenuusi kaudu ühenduses olevad kolmnurgad nende tsentroidide kaudu. Kahendpuus toimub baasnaabri leidmine rekursiivse programmilõiguga, mis kontrollib, milline kolmnurk asub tema kõrval. Muul viisil on seda üsna raske leida, kuna tüvikolmnurk ja baasnaaber võivad juba esimesest astmest polaarsed olla. 5) Tüvikolmnurga suhe vasaku ja parema naabriga. Nagu kõigi eelnevate reeglite puhul, peab ka siin olema kolmnurk juba lõplikult jagunenud. Kui see on tehtud leitakse tekitatakse tee antud kolmnurga keskpunktist sellistesse kolmnurkadesse, mis on temaga ühendatud tema kaatetite kaudu. Programm leiab need kolmnurgad samuti rekursiivsel läbivaatusel. 3.3.3 Teelõikude pikkuse arvutamine Enne kui graafiotsingut üldse rakendada saab, tuleb leida need teed, mida mööda üldse liikuda on võimalik. Kolmemõõtmelise maastiku korral ei ole programmi enda otsimise skeemis muutusi, küll aga on hoopis erinev teepunktide vaheliste teepikkuste arvutamine. Me ei saa lihtsalt arvestada kaht mõõdet kui ette on antud kolmemõõtmeline kõrguskaart. Pealegi oleme me sisse toonud reaalsusteguri, milleks on energiakulu. See kõik tähendab, et kogu optimaalse tee leidmine ei ole mitte niivõrd lühima tee leidmine, kuivõrd vähima energiakuluga läbitava tee leidmine. Näiteks on ülesmäge liikumisel ja allamäge liikumisel tee pikkus ju sama, küll aga on erinev energia, mida seejuures kulutatakse. Just sellise reaalsusmomendi esitamiseks tõime sisse kulu elemendi ning kahe teepunkti vahelise kauguse leidmiseks kasutame järgmist kahte valemit: L = (x 2 - x1) + (y2 - y1) + (z2 - z1) - 26

LM + LM ta n( + 5 K = α ) Toodud valemis on L tee pikkus kahe teepunkti vahel, kus x, y, ja z määravad raja lähte- ja sihtpunkti koordinaate ruumis. K on samade punktide vahelise tee lõplik energiakulu. Teises valemis on kasutatud ka tegurit M, mis on kulu (võib olla nii raha-, energia- kui ajakulu) konstant. α on aga kalle, mis lähtepunktist sihtpunkti liikumisel esineb. Kasutame siin tangensit, kuna see tundus lihtsaim variant, mida vähegi reaalse liikumisraskusena sisse sai tuua. Joonis 3.6 Teise valemi kohaselt on liikumisel ideaalne vähim energiakulu 5 langusega teel. Kui kalle on suurem, on juba raskem liikuda, kuna korralikul liikumisel peab raskusjõule vastu hoidma. Sellest ka tangensi absoluutväärtuse kasutus vastasel korral oleks suurema kaldega teel ka väiksem energiakulu (nt. 50 kalde korral ei oleks siis enam üldse mingit energiakulu). Joonisel 3.6 on näidatud ideaalse tasapinna kallet horisontaalpinna suhtes. Nüüd, kui on teada erinevate teelõikude kulud (või täpsemini programmi jaoks on teada, kuidas neid interaktiivselt leida), on võimalik asuda juurde. otsingu 3.4 Graafiotsing Graafiotsingul kasutame algoritmi A*, mis garanteerib töökiiruse ja optimaalse teekonna. Järgneb algoritmi kirjeldus. 3.4.1 Eessõna algoritmile Olgu funktsioon f meil nn. optimaalsuse funktsioon, mis koosneb kahest teisest väärtusest g ja h. Siis g on kulu algpunktist Joonis 4.2 tsoonideks jaotus käesolevasse punkti liikumisel (see on teadaolev väärtus) ja h on oletatav kulu, käesolevast punktist lõpp-punkti liikumisel. Siis f ligikaudne väärtus on. f = g + h. - 27

On kaks nimekirja: LAHTI ja KINNI. LAHTI on nimekiri kõigist punktidest, milleni on juba jõutud, kuid mis pole veel edasi laiendatud (st. edasi ei ole liigutud). KINNI nimekiri on seevastu nimekiri punktidest, mis on juba lõplikult laiendatud ja enam graafiotsingul kasutusse ei tule. A* algoritm tundub küll keerukas ja raske, kuid samas annab ta parimaid tulemusi optimaalse tee leidmisel. Peab ka märkima, et laiuti otsingu ja sügavuti otsingu algoritmid on tegelikult käesoleva algoritmi lihtsustatud variandid. 3.4.2 Algoritmi sammud 1) Alustame LAHTI järjekorraga, kus on ainult teekonna alguspunkt. Määrame selle punkti g väärtuseks 0, h väärtuseks näiteks ta kauguse lõpp-punktist ja f väärtuseks h + g ehk h. Järjekord KINNI peab töö alguses olema tühi. 2) Kuni pole leitud lõpp-punkti, tuleb korrata järgmist protseduuri: kui LAHTI ei sisalda ühtki punkti, teatada veast ja töö lõpetada. Kui sisaldab, siis tuleb valida välja sealt madalaima f väärtusega punkt. Märkida see punkt kui PARIM, eemaldada järjekorrast LAHTI ja asetada ta KINNI punktide hulka. Kontrollida, kas PARIM on lõpp-punkt. Kui on, siis väljastada tulemus (teekond lähtepunkti ja lõpp-punkti vahel), kui mitte, siis leida PARIMast lähtuvad teed, kuid nende seas omakorda PARIMat valida veel ei tohi (enne tuleb kontrollida, kas mõni neist on juba laiendatud). Iga lähtuva TEEga tuleb läbi teha järgmised protseduurid: a) Määrata, et TEE viitab tagasi PARIMale. Need viited lubavad tagasi pöörduda, kui üks võimalikest lahendustest on leitud. b) Arvutada g(tee) = g(parim) + kulu PARIMalt TEEni liikumiseks c) Kontrollida, kas TEE on mõni punkt nimekirjast LAHTI (s.t. kas temani on juba jõutud ja kas ta on töödeldud). Kui on, märkida ta ära kui VANA. Kuna see punkt juba eksisteerib, võime TEE ära visata ja märkida VANA PARIMa teiste teede hulka. Nüüd tuleb otsustada, kas VANAle eelnev punkt tuleks tühistada ja märkida kui PARIM. Seda tuleb teha juhul, kui äsja leitud tee TEEni on vähem kulukas kui tee VANAni (kuna TEE ja VANA on tegelikult ju üks ja sama punkt). Et seda teada saada, tuleb võrrelda VANA g väärtust ja PARIMA g väärtust läbi TEE. Kui VANA on samaväärne või vähem kulukas, ei tule midagi teha, kui aga tee VANAni on eelnevalt leitust kulukam, tuleb määrata ära, et VANAle eelnev punkt on PARIM, salvestada uus odavam tee kui g(vana) ja uuendada ka f(vana). - 28

d) Kui TEE ei olnud LAHTI nimekirjas, tuleb üle vaadata, kas ta on KINNI nimekirjas. Kui on, siis võtame KINNI punkti ja märgime ta taas ära kui VANA ja lisame PARIMa järeltulijate nimekirja. Kontrollida, kas tee VANAni on parem, nagu punktis 2c ja määrata eelnev punkt ja g ning f väärtused vastavalt. Kui me leidsime just parema tee VANAni, tuleb meil VANA järeltulijate kõik väärtused uuesti ümber arvutada. Järgnev osa on veidi keerukam. VANA viitab endast lähtuvatele teedele s.t. enda järeltulijatele. Iga järeltulija viitab oma järeltulijatele ja nii edasi, kuni haru satub punktile, mis on ikka veel LAHTI hulgas või tal järeltulijad puuduvad. Et leida uut maksumust allapoole liikumise, tuleb sooritada VANAst algav teedeotsing sügavuti otsingu meetodi järgi lõpetades punktis, millel ei ole enam järeltulijaid või kuhu on sama suure või madalama kuluga tee juba leitud. Viimast tingimust on lihtne kontrollida. Iga punkti juures on säilitatud ju ka parimale eelnevalt leitud punktile. Järjest lõpp-punktile lähemale liikudes tuleb kontrollida, kas see punkt viitab tagasi just tuldud teele. Kui viitab, siis tuleb otsinguga samamoodi jätkata, kui ei, siis on järelikult vähem kulukam teekond sinna punkti juba leitud ja edasine otsing võib katkeda. Enne tuleks siiski kontrollida, kas uue g väärtusega on ehk kulu väiksem sellest kulust, mis juba leitud on. Kui varem leitud kulu on ikkagi väiksem, tuleb otsing katkestada, kui mitte, tuleb varem määratud eelmine punkt kustutada ja määrata uus eelmine punkt ja jätkata otsinguga. e) Kui TEE ei olnud LAHTI ega ka KINNI nimekirjas, lisada ta LAHTI nimekirja, PARIMa järeltulijate hulka ja arvutada f(tee) = g(tee) + h(järeltulija). 3.4.3 Algoritmi töö tulemus Algoritmi töö tulemuseks ongi järjestatud rajapunktide jada, mis viib alguspunktist lõpp-punkti. Lugedes järjest iga rajapunkti koordinaadid saame lühima teekonna valitud kahe punkti vahel. - 29

4. Laiendused Hoolimata käsitletud algoritmi eelistest teiste sarnaste seas, on paljugi sellist, mida oleks võimalik paremini, kindlamini ja veelgi optimaalsemalt teha. Siinkohal toome ka ära võimalikud optimisatsioonid, mis lõpptulemusena leitavat teekonda veelgi täpsustaksid. 4.1 Kahekordne otsing Üks lihtsamaid mooduseid, kuidas mõnevõrra täpsemalt otsitavad teed leida, kuidas leida veelgi väiksemat kulu, on nn. kahekordne tee leidmine. Kõigepealt viiakse läbi täies ulatuses eelpoolkirjeldatud teekonnaotsimise protsess. Kui see on tehtud, minnakse teistkordse otsingu juurde. Esmalt vaadatakse läbi need kolmnurgad kahendpuus, mida esialgne optimaalne tee läbib. Kõik sellised kolmnurgad, jaotatakse omakorda veel väiksemateks kolmnurkadeks, kuni eelnevalt määratud suuruseni (vastavalt sellele, kui täpset teed on tarvis leida). Seejärel sooritatakse täiendav optimaalse tee otsimise tsükkel A* algoritmi uuel ringil. Ajaliselt see väga kulukas ei ole, sest eelmisel otsingul tehtud arvutuste tulemusi on võimalik taaskasutada. 4.2 Täpsemad energiakuluarvutused Üks oluline puudujääk, mis hetkel ühelt kolmnurgalt teisele liikumisel esineb on see, et kui me liigume ühest kolmnurga keskpunktist teise kolmnurga, mille kõrgus ei ole sama, keskpunkti, siis vahemaa nende punktide vahel on tegelikult veidi väär. Joonisel 4.1 on kujutatud situatsiooni, kus võib näha, milles probleem seisneb. Kui liigume ühest punktist teise, liigume me pikemate Joonis 4.1 vahemaade korral tegelikult õhust või siis lõikame läbi maa. Selle parandamiseks tuleks aga kasutada funktsiooni k=k 1 +k 2, kus k on kulu kahe punkti vahelise tee läbimisel ja k 1 on kulu tee läbimisel punktist P 1 punkti V ja K 2 on kulu, mis tekib tee läbimisel punktist V punkti P 2. Selline laiendus küll tundub pisike, kuid on tegelikult üks keerulisemaid. - 30

Selle väikese muutuse korral tuleks arvutada välja ka hoopis teistsugune kulu, kuna nagu jooniselgi näha on, esineb siin juba üsna kõrgeid tõuse, mis praeguse kulu arvestamise korral üsna lootusetult suur oleks. Seega täiustaksime selle laiendusega reaalset kuluarvestust kui ka tegelikku liikumise teekonda maastikul. Siinkohal aga tuleb juba arvestada, et kui liigutakse kolmnurga vasakule või paremale naabrile, tekib võimalus seda omakorda veel optimiseerida. Ja seda juba palju täpsema ja palju keerukama algoritmi järgi, mis pole tegelikult küll kahe kolmnurga tsentroidide vahelise tee leidmiseks mõeldud, aga kujutab endast hoopis väga täpset ja geomeetrial põhinevat optimaalse tee otsingu algoritmi. See optimisatsioon on alljärgnevalt ka välja toodud. 4.3 Optikaseaduste kasutamine optimaalse tee leidmisel Üks võimalustest, kuidas veel leida teed pindadel, on mõtestatud geomeetriline otsing. Sellist lähenemist on kasutatud mõnede algoritmide puhul, kui on olemas nii alguspunkt kui ka lõpp-punkt ning seda nimetatakse jätku-dijkstraks (ing. k. continuous Dijkstra) 8. Selle idee on jaotada maastik samaväärsete tsoonidega aladeks. Kuna lühim tee kahe punkti vahe on sirglõik, siis peab ka optimaalne teekond maastikul olema osade kaupa lineaarne, muutudes vaid seal, kus minnakse üle ühest tsoonist teise. Näitena on joonisel 4.2 toodud kolme erineva raskusega tsoonidega kaart. Kui on teada alguspunkt, liikumissuund ja erinevate tsoonide läbimise energiakulu, on lihtsaim viis kasutada kiireotsimismeetodit 9, alludes Snelli seadusele 10 igal äärel (tsoonimuutusel). Me saame sama malli järgi kasutada ka pöördprotsessi, leides lõpp-punkti ja tsoonide kulude abil tee konna võimalikesse alguspunktidesse. Siin peetakse ka silmas tegelikul maastikul esinevaid iseärasusi (loomulikult, kui lähedal on mingi tee, siis on lihtsam liikuda mööda teed, kui otsejoones 8 Mõiste pärineb Mitchell and Papadimitriou 1991 aasta töös. 9 Alexander ja Rowe 1997. 10 Snelli seadus vastavalt Snelli seadusele on sin i ja sin R jagatis konstant, ehk c = sin i/sin R. Sellest tulenevalt ongi kastuatud konstanti c, et alguspunkti ja suuna järgi hakata sooritama kiireotsingut kui kiir jõuab pärast murdumist (ühest tsoonist teise liikumist) lõpp-punkti, siis ongi õige suund käes. - 31

sihtpunkti liikuda, isegi kui mööda teed on pikem maa). Analoogne näide on taas toodud ülal joonisel, kus nii punktidest S21 kui S22 algavad teed liiguvad esmalt läbi regioonide T ja S regiooni R, kus on kulu väiksem, et tsoonide S ja R murdejoonel liikuda lõpp-punkti C2. Sellise meetodi juures on loomulikult märksa keerukamad funktsioonid ja algoritmid, mille arvutamiseks kulub arvutitel tunduvalt pikemalt tööaeg. 4.4 Väikeste pöörete silumine Lõpetuseks veel üks lihtne meetod tulemuse korrigeerimiseks. Võtame kolm järjestikust punkti leitud teel ja nimetame neid vastavalt järjekorrale A, B ja C. Kui ühendada kahe lõiguga punktid AB ja BC, tekib meil nurk ABC. Teisena kontrolliksime nurga ABC väärtust, kui nurk ABC läheneb 180 (näiteks ± 0,1 ), kaotame punkti B ja liigutame tee otse punktist A punkti B. Nii saavutatud tulemus ei paranda oluliselt leitava tee pikkust, kuid aitab ära jätta mõttetuid vahelülisid. - 32

Kokkuvõte Oleme kirjeldanud uut võimalust kahe punkti vahelise optimaalse teekonna leidmiseks ruumilisel maastikul. Algoritm töötab teadaolevalt kõikidel kõrguskaardiga esitatavatel maastikel, väljastades töö tulemusena järjekorra punktidest, mis sirgetega ühendatult moodustavadki otsitava minimaalse energiakuluga läbitava raja. Algoritmi eelisteks on maastiku kuju ja omadustega kohanemine ning selle arvessevõtmine teekonnaotsingul. Tasasel maastikul on tee sirgem ja ühtlasem, samas kui järsult muutuval pinnal on ka leitaval teel rohkem käänakuid. Leitava tee täpsus on samuti valitav, kuid ta on otseses sõltuvuses programmi töökiirusega. Algoritmi disainimisel on silmas peetud lihtsust, kiirust ja vähest ressursinõudlikkust ja tulemuseks on lahendus, mis on kokkuvõttes realiseeritav võrdlemisi lihtsate andmestruktuuridega. Viimased võimaldavadki andmeid küllalt kiiresti töödelda. Maastiku käsitlemisel on aluseks peamiselt reaalajasüsteemina tuntud ROAM. Graafiotsing aga tugineb ühele teadaolevalt parimale heuristilisele algoritmile A*. Teadaolevateks puudusteks on juhud, kus leitavaid teekondi oleks võimalik veelgi siluda. Oleme välja pakkunud mõned võimalused teekondade järelsilumiseks ja ka paar ideed algoritmi muutmiseks nii, et järeltöötlemist poleks vaja. Peamiseks vigade allikaks on otsimispinna jagamine väiksemateks osadeks. Olgugi, et käesolevas töös kasutatud meetodid annavad algsele maastikule peaaegu parima võimaliku lähenduse, tekivad probleemid sellistel pindadel, mida väiksemaks ei jaotata. Suurtel ühtlastel pindadel võib ette tulla juhtumeid, kus algoritmi poolt välja pakutav tee on silmnähtavalt ebaoptimaalne. Sellest probleemist tulenevate vigade parandamisvõimalusi kavatseme ka edasi uurida. - 33