Fly me to the moon Laboration om relationer, TDDC75 Diskreta strukturer Mikael Asplund 5 september 2017 1 Inledning Denna laboration i diskret matematik a r ta nkt att ge en inblick i hur programmering kan anva ndas i kombination med matematiska begrepp fo r att analysera och lo sa problem. Utga ngspunkten a r det matematiska begreppet relation vilket definieras som en ma ngd av par. Laborationen anva nder programspra ket Python. Python a r ett av de mest anva nda programmeringsspra ken och det har mycket funktionalitet, men a r samtidigt ganska la tt att komma iga ng och anva nda. Det som framfo rallt go r att det a r la mpligt att anva nda i denna laboration a r att det finns bra sto d fo r att hantera ma ngder och tupler pa ett sa tt som ligger mycket na ra det matematiska spra ket. Vi kommer att anva nda oss av ett riktigt dataset som besta r av alla kommersiella flygrutter ha mtat fra n siten openflights.org. Hela databasen inneha ller o ver 7000 flygplatser och o ver 67000 rutter. Figur 1 visar dessa pa en va rldskarta. Figur 1: Flygrutter i va rlden 1
För att inte datamängden ska bli för stor och för att ni inte ska behöva bry er om att göra er kod effektiv, så minskar vi ner mängden flygplatser och rutter genom att endast inkludera flygplatser från de nordiska länderna (Sverige, Norge, Finland, Danmark och Island). 2 Förberedelser Denna laboration ger 1hp vilket motsvarar cirka 27 timmars arbete. Själva laborationstillfället (under vilken lösningen redovisas) tar 4h så det ni bör räkna med åtminstone 20 timmars förberedelser. Framförallt kan ni räkna med att det går åt lite tid att lära sig syntaxen i Python. Innan ni kommer till laborationen behöver ni göra följande steg. Ni kan med fördel hjälpas åt i grupp för att göra dessa. Tänk dock på att det är viktigt att alla hänger med. 1. Läs igenom hela detta kompendium. 2. Sätt upp en pythonmiljö som ni kan använda. Antingen på er egen dator eller genom att gå till en labbsal på IDA och använda den färdiga pythoninstallationen (skriv helt enkelt python3 i kommandoprompten). Använd online-resurser som lämpligt. 3. Hitta en Python-tutorial och lär er grunderna. Exempelvis denna: https://python.swaroopch.com/first_steps.html. Ni behöver inte göra hela, men så långt att ni behärskar loopar, if-satser, och utskrifter. 4. Testa att ni lärt er grunderna genom att skriva ett pythonprogram som skriver ut alla primtal upp till 100. 5. Lär er använda mängder i Python: https://snakify.org/lessons/sets/ 6. Testa era kunskaper genom att skriva en funktion i python som givet en mängd A bestående av heltal skriver ut alla tal i mängden som är delbara med 3. 7. För varje uppgift i avsnitt 5 nedan, skriv ned en matematisk lösningsstrategi (alltså inte svaret, utan vilka steg som behöver göras) för hur ni ska få fram svaret på uppgiften. 8. Anmäl er till labben i webreg. Labben görs två och två. Länk till anmälan finns på kurshemsidan. 3 Några Python-tips I detta avsnitt tas några specifika aspekter av Python upp som har betydelse för labben. Det är inte heltäckande och alltså inte tänkt som en ersättning till förberedelsestegen ovan. 2
3.1 Ett första program Ni kommer snabbt att upptäcka att det finns två versioner av Python, Python2.x och Python3.x. Det spelar ingen roll vilken ni använder, syntaxen är i stort sett samma (troligen är största skillnaden ni kommer märka hur print-funktionen fungerar). Detta kompendium utgår från Python3. Nedan följer ett exempelprogram som ni kan utgå ifrån för att testa med. Kopiera programmet till en texteditor och spara som test.py. För att köra programmet är det bara att skriva python3 test.py. #Detta är en kommentar #Nedan följer en funktion def plusett(x): return x+1; #Anropar funktionen a = plusett(3) #a har nu värdet 4 print(a) För att skriva ut ett värde eller sträng kan använda print-funktionen. Om man vill kombinera en sträng med ett tal måste man först konvertera talet till en sträng med hjälp av str()-funktionen: print("summan av " + str(1) + " och " + str(2) + " är " + str(1+2)) 3.2 Mängder och relationer i Python I matematiken finns begreppet tupler som är ordnade samlingar av objekt, exempel på en tupel kan vara (a, b, c, d). Ett par är en 2-tupel (a, b) som alltså består av två element. Python stöder tupler med i stort sett samma notation som i matematiken. Vi kan till exempel skriva följande i Python: a = (1,2) vilket sätter värdet av a till ett par med värdena 1 och 2. Python gör det också möjligt att arbeta med mängder. Om vi skriver följande i python så skapas en mängd A med fyra element. A = {1,2,3,4} För ta reda på storleken används den inbyggda len()-funktionen: len(a) Vi också skapa relationer genom att kombinera 2-tupler och mängder: R = {(1,2), (2,3), (4,5)} 3
Prova att skriva in dessa i din Python-kod och testa lite olika operationer (ta hjälp av guiden om mängder i Python som refereras ovan). Det är också möjligt att loopa över alla element i en mängd (eller i en relation): #Loop through a set and print the elements def print_elements(m): for i in M: print(i) #Loop through a relation (set of pairs) and print the sum of the elements def print_pair_sum(r): for (i,j) in R: print(i+j); 4 Förutsättningar Ni kommer att utgå ifrån ett labbskelett där en hel del av de grundläggande funktionerna redan är implementerade (filen heter air_labbskelett.py). Ni behöver inte bry er om hur data ska läsas in, utan bara hur de ingående datastrukturerna ska manipuleras för att få fram rätt lösningar. De datastrukturer som ni utgår ifrån är: En mängd A som innehåller alla nordiska flygplatser med en trebokstavssträng. Denna kodrad skriver ut resultatet av att kolla om ARN A: print( ARN in A) En relation R A A som innehåller alla direktrutter mellan flygplatser i A. Till exempel gäller att ( ARN, CP H ) R eftersom det finns en direktrutt från Arlanda till Köpenhamn. Lös en uppgift i taget. Uppgifterna är sorterade i ungefärlig svårighetsgrad. 5 Uppgifter Nedan följer de uppgifter som ni ska besvara. Kom ihåg att först (innan labben) formulera en matematisk lösning för varje uppgift. Kvar blir då att översätta den matematiska lösningen till en mjukvarulösning. 1. Hur många flygplatser finns det i datamängden? 2. Hur många rutter finns det? 3. Om man kan flyga från flygplats A till flygplats B, går det då att flyga B till A? 4. Finns det rutter som startar och stannar på samma flygplats? 4
5. Finns det flygplatser som man inte kan flyga ut ifrån? 6. Hur många flygplatser inom Norden finns det direktflyg till från Arlanda (ARN)? 7. Kan man flyga från Linköping (LPI) till Bodø (BOO) utan att lämna Norden? 8. Kan man flyga från Linköping till alla flygplatser i Norden utan att lämna Norden? 9. Hur många hopp måste man ta för att flyga från Linköping (LPI) för att komma till Florø (FRO) flygplats i Norge? 6 Redovisning Labben redovisas till labbassistenten på labbtillfället. Svaren ska skrivas ut av pythonskriptet (sista avsnittet i filen) med hjälp av lämpligt skapade funktioner. Observera att examinationen är individuell så båda måste kunna förklara hur ni har tänkt och gjort. Vid sjukdom eller annat förhinder kan labben redovisas senare då efter överenskommelse med labbassistenten. 5