Adaptiva algoritmer och intelligenta maskiner, 2005 Hemtentamen Hemtentamen består av 5 uppgifter. Totalpoängen är 25 och varje uppgift ger 5 poäng. För godkänt krävs minst 10 poäng. Det är givetvis tillåtet att diskutera uppgifterna med andra teknologer, men de lösningar du skickar måste vara dina egna. Uppenbara fall av plagiat kommer att leda till poängavdrag för de inblandade. Skicka dina lösningar via e-mail till mattias.wahde@me.chalmers.se, med TYDLIG information om ditt namn och personnummer. Lösningarna SKALL skickas i form av EN zip-fil, som vid extraktion ger 5 kataloger med namnen Uppgift1, Uppgift2 etc. Till VARJE uppgift skall bifogas (1) dina Matlabprogram för den aktuella uppgiften, (2) en separat, kortfattad rapport i PDF- eller MS Word-format. OBS! Inlämnade uppgifter som saknar rapport ger 0 poäng. Detsamma gäller uppgifter för vilka matlabprogrammet ej är direkt körbart: Ingen editering, kopiering av filer mellan olika kataloger eller annan modifikation skall behöva göras av den som rättar uppgiften. Alltså: Kontrollera NOGA att (1) dina program är körbara (gå ur Matlab, starta om det igen, och kör programmen), (2) rapporterna har bifogats och att du har SVARAT på de frågor som ingår i uppgiften (läs NOGA de separata instruktionerna för varje uppgift), (3) alla filer har samlats i EN zip-fil enligt ovan. Dessutom: Kontrollera att du faktiskt BIFOGAR zip-filen när du skickar mailet. Zip-filen ska skickas, via e-mail, senast den 16/5 kl. 11.00 (OBS! 11 på förmiddagen, EJ kl. 23!). Sen inlämning medför 5 poängs avdrag (fram till 23.59 den 17/5) eller 10 poängs avdrag (fr.o.m. 18/5, kl. 00.00). Vissa av uppgifterna är individualiserade, d.v.s. uppgiftens parametrar varierar från teknolog till teknolog. Parametrarna finns att ladda ner på
1 Handelsresandeproblemet Handelsresandeproblemet (TSP) förekommer i många tillämpningar, t.ex. vid utplacering av m komponenter på ett kretskort. Det rör sig då oftast om mycket stora m (10 4 10 6 eller mer). Här skall vi lösa samma problem, men för en transporttillämpning, där m är mycket mindre: Ett företag har som uppgift att leverera varor till 30 olika städer. Givetvis vill man göra detta på ett så effektivt sätt som möjligt. Man måste alltså lösa TSP. Skriv en GA som kan söka efter den kortaste vägen mellan m orter (för godtyckligt m). Ett krav är att programmet alltid skall generera korrekta rutter, d.v.s. sådana som endast besöker varje stad en gång och, i sista steget, återvänder till startstaden. Använd därför en kodningsmetod där varje kromosom består av en permutation av talen 1, 2,..., m, d.v.s. städernas index. Man behöver även speciella operatorer som ser till att nya individer bildas på ett korrekt sätt. Implementera order crossover enligt uppgift 3.6 i kursboken, i form av en separat Matlabfunktion med följande gränssnitt (OBS!) function [c1new,c2new] = order_crossover(c1,c2); där c1, c2, c1new och c2new är kromosomer. Skriv även en valfri mutationsoperator (t.ex. den som finns i uppgift 3.6, men andra operatorer är också möjliga). Städernas position anges med två koordinater (x, y), och listan över koordinaterna finns att ladda ner i Matlabformat på I många transportproblem är kostnaden inte en enkel linjär funktion av avståndet. I denna uppgift, antag att kostnadsfunktionen c(i, j) ges av L 0 om L L 0 c(i, j) = L om L 0 < L L 1 (1) L 2 L 1 om L > L 1, där L = (x i x j ) 2 + (y i y j ) 2, (2) är avståndet mellan stad i och stad j. Som fitnessmått, använd uttrycket f = 1 c, (3) där c betecknar summan av alla delkostnaderna för de 30 resorna längs rutten. Använd de numeriska värdena L 0 = 3.0 och L 1 = 6.0. Kör sedan programmet för att finna en rutt med så hög fitness som möjligt (se websidan för information om vilka värden som måste nås för full poäng). Ange följande i din rapport: (1) kostnaden c och (2) längden för den bästa rutt du funnit. Skicka dessutom med (1) ditt TSP-program samt (2) den bästa kromosomen (d.v.s. en permutation av talen 1, 2,...,30) i Matlab-format, d.v.s. som en.mat-fil eller en.m-fil.
2 Funktionsanpassning med neuronnät Neuronnät används ofta för funktionsanpassning, d.v.s. för att bilda en representation av en okänd funktion f(x 1, x 2,...,x m ). I denna uppgift ska du använda backpropagation för att ta fram ett neuronnät som kan representera en given funktion f(x, y) av två variabler på intervallet x, y [0, 1]. Nätet ska alltså ha två insignaler och en utsignal. De funktioner (en per teknolog) som ska användas finns beskrivna på I detta fall skall både en träningsmängd och en valideringsmängd genereras. Träningsmängden skall bestå av N tr = 121 in-utdatapar av typen (x, y, f(x, y)), tagna från ett rutnät med separationen 0.1 mellan närliggande punkter. Datamängden skall placeras i en Matlabfil (training_data.mat eller training_data.m) på formen training_data = [0.000 0.000 0.0000; 0.100 0.000 0.5641; 0.200 0.000 0.7671;... 0.900 1.000-0.4351; 1.000 1.000-0.5341]; (Siffervärdena för f(x, y) kommer givetvis att variera från fall till fall). Valideringsmängden skall placeras i en Matlabfil (validation_data.mat eller validation_data.m), och skall bestå av N val = 100 in-utdatapar, tagna i mittpunkterna mellan de punkter som ingår i träningsmängden, d.v.s. validation_data = [0.050 0.000 0.0000; 0.150 0.000 0.3278; 0.250 0.000 0.5161;... 0.850 0.950-0.4764; 0.950 0.950-0.8571]; Välj själv antalet neuroner i mellanlagret (så litet som möjligt, men inte mindre!). Definiera medelfelet för ett neuronnät som ɛ = 1 N ( ˆf(xi, y i ) f(x i, y i ) ) 2, (4) N i=1 där ˆf är neuronnätets uppskattning av det verkliga funktionsvärdet f i punkten x i, y i. För träningsmängden beräknas felet ɛ tr med N = N tr och för valideringsmängden beräknas felet ɛ val med N = N val. OBS! Uppgiften fortsätter på nästa sida!
Under träningen, som skall genomföras med vanlig, stokastisk gradientföljning, d.v.s. den metod som oftast används i samband med backpropagation, mät träningsfelet ɛ tr och valideringsfelet ɛ val efter var 10:e träningsepok (Liksom i inlämningsuppgift 2 skall felen beräknas med fixa vikter). OBS! Backpropagationalgoritmen får EJ ges direkt information om sitt resultat på valideringsmängden under pågående träning! Däremot får ɛ val (givetvis) användas för att bestämma när träningen skall avbrytas. För full poäng krävs att ett visst minimivärde nås för ɛ val. För mer information, se websidan enligt ovan. Tag med följande i din rapport: (1) Information om minimivärdena (d.v.s. för ditt bästa neuronnät) för felen ɛ tr och ɛ val och (2) en plot (skall inkluderas i rapporten OBS!) över felen ɛ tr och ɛ val som funktion av träningsepoken (d.v.s. för epok 10, 20, 30, etc., enligt ovan). Dessutom SKALL (1) backpropagationprogrammet och (2) både träningsmängden och valideringsmängden bifogas (i Matlabformat, d.v.s i en.mat-fil eller en.m-fil). Vidare SKALL (3) ett testprogram test_net bifogas, där användaren kan skriva in en godtycklig punkt (x, y) och få ut uppskattningen ˆf(x, y) från ditt bästa nätverk, enligt >> f_estimate = test_net(x,y) Detta program måste alltså läsa in det bästa nätverket från en fil (alternativt får det bästa nätverket gärna hårdkodas i testprogrammet). Det skall INTE vara nödvändigt att åter köra backpropagationalgoritmen för att kunna testa nätet.
3 Hopfieldnätverk Hopfieldnätverk kan användas för läsning av handstilar, t.ex. vid automatisk sortering av post. Det inlästa tecknet består då av en matris av n x n y pixlar, där varje pixel motsvaras av en neuron i Hopfieldnätverket. För enkelhets skull antar vi här att varje pixel antingen är av (vit pixel, insignal = -1) eller på (svart pixel, insignal = +1), d.v.s. vi definierar inga mellanlägen (gråskalor). Vi sätter n x = n y = 7. Hopfieldnätverket kommer alltså att ha 7 2 = 49 neuroner och 49 2 49 = 2352 vikter (diagonalelementen är alla lika med 0). Skriv ett Matlabprogram som kan lagra N mönster med 49 pixlar vardera i ett Hopfieldnätverk (de lagrade mönstren får hårdkodas i programmet). Lagra sedan de tre mönstren som finns definierade på websidan, d.v.s. Programmet skall kunna läsa ett godtyckligt startmönster som inparameter och därefter iterera med Hopfieldalgoritmen (s. 86 i kursboken). Programmet SKALL köras exakt på följande sätt (utan modifikation, editering etc.) >> hopfield(start_pattern) där start_pattern är startmönstret (en vektor med 49 komponenter, där komponenterna 1-7 motsvarar översta raden i matrisen (från vänster till höger, som vanligt), komponenterna 8-14 motsvarar näst översta raden etc.). Under körningen SKALL programmet visa (grafiskt) det aktuella mönstret, så att man på skärmen kan följa konvergensen mot en attraktor. Använd gärna det exempelprogram för det grafiska gränssnittet som finns på websidan! Definiera sedan en brusig variant av vart och ett av de tre lagrade mönstren, där åtminstone 5 pixlar har ändrats (jämfört med de lagrade mönstren). Kontrollera att programmet konvergerar mot de lagrade mönstren. De tre brusiga varianterna SKALL bifogas i form av tre stycken matlabvektorer (med 49 element vardera) i en fil noisy_vectors.mat, så att de kan läsas in och direkt testas i Hopfieldprogrammet enligt ovan. Slutligen, finn en godtycklig falsk attraktor för ditt nätverk, d.v.s. en attraktor som inte finns med bland de tre lagrade mönstren (inverterade versioner av de tre mönstren räknas ej!). TIPS: starta med en slumpmässig insignal. Bifoga en plot över den falska attraktorn i din rapport. Dessutom skall (1) Hopfieldprogrammet och (2) de tre brusiga vektorerna bifogas, enligt ovan.
4 Q-learning Q learning kan bl.a. användas vid problem som går ut på att finna den bästa vägen till ett givet mål. Implementera (i Matlab) Q learning enligt avsnitt 3.4 i boken, och applicera ditt program på den arena som finns att ladda ner på Från början sätts Q till noll för alla tillstånd och alla handlingar (handling 1 = höger, handling 2 = upp, handling 3 = vänster, handling 4 = ned). Notera att inte alla handlingar är tillgängliga i alla tillstånd: roboten får inte lämna rutnätet. Periodiska randvillkor skall inte användas. Notera att roboten i denna uppgift kan, i ett givet läge, röra sig i alla tillåtna riktningar, d.v.s. någon framåtriktning definieras ej. Vid varje träningsepisods början skall roboten placeras i en slumpmässig position (men inte i måltillståndet T, ej heller i någon av de blockerade rutorna). Under träningen skall roboten (i varje steg) med sannolikheten ɛ utföra den handling som är associerad med det högsta Q värdet (i det aktuella tillståndet), och med sannolikheten 1 ɛ skall roboten utföra en slumpmässig handling. Vid varje steg uppdateras (i princip) Q matrisen enligt avsnitt 3.4, med δ = 0.9. (I många fall sker dock ingen förändring av Q matrisen, d.v.s. uppdateringen genomförs men ger ingen förändring av Q). Belöningar skall utdelas enligt följande: Om roboten når måltillståndet ges belöningen +20, och träningsepisoden avslutas. Om roboten försöker gå in i någon av de blockerade rutorna ges istället belöningen -10 (d.v.s. ett straff) innan roboten tillåts fortsätta rörelsen. OBS! I dessa fall står dock roboten kvar i den tidigare rutan, d.v.s. den tillåts inte gå in i de blockerade rutorna (men får ett straff för att den försöker göra det). Kör ditt Q learningprogram, och plocka fram Q matrisen (d.v.s. den matris som Q konvergerar mot efter många träningsepisoder). För enkelhets skull, definierna Q matrisen som en 49 4-matris, motsvarande de 49 rutnätscellerna. (1-7 = rad 1 (räknat uppifrån, från vänster till höger), 8-14 = rad 2 etc.) Notera dock att några rader i Q matrisen (nämligen de rader som motsvarar de blockerade rutorna samt måltillståndet) kommer enbart att innehålla nollor. Dessutom kommer det att finnas ytterligare ett antal nollor i Q matrisen, motsvarande handlingar som ej är tillåtna (exempel: Q(1, upp) = 0, eftersom det inte är tillåtet att gå uppåt från det övre vänstra hörnet). Notera också att det går att ta fram Q matrisen för hand. Man kan alltså kontrollera om programmets resultat är korrekt (och körningen därför kan avbrytas). I din rapport skall Q-matrisen (en 49 4-matris) bifogas. Dessutom skall (1) det program som användes vid träningen bifogas (d.v.s. Q-learningprogrammet) SAMT (2) ett enkelt testprogram (ska kunna köras utan att man först måste köra träningsprogrammet) som skriver ut den väg som fås om roboten i varje steg utför den handling som är associerad med högst Q-värde, d.v.s path = show_path(initial_state) där initial_state är det aktuella starttillståndet. Vägen (som returneras av show_path) får antingen representeras grafiskt eller skrivas ut i form av en vektor, t.ex. >> 1 8 15... etc., för fallet initial_state = 1 (vilket starttillstånd som helst (utom de blockerade rutorna) ska dock kunna väljas).
5 Dataklassifikation med GA I många sammanhang, t.ex. inom medicin och molekylärbiologi, är det viktigt att kunna klassificera data i olika kategorier med utgångspunkt i kriterier som tas fram ur mätdata. Ett viktigt exempel är klassifikation av cancerdata. Sedan några år tillbaka är det möjligt att mäta aktiviteten (expressionsnivån) hos många (tusentals) gener samtidigt, och de uppmätta genaktiviteterna kan (eventuellt) användas för att identifiera gener som orsakar cancer, eller som åtminstone konsekvent uppvisar en viss typ av aktivitet efter att en cancertumör har bildats. De mätdata man har att arbeta med i dessa sammanhang brukar ordnas i en matris där varje rad representerar en gen, och varje kolumn en person, antingen med cancer (kategori I) eller utan (kategori II). Dessa s.k. genexpressionsmatriser innehåller alltså ofta tusentals rader men bara några tiotal kolumner eftersom varje mätning fortfarande är mycket kostsam. Det är därför viktigt att försöka finna klassifikatorer med så få parametrar som möjligt. I denna uppgift ska ni, med hjälp av en genetisk algoritm, ta fram en linjär klassifikator, d.v.s. av typen α 1 g i1 + α 1 g i2 +... + α N g in > β, (5) där α j, j = 1,..., N och β är konstanter och g ij, j = 1,...,N är mätvärdet för gen i j. Olikheten ska vara uppfylld, d.v.s. vänsterledet ska vara större än högerledet, för personer i kategori I. För personer i kategori II ska det omvända gälla. Ett exempel: betrakta en starkt förenklad genexpressionsmatris bestående av mätningar av 3 gener för 4 personer: I I II II gen 1 0.3 0.7 0.1 0.8 gen 2 0.8 0.9 0.1 0.2 gen 3 0.9 0.2 0.5 0.7 De två första mätningarna representerar alltså personer i kategori I, och de två sista personer i kategori II. I detta fall skulle t.ex. regeln g 2 > 0.5, d.v.s. N = 1, α = 1, i 1 = 2, β = 0.5, klassificera datamängden perfekt. Uppgift: Skriv nu en genetisk algoritm som kan generera linjära klassifikatorer (av varierande längd) och finn en så liten klassifikator som möjligt ( 5 gener), som hundraprocentigt (d.v.s. helt korrekt) kan klassificera den träningsdatamängd som finns att ladda ner på Låt fitnessvärdet vara lika med andelen korrekt klassificerade mätningar i träningsdatamängden. För full poäng krävs att den identifierade klassifikatorn når ett perfekt resultat (100%) på träningsdatamängden, och åtminstone 95 procents precision på valideringsdatamängden. OBS! valideringsdatamängden får INTE användas vid optimeringen, bara för testning. Det är dock givetvis tillåtet att mäta även valideringsfelet under pågående träning. I din rapport skall bifogas (1) den bästa klassifikatorn på den form som anges i ekvation (5) ovan, (2) en plot över träningsfelet och valideringsfelet som funktion av antalet evaluerade generationer. OBS! Uppgiften fortsätter på nästa sida!
Dessutom skall (1) träningsprogrammet (din GA) bifogas SAMT (2) ett enkelt testprogram med vars hjälp man kan testa den bästa klassifikator du funnit (får hårdkodas i testprogrammet) enligt fitness = test_classifier(data, correct_class) där data skall kunna representera antingen träningsdatamängden eller valideringsdatamängden och correct_class är klassindelningen för den aktuella datamängden (se websidan för mer information). Notera att det INTE skall vara nödvändigt att åter köra träningsprogrammet för att kunna testa din bästa klassifikator.