HT 009 Tobias Wrigstad Introduktion till grafteori På den här föreläsningen tar vi upp elementär grafteori och försöker introducera termer och begrepp som blir viktigare i senare kurser. Subjektivt tycker jag grafer är lätta att ha att göra med för att de är möjliga att rita upp och förstå, vilket inte alla datastrukturer är på samma tacksamma sätt. Efter den här färeläsningen bör du vara bekant med följande begrepp och aktiviteter. Jag passar på att introducera ett antal begrepp och koncept som är viktiga av andra anledningar, men som också gör det enkelt att precist definiera vad en graf är.. Modell, icke-matematisk och matematisk. Mängd och element 3. Relation, reflexiv, irreflexiv, symmetrisk, transitiv 4. Graf, bågar och noder, angränsande noder, isomorfism 5. Storlek och ordning (om graf) 6. Hur man ritar en graf 7. Digraf (riktad graf), dag (riktad acyklisk graf) 8. Nätverk (viktade grafer) 9. Dijkstras algoritm Modell Intuitivt kan vi säga att en icke-matematisk modell är en (på ett eller flera sätt förenklad) representation av någonting. En modellbil har förmodligen inte en tillfredsställande instrumentbräda för den som är intresserad av bilinteriörer. En karta är en modell av en geografisk verklighet. En matematisk modell är en matematisk representation av någonting. Bra exempel här är t.ex. trivial trigonometri (läran om förhållandet mellan vinklar och sidor i en triangel) och geometri (läran om rumsliga samband). Med hjälp av geometri kan man t.ex. räkna ut areor på rektangulära ytor, etc. En modell för kostnaden att bygga en villa i Saltsjöbaden kan hypotetiskt vara.000.000 + 400.000 antalet rum. Enligt denna modell kostar således en Saltsjöbadsvilla med fem rum 3.000.000 kronor. Den matematiska modellen för kostnaden för en Saltsjöbadsvilla är en uppenbar förenkling, som t.ex. inte tar hänsyn till mer lokalt läge som t.ex. sjöutsikt. av 6
HT 009 M N unionen M N snittet Figur : [Överkurs] Union och snitt av mängderna M och N. 3 Mängder och element En mängd är en oordnad samling diskreta (d.v.s. olika) element, t.ex. alla studenter på DVK. En mängd skrivs normalt med kommaseparerade element mellan krullparenteser, d.v.s.: {, 3, 5, 7, } är mängden av alla primtal mindre än eller lika med. Den tomma mängden skrivs normalt, men kan även skrivas { }. Att ett element är med i en mängd betecknas normalt, t.ex. samt, för icke-tillhörighet,, d.v.s., 3 {,, 3, 4, 5 } 6 {,, 3, 4, 5 }. [ÖVERKURS] Operationer på mängder Låt variabeln M beteckna mängden {,, 3 }, N beteckna mängden {, 4, 6 } och P beteckna mängden { }. Vi observerar att unionen av M och N, d.v.s. sammanslagningen av bådas samtliga element, är mängden {,, 3, 4, 6 }. Detta skrivs normalt M N = {,, 3, 4, 5 }. (Observera att förekom i båda mängderna, men bara en gång i unionen.) Vi observerar också att snittet av M och N, d.v.s. mängden av de element som finns i båda mängderna, är mängden { }. Detta skrivs normalt M N = { }. (Vi kunde också ha skrivit M N = P.) Union och snitt illustreras av Figur. Om alla element i en mängd ingår i en annan mängd så säger man att den är en delmängd, vilket skrivs. Med andra ord gäller att P M (eftersom 4 finns i M) och P N ( finns i N), men även P P (d.v.s. en mängd är en delmängd av sig själv). Ibland talar man om strikt delmängd, som innebär att mängderna inte får vara samma. Detta skrivs normalt och med andra ord gäller att P M och P N men inte P P, d.v.s, P P. Ett primtal är ett heltal som inte går att jämnt dela med ett annat heltal. 4 är inte ett primtal eftersom 4 =, d.v.s. 4 är jämnt delbart med. Primtal är inte intressanta för oss under denna kurs. of 6
HT 009 4 Relationer En relation är ett förhållande mellan saker. Här kommer vi bara att prata om binära relationer (kallas även två-ställiga relationer), d.v.s., relationer mellan två saker. En relation R blir därför inom matematiken en mängd av ordnade par, t.ex., R = { (, ), (, 3), (, 3) }. Ovanstående mängd är relationen < (mindre än) för alla tal mellan och 3. Ur mängden ovan kan vi läsa ut att: är mindre än eftersom (,) finns i R (d.v.s., eftersom (, ) R så gäller < ) är mindre än 3 eftersom (,3) finns i R är mindre än 3 eftersom (,3) finns i R Däremot kan vi inte utläsa att < eftersom det (helt korrekt) inte finns i R. Om vi ville låta R vara relationen (mindre än eller lika med) för alla tal mellan och 3 får vi R = { (, ), (, ), (, 3), (, ), (, 3), (3, 3) }. Förhoppningsvis ser du sambandet mellan mängder, relationer och programmering. Om du t.ex. vill skriva ett program som hanterar hierarkier i en organisation, kan du representera det med relationen chef för som är väldigt lik <. Då kan du t.ex. göra det med följande datastruktur: { (Mats, Tobias), (Love, Tobias), (Love, Mats) }. Om du istället vill representera relationen närmaste chef räcker det med att du tar bort (Love,Tobias). Här ser vi igen att datavetenskapen behandlar how to do stuff, i detta fall hur man kan representera vissa förhållanden på ett systematiskt sätt. 4. Olika typer av relationer Det är ibland nyttigt att kategorisera olika typer av relationer. Här tar vi upp ett par enkla kategorier. Reflexivitet En relation är reflexiv om för alla värden v som ingår i relationen, relationen också innehåller (v, v). Ett uppenbart exempel är att < inte är reflexiv eftersom t.ex., men är eftersom. Irreflexiv En relation är irreflexiv om inga par (v, v) ingår i den. Ett uppenbart exempel är att < är irreflexiv eftersom varken <, < eller 3 < 3 gäller. Symmetrisk En relation är symmetrisk om det för varje par (v, v ) i relationen finns ett par (v, v ). Ett exempel på en sådan relation är t.ex. relationen är kollega med. Om Tobias är kollega med Henrik gäller autmatisk det omvända, t.ex. Henrik är kollega med Tobias. Relationen är kollega med är således symmetrisk. 3 of 6
HT 009 Transitivitet En relation är transitiv om (v, v ) R och (v, v 3 ) R automatiskt medför att (v, v 3 ) R. Exempel på en transitiv relation är både < och chef för : om < och < 3 så medför det att < 3; om Mats är Tobias chef och Love är Mats chef så följer det naturligt att Love även är chef för Tobias. 5 Grafer (till slut) En graf består av en eller flera noder (även kallade punkter) sammanbundna av 0 eller flera bågar (även kallade kanter). I vissa grafer är bågarna riktade (d.v.s. går bara på ena hållet) och i andra grafer leder de åt bägge håll. När man ritar en riktad graf sätter man ut pilar på bågarna i det håll de leder. Graferna nedanför här är inte riktade. n n n n 4 n n 3 n 3 n 4 Med ovanstående kunskaper är det nu mycket lätt att matematiskt beskriva vad en graf är. Låt relationen R vara har en båge till och låt värdena i paren vara noder. Då kan vi beteckna grafen ovan enligt följande: { (n, n ), (n, n ), (n, n 3 ), (n 3, n ), (n, n 4 ), (n 4, n ), (n 3, n 4 ), (n 4, n 3 ) }. Om två noder n och n ingår i ett par, vilket ju är fallet ovan, så säger man att noderna är sammanbundna med en båge. Varje element (d.v.s. varje par) i relationen utgör en riktad båge. Följaktligen är (n, n ) en riktad båge från noden n till noden n. Tillsammans bildar paren (n, n ) och (n, n ) en (vanlig, dubbelriktad) båge mellan noderna n och n. Två noder är angränsande om de är sammankopplade med en båge. Grafens ordning är antalet hörn och grafens storlek är antalet kanter. Riktade grafer kan användas för att modellera system där vägar inte nödvändigtvis är dubbelriktade, t.ex. ett gatunät i en stad. Nedanstående riktade grafer kan beskrivas enligt följande n n n n 4 n n 4 n 3 n 3 Graferna är dessutom isomorfa, d.v.s., de är samma graf, bara avbildade olika. 4 of 6
HT 009 Akalla Husby 4 Kista Hallonbergen Näckrosen Solna centrum Västa skogen Stadshagen Fridhemsplan Rådhuset S:t Eriksplan Odenplan Rådmansgatan Hötorget T-centralen G:a Stan Slussen Medborgarplatsen Figur : Viktad graf som modellerar delar av SL:s tunnelbanenät, med ungefärlig minuttid för streckorna mellan stationerna. (Tiderna här är för övrigt bara ljug.) kan beskrivas enligt följande: respektive { (n, n ), (n, n 3 ), (n, n 4 ), (n 3, n 4 ), (n 4, n ) }. { (n, n ), (n, n 3 ), (n, n 4 ), (n 3, n 4 ) }. Den högra grafen är en så kallad riktad acyklisk graf. Det betyder att grafen inte innhåller cykler, d.v.s., om man går igenom grafen kan man aldrig följa en båge och komma tillbaka en nod som man redan har besökt 3. Det betyder t.ex. att man inte behöver oroa sig för att hamna i en oändlig loop när man försöker gå igenom grafen. 6 Viktade grafer Viktade grafer, även kallade nätverk, är grafer där varje båge försetts med en vikt, normalt ett decimaltal. Ponera att man vill representera Stockholms tunnelbanenät som en graf och sedan vill använda den för att räkna ut tiden det tar att åka mellan två hållplatser. I en vanlig graf kan man bara mäta avståndet i antalet noder (hållplatser) som man passerar. Om alla sträckor i tunnelbanenätet tar lika lång tid att åka, säg minuter, är detta en fullt duglig 3 Omvänt kan man säga att en graf är cyklisk om det finns en väg av minst olika bågar från någon nod tillbaka till sig själv. 5 of 6
HT 009 lösning; räkna fram antalet stationer på vägen mellan de två punkterna och multiplicera det med. Verkligheten som vi vill modellera är tyvärr i regel mer komplicerad. Med en viktad graf kan vi förse varje båge med den tid det tar i minuter att åka mellan två stationer. Figur visar ett exempel för en del av SL-kartan. Om man nu vill räkna ut tiden det tar att åka mellan, säg Kista och Medborgarplatsen, kan man bara traversera de två möjliga vägarna (blå linje utan byte samt, blå linje med byte till grön linje i Fridhemsplan, jag utesluter att man vill åka runt ett eller fler varv i den blå-gröna cykeln) och få fram 9 respektive minuter. Ett annat exempel på en viktad graf är t.ex. en graf som visar studenters väg genom en utbildning (varje nod är en kurs, fler än två utgående bågar betecknar ett kursval) där vikterna avser procentandelen av studenterna som gör just det valet. Ytterligare ett exempel kan vara ett nätverk av personer där två personer har en båge mellan sig om de känner varandra. En vikt kan i detta sammanhang vara ett värde på hur bra överens man kommer, säg i intervallet 0 till 0. Utifrån detta nätverk kan man sedan räkna ut om det är bäst att gå på Stinas eller Kalles fest. (Hur?) 7 Dijkstras algoritm Edsger Dijkstra var en mycket känd och inflytelserik holländsk datavetare. Dijkstras algoritm formulerade han 959 och är en algoritm för att hitta den billigaste vägen från en nod till alla andra noder i en viktad riktad graf. 4 Dijkstras algoritm kan enkelt beskrivas:. Sätt kostnaden för startnoden till 0 och kostnaden för övriga noder till 5. Startnoden är aktuell nod.. Från aktuell nod, räkna ut avståendet till alla angränsande noder som ännu inte avklarats genom att ta kostnaden för den aktuella noden plus kostanden på bågen till den angränsande noden. Om den framräknade kostnaden är mindre än den nuvarande, uppdatera dess värde till den nya framräknade. 3. När du har gjort föregående beräkning för alla angränsande noder skall du markera aktuell nod som avklarad. En sådan nod kommer vi aldrig att titta på igen. Vi vet redan dess minimala kostnad, d.v.s., det minimala avståndet från startnoden till den. 4. Ny aktuell nod är den obesökta nod som ligger närmast startnoden. Fortsätt från punkt. Om alla noder är markerade som avklarade är algoritmen klar. 8 Tentan Dijkstras algoritm tas upp på senare kurser. Du behöver inte kunna den på tentan. Däremot behöver du förstå vad en graf är, vad en modell är, etc. och varför de är viktiga i ett datavetenskapligt sammanhang. Du behöver dock inte kunna förklara dem på samma formella sätt som presenterats här. 4 Den intresserade studenten kan notera att för att Dijkstras algoritm skall fungera måste man ha positiva bågkostnader varför? 5 Minns att betyder oändligheten. Många programmeringsspråk kan inte uttrycka detta värde. Då är det bra att använda ett annat värde för att representera oändligheten, t.ex. eftersom det inte är en möjlig strecka och följaktligen inte kan råka komma upp naturligt i uträkningen. 6 of 6