Lin-Kernighan-algoritmi kauppamatkustajan ongelmaan

Samankaltaiset tiedostot
Algoritmit 2. Luento 11 Ti Timo Männikkö

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Algoritmit 2. Luento 12 Ke Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

58131 Tietorakenteet (kevät 2009) Harjoitus 11, ratkaisuja (Topi Musto)

Verkon värittämistä hajautetuilla algoritmeilla

(p j b (i, j) + p i b (j, i)) (p j b (i, j) + p i (1 b (i, j)) p i. tähän. Palaamme sanakirjaongelmaan vielä tasoitetun analyysin yhteydessä.

Algoritmit 2. Luento 13 Ti Timo Männikkö

13 Lyhimmät painotetut polut

Implementation of Selected Metaheuristics to the Travelling Salesman Problem (valmiin työn esittely)

Algoritmit 1. Luento 10 Ke Timo Männikkö

Kombinatorinen optimointi

A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

14. Luennon sisältö. Kuljetustehtävä. Verkkoteoria ja optimointi. esimerkki. verkkoteorian optimointitehtäviä verkon virittävä puu lyhimmät polut

Algoritmit 1. Luento 14 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

Luku 7. Verkkoalgoritmit. 7.1 Määritelmiä

Algoritmit 2. Luento 2 To Timo Männikkö

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Tarkennamme geneeristä painamiskorotusalgoritmia

Algoritmit 2. Luento 12 To Timo Männikkö

Algoritmit 2. Luento 13 Ti Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

TKT20001 Tietorakenteet ja algoritmit Erilliskoe , malliratkaisut (Jyrki Kivinen)

Algoritmi on periaatteellisella tasolla seuraava:

Algoritmit 2. Luento 2 Ke Timo Männikkö

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

Algoritmit 2. Luento 4 To Timo Männikkö

Algoritmit 2. Luento 14 Ke Timo Männikkö

Tietorakenteet ja algoritmit - syksy

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

10. Painotetut graafit

Oikeasta tosi-epätosi -väittämästä saa pisteen, ja hyvästä perustelusta toisen.

v 8 v 9 v 5 C v 3 v 4

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

V. V. Vazirani: Approximation Algorithms, luvut 3-4 Matti Kääriäinen

Määrittelydokumentti

Ohjelmoinnin perusteet Y Python

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Algoritmit 1. Luento 13 Ti Timo Männikkö

Tietorakenteet ja algoritmit

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Algoritmit 1. Luento 1 Ti Timo Männikkö

Algoritmit 2. Luento 6 To Timo Männikkö

58131 Tietorakenteet ja algoritmit Uusinta- ja erilliskoe ratkaisuja (Jyrki Kivinen)

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Algoritmit 1. Luento 3 Ti Timo Männikkö

Johdatus verkkoteoriaan 4. luento

811312A Tietorakenteet ja algoritmit Kertausta jälkiosasta

811120P Diskreetit rakenteet

Kimppu-suodatus-menetelmä

Esimerkkejä polynomisista ja ei-polynomisista ongelmista

4. Luennon sisältö. Lineaarisen optimointitehtävän ratkaiseminen Simplex-menetelmä

Valitaan alkio x 1 A B ja merkitään A 1 = A { x 1 }. Perinnöllisyyden nojalla A 1 I.

Algoritmit 2. Luento 5 Ti Timo Männikkö

TIE Tietorakenteet ja algoritmit 261

7.4 Sormenjälkitekniikka

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 1. Luento 10 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

58131 Tietorakenteet ja algoritmit (kevät 2013) Kurssikoe 2, , vastauksia

isomeerejä yhteensä yhdeksän kappaletta.

Harjoitustyö 3 - Millosemeni

TIEA341 Funktio-ohjelmointi 1, kevät 2008

10. Esitys ja kuvaus

811120P Diskreetit rakenteet

Ratkaisu. Tulkitaan de Bruijnin jonon etsimiseksi aakkostossa S := {0, 1} sanapituudelle n = 4. Neljän pituisia sanoja on N = 2 n = 16 kpl.

Algoritmit 1. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 2 Ke Timo Männikkö

Harjoitus 6 ( )

Eräs keskeinen algoritmien suunnittelutekniikka on. Palauta ongelma johonkin tunnettuun verkko-ongelmaan.

TKHJ:ssä on yleensä komento create index, jolla taululle voidaan luoda hakemisto

Ellipsoidimenetelmä. Samuli Leppänen Kokonaislukuoptimointi. S ysteemianalyysin Laboratorio

Algoritmit 1. Luento 5 Ti Timo Männikkö

811312A Tietorakenteet ja algoritmit, , Harjoitus 7, ratkaisu

811312A Tietorakenteet ja algoritmit V Verkkojen algoritmeja Osa 2 : Kruskalin ja Dijkstran algoritmit

Parinmuodostuksesta tietojenkäsittelytieteen silmin. Petteri Kaski Tietojenkäsittelytieteen laitos Aalto-yliopisto

Datatähti 2019 loppu

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 7 (opetusmoniste, kappaleet )

Hakupuut. tässä luvussa tarkastelemme puita tiedon tallennusrakenteina

A* Reitinhaku Aloittelijoille

Osakesalkun optimointi. Anni Halkola Turun yliopisto 2016

A TIETORAKENTEET JA ALGORITMIT

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

Äärellisten automaattien ja säännöllisten lausekkeiden minimointi

Algoritmit 1. Luento 13 Ma Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Nopea kertolasku, Karatsuban algoritmi

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

58131 Tietorakenteet Erilliskoe , ratkaisuja (Jyrki Kivinen)

Kiinalaisen postimiehen ongelma

Ohjelmoinnin peruskurssi Y1

TIES592 Monitavoiteoptimointi ja teollisten prosessien hallinta. Yliassistentti Jussi Hakanen syksy 2010

A TIETORAKENTEET JA ALGORITMIT

Transkriptio:

Lin-Kernighan-algoritmi kauppamatkustajan ongelmaan Teppo Niinimäki Helsinki 26.2.2009 Diskreetti optimointi -kurssin raportti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Sisältö i 1 Tehtävän kuvaus 1 1.1 Vaihdot ja flip-operaatio......................... 1 1.2 LK-haku.................................. 2 1.3 Vaihtoehtoinen aloitus.......................... 3 1.4 Lin-Kernighan-algoritmi......................... 3 2 Toteutuksen kuvaus 4 2.1 Ympäristö ja testiaineisto........................ 4 2.2 Tiedostot................................. 4 2.3 Toteutus.................................. 5 2.4 Puutteet, rajoitukset ja parannusehdotukset.............. 6 3 Käyttökokemuksia ja tuloksia 7 4 Työn kulku 7 Lähteet 8

1 (a) (b) Kuva 1: (a) 2-vaihto. (b) Eräs 3-vaihto. 1 Tehtävän kuvaus Kauppamatkustajan ongelmassa on päämääränä löytää annetun suuntaamattoman verkon lyhin Hamiltonin kierros, eli reitti joka kulkee jokaisen solmun kautta täsmälleen kerran ja päätyy takaisin lähtösolmuun. Lyhimmän reitin etsiminen on NPtäydellinen ongelma, mutta on olemassa useita heuristiikkoja, joilla päästään lähelle optimia. Toteutin Lin-Kernighan-algoritmin, joka pyrkii löytämään mahdollisimman hyvän ratkaisun. Algoritmi aloittaa jostain validista, esimerkiksi satunnaisesti arvotusta kierroksesta, ja parantaa sitä askel kerrallaan tekemällä paikallisia muutoksia reittiin. Se ei siis yleensä löydä parasta ratkaisua, mutta päätyy paikalliseen optimiin. Toteutuksessa seurasin Applegaten ja kumppaneiden raporttia [ABCC99]. Seuraavaksi on kuvattu algoritmin toiminta pintapuolisesti. Tarkemmat yksityiskohdat löytyvät kyseisestä raportista. 1.1 Vaihdot ja flip-operaatio Olkoon v 0,..., v n 1 jokin suunnattu kierros n-solmuisessa suuntaamattomassa verkossa (merkitään tästä lähtien v i = v j kaikilla i j mod n). Olkoon lisäksi c(v i, v j ) solmujen v i ja v j välisen kaaren pituus. Nyt jos korvataan reitin kaaret v i v i+1 ja v j v j+1 (missä v i :n ja v j :n etäisyys tarpeeksi suuri) kaarilla v i v j ja v i+1 v j+1, saadaan uusi validi kierros. Jos lisäksi lisättyjen kaarien yhteenlaskettu pituus c(v i, v j )+c(v i+1, v j+1 ) on pienempi kuin poistettujen kaarien pituus c(v i, v i+1 ) + c(v j, v j+1 ), on uusi kierros aiempaa lyhyempi. Kutsutaan tällaista kahden kaaren korvaamista uusilla ristiin menevillä kaarilla 2-vaihdoksi. Esimerkin 2-vaihto on esitetty kuvassa 1a. Kuvattu 2-vaihto voidaan saadaan aikaan, kun käännetään reitin osan v i+1,..., v j suunta päinvastaiseksi. Tällöin saadaan siis reitti v 0,..., v i, v j,..., v i+1, v j+1,..., v n 1.

2 Merkitään tätä vaihtoa operaatiolla flip(v i+1, v j ). Vastaavalla tavalla voidaan vaihtaa myös korvata useampia kaaria toisilla kaarilla. Määritellään siis vastaavalla tavalla 3-vaihto ja 4-vaihto, joissa korvataan reitin kolme tai neljä kaarta. Nämä voidaan tehdä suorittamalla useita f lip-operaatioita peräkkäin. Esimerkki 3-vaihdosta on kuvassa 1b. Määritellään lisäksi operaatiot next ja prev siten että next(v i ) = v i+1 ja prev(v i ) = v i 1 kaikilla i (kun v 0,..., v n 1 on käsiteltävä kierros). Siis next palauttaa solmun seuraajan sen hetkisellä kierroksella ja vastaavasti prev palauttaa solmun edeltäjän. 1.2 LK-haku Olkoon base jokin valittu reitin solmu. LK-haku solmusta base toimii seuraavasti: 1. Valitse solmun next(base) naapurustosta solmut a, joille pätee delta+c(base, next(base)) c(next(base), a) > 0. 2. Valitse näistä yksi tai useampi solmu a, joille c(prev(a), a) c(next(base), a) on mahdollisimman suuri. 3. Kullekin valitulle solmulle a: (a) Aseta delta = delta+c(base, next(base)) c(next(base), a)+c(prev(a), a) c(base, prev(a)). (b) Suorita 2-vaihto: f lip(next(base), prev(a)). (c) Jos löydettiin parempi reitti (delta > 0), hyväksi suoritettu vaihtosarja ja lopeta. (d) Kutsu itseä rekursiivisesti samalla base-solmulla ja arvolla delta = delta. (e) Peru suoritettu 2-vaihto. LK-haussa siis etsitään sellainen sarja base-solmun vieressä tehtäviä 2-vaihtoja, että reittiä saadaan lyhennettyä. Muuttujassa delta pidetään aina kullakin hetkellä saavutettua parannusta reitin pituudessa. Reitti voi siis huonontua väliaikaisesti (delta < 0), kunhan lopulta päädytään parempaan reittiin. Kuvassa 2 on esimerkki osittaisesta vaihtosarjasta. LK-haun haarautumisaste voidaan asettaa erikseen kullekin rekursiosyvyydelle. Lisäksi rekursiosyvyyttä voidaan rajoittaa, jotta haku saadaan pysähtymään. Toinen

3 Kuva 2: LK-haku etenee suorittamalla sarjan 2-vaihtoja base-solmun vieressä. Kuva 3: Vaihtoehtoiset LK-haun aloitustavat. vaihtoehto syvyyden rajoittamiseen olisi estää samojen kaarten toistuva poistaminen ja/tai lisääminen. 1.3 Vaihtoehtoinen aloitus LK-haku voidaan suorittaa myös tekemällä aluksi sopiva 3-vaihto tai 4-vaihto basesolmun vierestä ja jatkamalla tämän jälkeen normaalisti 2-vaihdoilla. Kuvassa 3 on esitetty nämä vaihtoehtoiset tavat aloittaa haku. Vaihtoehtoaloituksessa täytyy pystyä tarkistamaan, sijaitseeko annettu solmu x solmujen y ja z välissä nykyisellä reitillä. Tähän käytetään operaatiota sequence(y, x, z). 1.4 Lin-Kernighan-algoritmi Lin-Kernighan-algoritmissa suoritetaan LK-hakua toistamiseen käyttäen reitin eri solmuja base-solmuina. Jos normaali LK-haku ei löydä parempaa reittiä, kokeillaan

4 vaihtoehtoista aloitusta. Aina kun solmu on base-solmuna, se asetetaan kieltolistalle. Listalla olevia solmuja ei saa käyttää base-solmuina. Toisaalta aina kun LK-haku onnistuu löytämään paremman reitin, poistetaan kaikki solmut kieltolistalta. Hakuja jatketaan, kunnes kaikki solmut ovat kieltolistalla. Saatu reitti on paikallinen optimi. Algoritmia voidaan toistaa erilaisilla satunnaisilla aloitusreiteillä. Toinen vaihtoehto olisi iteroida algoritmia siten, että saatua reittiä muutettaisiin aina hieman iteraatioiden välissä. 2 Toteutuksen kuvaus 2.1 Ympäristö ja testiaineisto Toteutin algoritmin C-kielellä. Standardikirjastojen lisäksi kääntämiseen vaaditaan getopt, SDL ja OpenGL. Ohjelma kääntyy ainakin gcc-kääntäjällä. Käännetyn ohjelman ajamiseksi täytyy koneella olla asennettuna SDL ja OpenGL. Kaikki tarvittava löytyy valmiiksi tietojenkäsittelytieteen laitoksen Linux-järjestelmästä. Testiaineistona käytin TSBLIB-kokoelman [Rei] ongelmia. 2.2 Tiedostot Toteutus on jaoteltu tiedostoihin seuraavasti: lin kernighan.c Lin-Kernighan-algoritmin pääosat main.c Pääohjelma Makefile Kääntämiseen tarvittavat tiedot queue.c Jonototeutus kokonaisluvuille tsp loader.c TSPLIB-kokoelman ongelmien lukemiseen tarvittavat funktiot

5 visualize.c Graafinen visualisointi Lisäksi useimpiin c-tiedostoihin liittyy vastaava otsikkotiedosto, jossa on esitelty tiedoston tarjoamat funktiot. 2.3 Toteutus Algoritmin pääfunktiona toimii linkernighan. Se vastaa Applegaten ja kumppaneiden raportin algoritmia 2.4. Funktio pitää taulukossa tietoa kielletyistä solmuista. Lisäksi käytössä on jono, joka sisältää solmut, joita on sallittua käyttää base-solmuna. Tässä tapauksessa parempi ratkaisu olisi varmaankin ollut pitää myös kielletyt solmut jonkinlaisessa jonossa, pinossa tai listassa. Nykyistä ratkaisua käytettäessä on kuitenkin helpompi tarvittaessa muuttaa algoritmia niin, että LK-haun onnistuessa kieltolistalta poistettaisiinkin vain tietyllä tavalla valitut solmut. Näitä tapoja on esitelty raportissa. Pääfunktio linkernighan kutsuu toistuvasti lksearch-funktiota, joka vastaa raportin algoritmia 2.3. Funktio lksearch suorittaa edellä käsitellyn LK-haun. Se kutsuu funktiota lkstep sekä tarvittaessa funktiota lkaltstep. Funktio lkstep vastaa raportin algoritmia 2.1 ja suorittaa LK-haun yhden rekursioaskeleen. Raportin algoritmista poiketen se ei kuitenkaan suorita Mak-Morton-siirtoja, jotka olisivat vaihtoehtoinen tapa suorittaa 2-vaihto. Se myös lopettaa suorittamisen heti, jos parempi reitti löydetään. Raportissa lopettamisehtoa ei mielestäni mainittu suoraan, mutta ilmeisesti perusversio jatkaa maksimaaliseen rekursiosyvyyteen saakka. Toinenkin vaihtoehto lopettamisehdoksi raportissa esitetään. Funktio lkaltstep vastaa raportin algoritmia 2.2 ja suorittaa siten vaihtoehtoisen aloituksen LK-haulle. Vaihdot (3-vaihdot ja 4-vaihdot) suoritetaan kuitenkin erilaisilla f lip-operaatioiden sarjoilla kuin raportissa on esitetty. Tämä johtuu siitä, että raportin esittämä tapa ei mielestäni tuota oikeaa lopputulosta (siis ainakaan sellaista kuin raportissa annettiin ymmärtää). Funktio jatkaa hakua normaalisti kutsumalla funktiota lkstep. LK-haun haarautumisastetta rajoitetaan breadth-taulukon arvoilla (sekä muuttujilla altbreadtha, altbreadthb ja altbreadthc. Vain muutamalla ensimmäisellä askeleella rekursio todella haarautuu; lopuilla haarautumisaste on yksi. Haun maksimisyvyyttä rajoitetaan asettamalla haarautumisaste nollaksi taulukon lopussa.

6 Mahdolliset ehdokkaat solmuksi a valitaan solmun next(base) muutaman lähimmän naapurin joukosta. Naapurilistat kullekin solmulle lasketaan ennalta ja annetaan algoritmille parametriksi. Näin listojen muodostamiseen olisi mahdollista käyttää eri tyyppisiä heuristiikkoja. Toteutuksessani listat koostetaan lähimmistä naapureista. Parhaiden naapuriehdokkaiden järjestämiseen ja valintaan käytetään CandidateListtietorakennetta. Toteutuksessani reittiä pidetään yllä Route-tietorakenteessa. Taulukon order i. alkiossa on tallennettuna reitin i. solmun numero. Lisäksi käytössä on position-taulukko, joka sisältää order-taulukon käänteispermutaation. Näiden avulla operaatiot next, prev ja sequence voidaan suorittaa vakioajassa. Sen sijaan f lip(x, y)-operaatiossa joudutaan käsittelemään kaikki reitin solmut väliltä x,..., y, joten se on pahimmassa tapauksessa lineaarinen. Tämän lievittämiseksi käytössä on reverse-bitti, jonka ansiosta voidaankin halutessa kääntää reitin osa next(y),..., prev(x) ja vaihtaa reverse-bitillä koko reitin suunta päinvastaiseksi. Näin käsiteltävien solmujen määrä saadaan rajoitettua korkeintaan puoleen reitin pituudesta. Aloituskierroksena algoritmille annetaan satunnainen kierros. Oletuksena algoritmi suoritetaan kerran ja saatu tulos palautetaan. Algoritmia on myös mahdollista iteroida toistuvasti eri satunnaisista lähtökohdista, jolloin valitaan paras saavutettu reitti. 2.4 Puutteet, rajoitukset ja parannusehdotukset Algoritmi itsessään tuntuisi toimivan oikein ja pääsee yleensä muutaman prosentin päähän optimista satunnaisella aloituskierroksella. Toisaalta algoritmin saavuttamissa ratkaisuissa on usein helposti havaittavia parannuksia erityisesti kohdissa, joissa on pitkiä toisten kaarten poikki kulkevia kaaria. Esimerkiksi seuraavia asioita voisi tehdä toiminnan parantamiseksi: Samojen kaarien toistuvan lisäämisen/poistamisen estäminen lkstep-funktioon. Mak-Morton-siirtojen lisääminen lkstep-funktioon. Haun jatkaminen, vaikka parempi reitti on jo löydetty. Tähän liittyen myös lähderaportissa esitetty mahdollinen lisäehto jatkamiselle. Reitin tallentaminen parempaa tietorakenteeseen, esim. monikerroksiseen linkitettyyn listaan tai puuhun. Näin päästäisiin flip-operaation osalta asymptoottisesti parempaan aikavaativuuteen.

7 Muutenkin nopeampien tietorakenteiden käyttö joissakin paikoissa. Iteroiminen siten, että algoritmia sovelletaan toistuvasti parhaan saavutetun reitin muunnelmiin. Muiden kuin satunnaisten reittien käyttäminen optimoinnin lähtökohtana. Itse algoritmin lisäksi myös muita ohjelman osia voisi kehittää. TSPLIBin ongelmatyypeistä ohjelma tukee tyyppejä EUC 2D, EUC 3D, MAX 2D, MAX 3D, MAN 2D, MAN 3D, CEIL 2D ja GEO. Näistäkin vain osan toimintaa on testattu. Kun ongelma ladataan, lasketaan kaikkien kaarten painot valmiiksi taulukkoon. Tästä johtuva neliöllinen muistinkulutus estää tarpeeksi suurten instanssien käsittelemisen. Laskenta olisikin järkevää muuttaa vain tarvittaessa suoritettavaksi. Visualisointisysteemiinkin voisi lisätä tuen 3-ulotteisille ongelmille ja eri kaarien piirtotavat erilaisille etäisyysfunktioille. Lisäksi käyttöliittymää olisi hyvä parantaa ja lisätä tarkempia tietoja antavia status-tekstejä kuvaan. 3 Käyttökokemuksia ja tuloksia Yleisesti toteuttamani algoritmi tuntuisi yhdellä iteraatiolla pääsevän muutaman prosentin päähän optimista. Taulukoissa 1 ja 2 on joitakin testituloksia. Reittien pituudet on normalisoitu jakamalla ne optimireitin pituudella. Taulukko 1: Löydetyn reitin pituus optimiin verrattuna eri ongelmilla (10 yritystä, kullakin yksi iteraatio) Ongelma Lyhin reitti Keskipituus Pisin reitti Keskimäärin kulutettu aika tsp225 1.0120 1.0248 1.0506 0.11 dsj1000 1.0677 1.0962 1.1373 0.79 rl5915 1.1285 1.2137 1.2654 29.118 4 Työn kulku Aikaa kului suurin piirtein seuraavasti eri harjoitustyön osa-alueisiin. Ajat ovat arvioita.

8 Taulukko 2: Löydetyn reitin pituus optimiin verrattuna eri aikarajoilla ongelmainstanssilla dsj1000. Aikaraja Reitin pituus Iteraatioiden määrä 1 s 1.0971 2 10 s 1.0367 13 100 s 1.0213 112 Tehtävä Aika tunteina Aiheisiin tutustuminen ja aiheen valinta 3,5 Artikkelien tarkempi lukeminen 4 TSBLIB-parserin toteutus 5 Algoritmin ja tietorakenteiden toteutus 11 Visualisoinnin toteutus 3 Muu ohjelmointi, koodin järjestely ja kommentointi 5 Testaaminen 1,5 Esitelmän valmistelu 2,5 Raportin kirjoittaminen 6.5 Tapaamiset ja esitelmä 6 Yhteensä 48 Työ sujui ilman mitään ylitsepääsemättömiä vaikeuksia. C-kielen valinta teki joidenkin osien toteutuksesta tarpeettoman monimutkaista. Pääasiallisena lähteenä käyttämäni Applegaten ja kumppaneiden raportti oli osittain hieman vaikeaselkoinen. Johnsonin ja McGeochin artikkeli[jm95], johon myös osittain tutustuin, oli toisaalta ymmärrettävämmän oloinen, mutta jätti enemmän yksityiskohtia avoimeksi. Lähteet ABCC99 JM95 Applegate, D., Bixby, R., Chv atal, V. ja Cook, W., Finding tours in the tsp. Tekninen raportti 99885, Institute for Discrete Mathematics, Universitat Bonn, 1999. Johnson, D. S. ja McGeoch, L. A., The traveling salesman problem: A case study in local optimization, http://www.cs.ubc.ca/~hutter/ previous-earg/empalgreadinggroup/tsp-johmcg97.pdf, 1995.

9 Rei Reinelt, G., TSBLIB, http://www.iwr.uni-heidelberg.de/groups/ comopt/software/tsplib95/.