Johnsonin periaatteet: 1. Tee testejä, joilla on uutuusarvoa. 2. Perusta työsi kirjallisuuteen. 3. Tee testejä, jotka mahdollistavat yleiset johtopäätökset. 4. Laadi testisi tehokkaiksi. 5. Käytä tarpeeksi tehokkaita ratkaisuja. 6. Mahdollista testiesi uudelleen ajaminen ja suunnittele testit niin, että tulokset ovat riippumattomia testiympäristöstä. 7. Tee testiesi tulokset vertailukelpoisiksi toisille tutkijoille. 8. Kerro testeistäsi tarpeeksi tarkasti. 9. Tee tuloksista perusteltuja johtopäätöksiä ja etsi selityksiä testien tuloksille. 10. Esitä tuloksesi havainnollisesti.
1. Tee testejä, joilla on uutuusarvoa. Kukaan ei halua lukea tylsistä ja merkityksettömistä testeistä! Testien mielenkiintoisuus lisääntyy, jos algoritmilla on selviä sovellusmahdollisuuksia (vaikkei artikkeli olisikaan tarkoitettu markkinoimaan algoritmia johonkin tiettyyn sovellustilanteeseen). Sellaisen algoritmin testaaminen, jota ei voi soveltaa mihinkään, on järjetöntä! Sovellusten olemassaolo takaa myös sen, että testiaineistoa on saatavilla. Oleellinen kysymys: voisiko testattava algoritmi korvata nykyisin käytettävät algoritmit jossain sovelluksessa? Koska asymptoottinen analyysi ei tämän kysymykseen voi vastata (ainakaan aina), tarvitaan testejä ym. kysymyksen selvittämiseen. Sanotaan, että algortmi on alisteinen, jos se on aina hitaampi kuin joku tunnettu algoritmi (tai approksimointialgoritmien tapauksessa tuottaa aina huonompia approksimaatioita).
Miten voi osoittaa, että algoritmi on alisteinen? (Huom! Samat kysymykset pätevät muihinkin kokeista tehtyihin yleistyksiin.) Oletko varmasti testannut algoritmia kaikilla järkevillä tapaustyypeillä? Onko ajoympäristön vaikutus eliminoitu? Onko algoritmit varmasti implementoitu oikein? Pätevätkö tulokset kaikkiin parametrikombinaatioihin? Onko alisteisen algoritmin esittelyssä mitään järkeä? Vältä alisteisten algoritmien testaamista tutustumalla huolellisesti kirjallisuuteen. Lue lähteet, joihin viittaat! Jos uusi algoritmi paljastuu alisteiseksi, tilanne ei ole hyvä, mutta... Alisteinen, mutta yksinkertainen algoritmi voi olla mielenkiintoinen. Tilanne voi olla mielenkiintoinen, jos alisteinen algoritmi käyttää sellaista yleistä suunnitteluperiaatetta tai tietorakennetta, joka voi olla sovellettavissa moneen muuhun tilanteeseen. Alisteiseksi tiedetyn algoritmin tarkempi karakterisointi voi olla mielenkiintoista osana laajempia testejä, joissa on mukana muitakin kuin alisteisia algoritmeja. Tunnetun ja paljon käytetyn algoritmin osoittaminen alisteiseksi voi olla mielenkiintoista.
Tulosten uutuusarvoa lisäävät niiden yleisyys, relevanttisuus ja luetettavuus. Tuloksen Algoritmi A on parempi kuin algoritmi B luetettavuutta lisäävät testit, jotka kertovat, mistä A:n paremmuus johtuu Tutki oleellisia asioita. Tyypillisiä virheitä: - testejä tehdään vain muutamilla parametrikombinaatioilla - testaa vasta algoritmin lopullista, tehokasta versiota - aloita testit vasta sitten, kun olet päättänyt koko testimateriaalisi Mieti ensin, tee vasta sitten! Mieti esimerkiksi seuraavia asioita: - Mihin kysymyksiin haluat testeilläsi vastauksen? - Ovatko testattavat algoritmit oikein implementoitu? - Ovat testit tarpeeksi kattavat? - Kuinka pieniä ja kuinka suuria testitapauksia kannattaa ottaa mukaan? Ennen varsinaisia testejä - kerää suuntaa-antavaa tietoa algoritmin käyttäytymisestä - kiinnitä erityistä huomiota poikkeukselliseen tuloksiin (anomalioihin)
Johnsonin ohjelma : - puolet testausajasta alustavia testejä, joiden tarkoituksena on selvittää, mitä kannattaa tutkia - hiotaan algoritmien toteutusta, päätetään, mitä yritetään selvittää, ja päätetään, mitä testiajoja ajetaan - ajetaan testit - analysoidaan tulokset Milloin testejä on tehty tarpeeksi??
Millaisilla kysymyksillä ja vastauksilla on uutuusarvoa? - Miten toteutuksen yksityiskohdat, parametrien arvot ja käytetyt tietorakenteet vaikuttavat tuloksiin? - Miten ajoaika riippuu testitapausten koosta? Onko riippuvuus erilainen eri tyyppisillä tapauksilla? - Mikä mittari kuvaa parhaiten kokonaisajoaikaa? - Mitkä ovat ratkaisun pullonkaulat? Riippuvatko ne tapaustyypistä? - Vaikuttaako ajoympäristö ajoajan riippuvuuteen tapausten koosta? - Vaihteleeko ajoaika samoilla syötteillä samassa ajoympäristössä? - Vaihteleeko muistin tarve samoilla syötteillä samassa ajoympäristössä? - Miten aikaisemmin tunnetut algoritmit käyttäytyvät tarkastelluilla tapauksilla? - Approksimaatioalgoritmien tapauksessa ajoajan voi korvata vastauksen laadulla
2. Perusta työsi kirjallisuuteen Pätee kaikkeen tieteelliseen kirjoittamiseen! Kirjallisuuskatsaus ennen testien aloittamista! Vältyt turhalta työltä. Voit saada ideoita siitä, mitä kannattaa selvittää. - Mitä seikkoja yleensä selvitetään ko. tilanteessa. - Mitkä asiat tiedetään avoimiksi - Millaisia tapauksia ei vielä ole tutkittu. Uutta algoritmia kannattaa/pitää testata aikaisemmin käytetyillä testitapauksilla. (aikaisemmilla ajoajoilla ei sinällään ole käyttöä) Tarkka aikaisempiin toteutuksiin vertaaminen on mahdollista vain, jos alkuperäinen koodi on saatavilla. Seuraavaksi paras vaihtoehto on implementoida aikaisempi algoritmi kirjallisuudessa esitetyn kuvauksen (esim. pseudokoodi) perusteella.
3. Tee testejä, jotka mahdollistavat yleiset johtopäätökset Kaksi testiaineistotyyppiä: 1) käytännön sovelluksista saadut aineistot 2) keinotekoisesti (tilastollisesti) tuotetut aineistot Tilastollisesti tuotetut aineistot voivat olla mielivaltaisen suuria - tulevaisuudessa sovellukset todennäköisesti suurempia kuin nykyisin - voivat mahdollistaa algoritmin asymptoottisen käyttäytymisen arvioinnin - suurimman mahdollisen tapauksen koon selvittäminen - arvio siitä, kuinka suuria tapauksia tulevaisuudessa voi ratkoa Huonosti valittu tilastollinen aineisto ei kerro mitään käytännön tapauksista Systemaattinen virhe tilastollisen aineiston muodostamisessa voi johtaa täysin väärin johtopäätöksiin Onko merkitystä sillä, kuluttaako algoritmi 0.01 vai 0.1 sekuntia? Vast: joskus on. Pitäisikö approksimointialgoritmeja testata tapauksissa, joissa optimi tunnetaan? - Mahdollistaa suhteellisen virheet laskemisen. - Voi vääristää tuloksia, sillä mielenkiintoiset tapaukset ovat niitä, joissa optimia ei tunneta! - Optimi tunnetaan yleensä vain melko pienille tapauksille. Testit eivät paljasta, miten algoritmin käyttäytyminen muuttuu tapausten kasvaessa.
4. Laadi testisi tehokkaiksi. Varianssin vähentäminen - McGeoch, Analyzing algorithms... - eräs versio: testataan approksimintialgoritmeja samoilla testitapauksilla ja verrataan algoritmien tekemiä virheitä keskenään bootstrapping - etsitään parasta tulosta ajamalla samaa satunnaistettua algoritmia k kertaa - huono tapa: toistetaan k:n ajokerran koetta m kertaa ja vertaillaan m:ää parasta arvoa tai lasketaan niiden keskiarvo - parempi tapa: tarkastellaan kaikkia km arvoa ja arvioidaan niiden perusteella parhaimman arvon odotusarvo k:n ajon sarjassa; voidaan myös arvioda parasta tulosssa muissa ajosarjoissa kuin k:n pituisissa kommentoi ohjelmasi ja kaikki muu testimateriaali kunnolla
5. Käytä tarpeeksi tehokkaita ratkaisuja. Ohjelmien tehokkuus vs. ohjelmointiaika ja -vaiva Perustuuko algoritmin hyvyys tehokkaaseen ratkaisuperiaatteeseen vai nopeutuskikkoihin? Perusratkaisujen (optimoimattomien ratkaisujen) vertailu? Vaikuttaako optimointi myös (approksimointialgoritmin) ratkaisujen hyvyyteen? (Kohtuullisesti) optimoidun ratkaisun käyttö helpottaa vertailtavuutta ja mahdollistaa suurempien testitapausten käytön.
6. Mahdollista testiesi uudelleen ajaminen ja suunnittele testit niin, että tulokset ovat riippumattomia testiympäristöstä. Mahdollisuus testien oikeellisuuden varmistamiseen toistamalla ne on keskeinen (luonnon)tieteellinen periaate Algoritmi, testiympäristö ja syötteet on raportoitava niin tarkasti, että testit voitaisiin tarvittaessa toistaa Testien toistaminen onnistui, jos ne tukivat samoja johtopäätöksiä kuin alkuperäiset testit. Toistamisen mahdollistamiseksi testit (koodi, syötteet, ajoympäristö) on raportoitava tarpeeksi tarkkaan. Tyypillisiä virheitä 1: - artikkelin tekstiosuus ja koodi eivät vastaa toisiaan - approksimointialgoritmin hyvyyden mittaus, kun optimia ei ole tiedossa - pelkkä tulos ilman vertailukohtaa - prosenttitulos suhteessa parhaaseen tunnettuun arvoon - vertaaminen toiseen algoritmiin, jonka ei hyvyys välttämättä selvää Vertailukohdan on oltava yleisesti tunnettu, yksikäsitteisesti määritelty ja helposti laskettavissa.
Tyypillisiä virheitä 2: Ajoajan käyttäminen etsintäalgoritmin pysähtymiskriteerinä. - Ajoaika riippuu ajoympäristöstä, eikä saman ajan käyttäminen jossain toisessa ympäristö tuota vertailukelpoisia tuloksia. - Algoritmien vertailu ajamalla vertailtavia algoritmeja edeltä sovittu aika voi vääristää algoritmien keskinäistä paremmuusjärjestystä. Parempi pysähtymiskriteeri: vertailtaville algorimeille yhteinen perusoperaatio Tyypillisiä virheitä 3: Etukäteen tunnetun optimin käyttö pysähtymiskriteerinä. - Todellisessa tilanteessa optimia ei tunneta, joten testit eivät ehkä anna tietoa algoritmin soveltuvuudesta käytännön tilanteisiin. Tyypillisiä virheitä 4: Epämääräiset parametrit algoritmeissa (esim. geneettisissä, simuloidussa jäähdytyksessä, jne.) Tyypillisiä virheitä 5: Johtopäätökset tehdään muutamien sattunaisesti valittujen testiajojen perusteella. Tyypillisiä virheitä 6: Parhaan tuloksen käyttö vertailuperusteena.
7. Tee testiesi tulokset vertailukelpoisiksi toisille tutkijoille Tee mahdolliseksi, että tulevat tutkijat voivat perustaa oman tutkimuksensa kirjallisuuteen! Kerro tarpeeksi tarkasti, missä ympäristössä testit on ajettu! Käytä benchmark-testejä ympäristön tehokkuuden kuvaamiseen. (Jos sopivia yleisesti tunnettuja benchmarkejä on olemassa.) Esittele testimateriaaliasi ja/tai koodisi esim. webissä, kirjoituksesi liitteessä, tms.
8. Kerro testeistäsi tarpeeksi tarkasti Käytä oikeata tarkkuustasoa. Kerro testeissä sattuneista poikkeavista tapahtumista, anomalioista. Yritä keksiä niille selityksiä. Ilmoita todelliset ajoajat (vaikka paras tulos olisikin löytynyt aiemmin). Ilmoita ajoajat vaikka ne eivät olisi varsinaisia tuloksiasi.
9. Tee tuloksista perusteltuja johtopäätöksiä ja etsi selityksiä testien tuloksille Tyypillinen virhe: Testien tulosten esittäminen ilman tulkintaa ja johtopäätöksiä. - Jos johtopäätöksiä ei voi tehdä, testit ovat olleet väärät eikä tuloksia kannata raportoida. Testitulosten on tuettava tehtyjä johtopäätöksiä!! Varo tekemästä testien perusteella vääriä johtopäätöksiä algoritmien asymptoottisesta käyttäytymisestä. Selvitä, millaisista tekijöistä algoritmin kokonaisajoaika muodostuu. - Esim. lineaarinen komponentti, jolla suuri vakiokerroin, voi dominoida ajoaikaa pienillä tapauksilla. Kun tapausten koko kasvaa, vähenee lineaarisen komponentin merkitys. - Profilointi auttaa muutenkin ymmärtämään algoritmin toimintaa.
10. Esitä tuloksesi havainnollisesti Tyypillisiä virheitä 1: Taulukko ilman havainnollistavaa kuvaa. - Kuvan esitettävä taulukon sisältämän datan trendit. Tyypillisiä virheitä 2: Kuva ilman taulukkoa. - Kuvat hukkaavat yksityiskohtia. Normalisoidut asteikot kuvissa. (ks. kuva 1) Kuvissa ei saa olla liikaa informaatiota; kuvien merkitys on selitettävä riittävän hyvin. Trendien esittäminen toisiinsa liittymättömien tapausten yhteydessä. (ks. kuva 2) Miten taulukon rivit ja sarakkeet pitäisi järjestää? Tee laskut lukijan puolesta! Älä vertaile taulukoissa tai kuvissa yhteismitattomia arvoja (esim. eri ympäristöissä saatuja tuloksia). Tyypillisiä virheitä 3: Liian paljon dataa lopullisessa raportissa/julkaisussa.