Kan ett datorprogram spela solitär?

Storlek: px
Starta visningen från sidan:

Download "Kan ett datorprogram spela solitär?"

Transkript

1 Kan ett datorprogram spela solitär? Malin Persson 1

2 Sammanfattning Solitär är ett gammalt och välkänt brädspel med enkla regler och är därför ett tacksamt spel att försöka lösa maskinellt. I denna rapport beskriver jag tillvägagångssätt som man tidigare har haft för maskinell lösning av solitär, samt mitt eget försök att i programspråket Python konstruera en agent som kan spela solitär. Avslutningsvis jämför jag min agent med de som tidigare implementerats. 2

3 Innehållsförteckning Kan ett datorprogram spela solitär? Inledning Bakgrund Regler för solitär Syfte och metod En tidigare maskinell implementation av solitär Modeller Modell A Modell B Modell C Pagodafunktioner Symmetrier och lösningar Tidsåtgång för de olika modellerna Min maskinella implementation av solitär Kort beskrivning av programmets uppbyggnad Klassen Node Klassen Problem Sökalgoritmer Resultat Diskussion Referenslista...12 Tryckta källor...12 Internet

4 1. Inledning 1.1 Bakgrund Solitär är ett brädspel för en spelare. Det finns olika varianter av solitär där spelplanen och reglerna kan se lite olika ut. Men gemensamt för alla varianter är att man har en spelplan med ett antal hål, som vart och ett antingen kan vara tomt eller innehålla en kula. Figur 1. Olika varianter av solitär. Från vänster: engelsk solitär, fransk solitär och triangelsolitär. 1.2 Regler för solitär Spelet börjar med att man har kulor i vissa hål på spelplanen och dess vanligaste mål är att endast ha en kula kvar på spelplanen. Vissa varianter av solitär kräver att den sista kulan ska vara i ett visst hål när spelet är slut, till exempel i det mittersta hålet. Det finns också varianter där man väljer ut en specifik kula som ska vara ensam kvar och varianter där man ska ha flera kulor kvar i ett bestämt mönster. I min implementation som presenteras i kapitel 3, samt i den artikel jag har använt som referens (Jefferson m.fl. 2005), används spelplanen för engelsk solitär, där spelplanen har 33 hål arrangerade i ett korsformat mönster. Från början ligger det kulor i alla hål utom i det mittersta, och spelets mål är att bara ha en kula kvar på spelplanen. För att få ta bort en kula från spelplanen måste man hoppa över den med en annan kula, vertikalt eller horisontellt. Man får bara hoppa över en kula per hopp, så för att få göra ett drag krävs det att man har tre hål i rad där de två första hålen har kulor i sig och det tredje är tomt. Efter ett hopp blir de tre hålens tillstånd inverterade, dvs. de två första hålen blir tomma och det tredje får en kula i sig (se Figur 2). Figur 2: Ett drag i solitär Man får inte flytta en kula utan att hoppa över någon kula. Det gäller därför att planera sina drag så att man håller ihop gruppen dvs. så att ingen kula hamnar för långt ifrån de andra. Då kan man aldrig hoppa över den kulan och får inte bort den från spelplanen. 4

5 1.3 Syfte och metod Syftet är att bygga ett program i programspråket Python som med hjälp av en sökalgoritm löser brädspelet engelsk solitär, samt att jämföra detta med implementationer av engelsk solitär som andra har gjort. I kapitel 2 presenteras och förklaras en implementation av solitär som gjorts av andra (Jefferson m.fl., 2005) och i kapitel 3 presenterar jag min egen implementation. På grund av kursens omfattning och på grund av intresset att jämföra avancerade metoder med enklare, valde jag att endast bygga en enklare agent som löser problemet med vanlig djupet först-sökning i stället för att basera den på den mer optimerade och genomarbetade modell som Jefferson m.fl. (2005) beskriver. På så sätt blir möjligheten större att jämföra de tidigare implementationerna med min agent och på så vis få praktisk insikt i hur mycket effektivitet man vinner genom att använda de avancerade metoderna. 2. En tidigare maskinell implementation av solitär I artikeln Modelling and solvning English Peg Solitaire (Jefferson m.fl., 2005) förklaras hur man kan lösa solitär som ett optimeringsproblem. 2.1 Modeller Reglerna för solitär beskrivs i tre olika matematiska modeller som de kallar modell A, B och C där modell C är en kombination av modell A och B. De tar även upp en slags funktioner som kallas pagodafunktioner, diskuterar hur man kan bryta symmetrier som uppstår i spelet och jämför slutligen resultaten de fick med hjälp av de tre olika modellerna Modell A I modell A ställs ett antal villkor upp i form av matematiska ekvationer, som beskriver hur kulor får flyttas i solitär. För att veta vilka hål man har kulor i och inte, använder man variabeln bstate[i, j, t], som beskriver tillståndet för hålet på position (i, j) vid tidpunkten t. bstate[] är lika med 1 om det är en kula i hålet och 0 om hålet är tomt. Ekvation 2-13 förklarar, att för att kunna göra ett drag i solitär måste det finnas tre hål i rad där de två första hålen har kulor i sig och det tredje är tomt. Ekvationerna vid nummer 14 visar att spelplanen vid tidpunkterna t respektive t+1 måste stämma överens med det drag man gör i t. Ekvation 15 implicerar att det endast kan ske ett drag per tidpunkt och ekvation 1 utgör kravet att den sista kulan måste vara i hålet i mitten av spelplanen när spelet är slut. 5

6 2.1.2 Modell B I modell B används en lista, moves[t], för att visa den sekvens av drag som löser spelet. I Tabell 1 visas de 76 möjliga drag som man kan göra i solitär. Tabell 1. Alla möjliga drag i solitär (Jefferson m.fl., 2005) De ställer även upp villkor (preconditions) som motsvarar spelreglerna. Ett av villkoren är: för att man ska kunna göra ett drag, ska det vara en kula i de två första hålen men inte i det tredje. Vill man exempelvis göra drag nummer 0 i moves[] (alltså 2,0 4,0) måste det vara en kula i 2,0 och 3,0 medan hål 4,0 måste vara tomt. Villkoren kontrolleras genom att undersöka de senaste drag man gjort som inkluderar de aktuella hålen. Om dessa senaste drag har lämnat hålen i tillstånden kula, kula respektive tomt, kan draget genomföras. Två funktioner som heter Support() och Conflict() används för att kontrollera om de olika dragen i moves[] är förenliga 6

7 med det tillstånd spelplanen är i. Denna modell innehåller väldigt många begränsningar (constraints). Eftersom det finns 76 möjliga drag, det krävs 31 drag för att klara spelet och varje drag kräver att tre villkor är uppfyllda, blir det 7068 begränsningar Modell C Modell C är en kombination av modell A och B som använder både listan bstate[] från modell A och moves[] från modell B. Detta gör det möjligt att definiera spelplanens nästa tillstånd med hjälp av det nuvarande tillståndet och ett drag genom att ställa upp ekvivalenser mellan ekvationer med bstate[] och ekvationer med moves[]. För varje hål vid varje tidpunkt kontrollerar man om hålet har samma tillstånd som det hade vid förra tidpunkten eller om det har ändrats. För att göra detta används funktionerna Changes(i, j), som är listan av de drag som kan ändra tillståndet för ett hål; PegIn(i, j), som är de drag som lägger en kula i ett tomt hål och PegOut(i, j) som tar bort en kula från ett fyllt hål. 2.2 Pagodafunktioner För att lösa problemet med hjälp av modellerna ovan, använder sig Jefferson m.fl. (2005) av ett slags funktioner som kallas pagodafunktioner. En pagodafunktion kan se ut på lite olika sätt, men de innebär att man tilldelar varje hål ett värde, så att tre hål a, b, c som sitter i rad alltid uppfyller a+b>=c. Pagodavärdet för spelplanens tillstånd räknas ut genom att summera dessa värden för alla hål som innehåller kulor. Ett villkor i solitär är att pagodavärdet aldrig får öka, bara minska. Om man någon gång mitt i spelet får ett pagodavärde som är lägre än måltillståndets pagodavärde, kommer man inte att kunna lösa spelet. Pagodafunktioner är därför en bra pruningmetod som kan användas för att upptäcka återvändsgränder innan man kommer fram till dem. 2.3 Symmetrier och lösningar En spelplan för engelsk solitär är både rotationssymmetrisk och reflektionssymmetrisk vilket gör att det ofta finns flera olika sätt att göra samma sak. Detta gör sökträdet onödigt stort, och det finns sätt att förminska det. En slags symmetri som man gärna vill ha bort är symmetri mellan oberoende drag. Varje drag påverkar tillstånden för tre hål genom att invertera tillstånden hos dem. Två drag är oberoende av varandra om och endast om deras tre hål inte överlappar varandra. Drag som är oberoende av varandra kan utföras i vilken ordning som helst utan att resultatet påverkas, så man sparar en hel del tid om man bestämmer sig för en ordning. För att göra detta ordnar man alla möjliga drag i nummerordning enligt tabellen i modell B och inför begränsningen att alla par av oberoende drag måste utföras i nummerordning med det lägsta först. En annan sorts symmetri är den när flera olika sekvenser av drag uppnår samma resultat. För att bryta denna symmetri kan man utföra en komplett sökning ner till ett visst djup, gruppera de sekvenser av drag som leder till identiska tillstånd och sedan införa begränsningar som endast tillåter en representant från varje grupp. 7

8 2.4 Tidsåtgång för de olika modellerna Modell A, B och C jämförs i förmåga att lösa central solitär (dvs. solitär då kulan måste vara i mitten i måltillståndet). Modell A misslyckades med att lösa problemet inom 12 timmar, och modell B ockuperade allt minne innan den ens hunnit ställa upp alla begränsningar. Den bästa metoden var modell C, som löste spelet inom 20 sekunder. Utan kravet att den sista kulan skulle vara i mitten kom den fram till en lösning efter 152 sekunder. Modell C hade alltså fördel av att veta var den sista kulan måste vara. 3. Min maskinella implementation av solitär Förutom att studera tidigare solitärmodeller, har jag själv byggt ett program i programspråket Python som kan lösa solitär. Jag valde att inte spela central solitär, det fanns alltså inget krav på att den sista kulan skulle vara i mitten. Jag har inte optimerat mitt program enligt modellerna i Jefferson m.fl. (2005), utan mitt mål var enbart att bygga ett program som löser problemet. 3.1 Kort beskrivning av programmets uppbyggnad På AIMAs hemsida (Russel & Norvig, 2005) fanns filen search.py, ett kodskelett som jag använde som utgångspunkt för min agent. Jag använde klasserna Node och Problem från filen, modifierade dem en aning så att de passade mitt spel och lade till mina egna funktioner i dem. Jag lånade även två olika sökalgoritmer från filen, nämligen tree_search och breadth_first_tree_search. När man kör programmet med hjälp av någon av sökalgoritmerna och det hittar en lösning så skriver det ut bilder av spelplanen som den ser ut i varje steg av lösningen från slutet till början. På så sätt kan man se hur agenten har valt att lösa problemet och även upptäcka eventuella buggar eftersom man kan se varje drag som agenten gör. Spelplanen ritas upp med hjälp av punkter, mellanrum och stora O:n så att det ser ut som en solitärspelplan. O symboliserar en kula och. Symboliserar ett tomt hål. Nedan visas ett exempel på hur en nod kan se ut då den skrivs ut. O O O O O. O O O O O O O O O O O.. O O O O O. O O O O O O O O 3.2 Klassen Node I detta kapitel presenteras och förklaras de funktioner som finns i klassen Node. Vill du se den fullständiga programkoden, se bilaga 1. Funktionen _init_ skapar nya noder (tillstånd) i spelet. Den tilldelar varje hål på spelplanen antingen värdet True eller värdet False True om det är en kula i hålet och False om det inte är det. Om noden har en förälder, dvs. om man har utgått från en annan nod och kan nå den nya genom göra ett visst drag, så kopierar _init_ föräldern och modifierar den genom att verkligen 8

9 göra det drag man valt att utföra. Om ingen förälder finns är man i spelets starttillstånd, och i det fallet tilldelas alla hål värdet True utom det mittersta som får värdet False. Funktionen printboard tar en nod som argument och ritar med hjälp av textsträngar upp spelplanen på skärmen. Denna funktion är enbart till för syns skull, kan man säga; den gör att man på ett smidigt sätt kan se hur spelplanen ser ut i varje tillstånd och följa de drag agenten gör. Om man exempelvis anropar printboard med startnoden som argument, får man följande utskrift: O O O O O O O O O O O O O O O O. O O O O O O O O O O O O O O O O Agenten arbetar betydligt snabbare om man inte använder printboard, så i slutändan anropade jag bara denna funktion på den sista noden, när spelet var löst. Under arbetets gång var dock printboard till nytta eftersom den visar om agenten följer de regler som man har tänkt sig (dvs. om man har implementerat reglerna på rätt sätt). Funktionen pegsleft räknar hur många kulor det finns kvar på spelplanen. När det bara finns en kvar har man vunnit! Vidare har vi funktionerna testright, testleft, testup och testdown som utförs på varje hål på spelplanen. Den kollar om det finns en kula i hålet och om den i så fall kan flyttas höger, vänster upp respektive ner. Funktionen legalmoves anropar alla dessa testfunktioner och gör för varje nod en lista över alla tillåtna drag. Funktionerna right, left, up och down utför de drag som agenten väljer att göra (de tidigare presenterade testfunktionerna utför ju inga drag, de kollar bara om de är möjliga att göra). En av dessa funktioner skickas med till _init_ när den nya noden ska skapas. Slutligen har vi funktionen path som skapar en lista av noder från den nod där man befinner sig nu och ända tillbaka till startnoden. Den visar alltså den väg som agenten gått för att komma dit den är just nu och är nödvändig för att agenten ska kunna leta sig tillbaka till en tidigare nod om den gör fel och hamnar i ett tillstånd där spelet är olösbart. Jag använder även denna funktion tillsammans med printboard för att rita upp den färdiga lösningen när spelet är slut. 3.3 Klassen Problem Funktionen _init_ i Problem-klassen tar emot ett nod som argument och skapar ett spel som börjar med den noden (i mitt fall är detta starttillståndet). Funktionen successor tar emot en nod och returnerar en lista över de noder som kan nås från denna, dvs. nodens efterföljare, dess barn. 9

10 Vidare har vi funktionen goal_test som helt enkelt kollar om måste är uppnått. Är det bara en kula kvar så returnerar funktionen True och skriver ut meddelandet Grattis till vinsten! Är kulan dessutom i mitten av spelplanen så jublar den lite extra. Slutligen finns här funktionen game som anropas för att sätta igång själva spelet. Den anropar helt enkelt en sökalgoritm och börjar leta det är här det spännande börjar! 3.4 Sökalgoritmer På min agent har jag provat sökmetoderna djupet först och bredden först. Dessa funktioner står utanför klasserna i min kod och är i princip kopierade rakt av från AIMAs hemsida, endast någon enstaka variabel är ändrad för att passa min kod. Bredden först-funktionen behövde funktionen Stack och klasserna Queue och FIFOQueue för att kunna fungera, så jag klippte in även dessa rakt av från AIMA. 3.5 Resultat Mitt solitärprogram lyckades lösa spelet på ungefär 25 minuter med hjälp av djupet förstsökning. Jag provade även sökalgoritmen bredden först, men då fick jag efter en stund ett felmeddelande som löd såhär: Traceback (most recent call last): File "Z:\729g11\Projekt\solitaragent.py.py", line 317, in <module> problem1.game(node1) File "Z:\729g11\Projekt\solitaragent.py.py", line 244, in game winning_node=breadth_first_tree_search(problem1) File "Z:\729g11\Projekt\solitaragent.py.py", line 306, in breadth_first_tree_search return tree_search(problem, FIFOQueue()) File "Z:\729g11\Projekt\solitaragent.py.py", line 301, in tree_search fringe.extend(problem.successor(node)) File "Z:\729g11\Projekt\solitaragent.py.py", line 281, in extend self.a.extend(items) MemoryError Jag tolkar MemoryError som att minnesåtgången blev för stor för att kunna lösa problemet, vilket inte är så konstigt när man kör bredden först på ett sökträd med lösningen på djupet 31 och där vissa noder har många barn. Sökträdet blir för stort för att hantera, kanske särskilt eftersom mitt program inte rensar bort de noder som är likadana. Därför valdes djupet först som sökalgoritm. 10

11 5. Diskussion Jag och Jefferson m.fl. (2005) har inte löst exakt samma problem. Mitt syfte var att bygga ett program som fungerar och löser problemet, medan Jefferson m.fl. (2005) har högre mål och försöker optimera sin lösning så mycket som möjligt. Min lösning är alltså inte lika genomarbetad och välutvecklad, men utgör ändå något intressant att jämföra med. I och med att min agent inte gör någon pruning överhuvudtaget ges insikt i hur pass mycket tid man kan spara på bra pruningmetoder. Jefferson m.fl. (2005) kom med hjälp av sin modell C fram till en lösning på 152 sekunder i varianten utan krav på att kulan ska vara i mitten. Min implementation löste samma problem på 25 minuter, alltså kan man med hjälp av pagodafunktionen och symmetrimetoderna vinna ungefär 22,5 minuter (med en liten felmarginal för att det inte framgår vilken prestanda deras datorer hade). 11

12 6. Referenslista Tryckta källor Russell, Stuart & Norvig, Peter (2003). Artificial intelligence A modern approach. Pearson Education, Inc. Jefferson, Christopher; Miguel, Angela; Miguel, Ian & Tarin, Armagan (2005) Modelling and solvning English Peg Solitaire. AI Group, Department of Computer Science, University of York, UK. Internet Russell, Stuart & Norvig, Peter (2005). AIMA Python file: search.py [www] < Hämtat

13 5 Bilagor 5.1 Bilaga 1 Programkod för solitäragenten # -*- coding: cp1252 -*- import copy import random #from utils import * class Node: """A node in a search tree. Contains a pointer to the parent (the node that this is a successor of) and to the actual state for this node. Note that if a state is arrived at by two paths, then there are two nodes with the same state. Also includes the action that got us to this state, and the total path_cost (also known as g) to reach the node. Other functions may add an f and h value; see best_first_graph_search and astar_search for an explanation of how the f and h values are handled. You will not need to subclass this class.""" def init (self, parent=none, action=none): "Create a search tree Node, derived from a parent by an action." initial_state = [ [None,None,True,True,True,None,None], [None,None,True,True,True,None,None], [True,True,True,True,True,True,True], [True,True,True,False,True,True,True], [True,True,True,True,True,True,True], [None,None,True,True,True,None,None], [None,None,True,True,True,None,None]] self.parent = parent if parent==none: self.board=initial_state else: self.board=copy.deepcopy(parent.board) if action[2]=="right": self.right(action[0], action[1]) if action[2]=="left": self.left(action[0], action[1]) if action[2]=="up": self.up(action[0], action[1]) if action[2]=="down": self.down(action[0], action[1]) def printboard(self): #Visar hur spelplanen ser ut just nu for line in self.board: tecken = "" for hole in line: if hole==true: tecken += "O " elif hole==false: 13

14 tecken += ". " else: tecken += " " print tecken print "\n" def pegsleft(self): n=0 for line in self.board: for hole in line: if hole==true: n=n+1 return n def testright(self,x,y): """Testar om kulan på plats (x,y) kan flyttas höger""" try: if self.board[x][y] == True and self.board[x][y+1] == True and self.board[x][y+2] == False: return True else: return False except: return None def testleft(self,x,y): """Testar om kulan på plats (x,y) kan flyttas vänster""" try: if self.board[x][y] == True and self.board[x][y-1] == True and self.board[x][y-2] == False and y>=2: return True else: return False except: return None def testup(self,x,y): """Testar om kulan på plats (x,y) kan flyttas upp""" try: if self.board[x][y] == True and self.board[x-1][y] == True and self.board[x-2][y] == False and x>=2: return True else: return False except: return None def testdown(self,x,y): """Testar om kulan på plats (x,y) kan flyttas upp""" try: if self.board[x][y] == True and self.board[x+1][y] == True and self.board[x+2][y] == False: return True else: return False except: 14

15 return None def legalmoves(self): actions=[] for (x,y) in activeboard: if self.testright(x,y): actions.append([x,y,"right"]) if self.testleft(x,y): actions.append([x,y,"left"]) if self.testup(x,y): actions.append([x,y,"up"]) if self.testdown(x,y): actions.append([x,y,"down"]) return actions def right(self, x,y): #Kulan på position (x,y) hoppar över sin granne till höger self.board[x][y] = False self.board[x][y+1] = False self.board[x][y+2] = True def left(self, x,y): #Kulan på position (x,y) hoppar över sin granne till vänster self.board[x][y] = False self.board[x][y-1] = False self.board[x][y-2] = True def up(self, x,y): #Kulan på position (x,y) hoppar över grannen ovanför self.board[x][y] = False self.board[x-1][y] = False self.board[x-2][y] = True def down(self, x,y): #Gissa vad den här funktionen gör! self.board[x][y] = False self.board[x+1][y] = False self.board[x+2][y] = True def symmetric(self, othernode): tempnode1=copy.deepcopy(self) tempnode2=copy.deepcopy(self) tempnode3=copy.deepcopy(self) tempnode1.board.reverse() for row in tempnode2.board: row.reverse() tempnode3.board.reverse() for row in tempnode3.board: row.reverse() 15

16 if tempnode1.board == othernode.board: return True elif tempnode2.board == othernode.board: return True elif tempnode3.board == othernode.board: return True else: return False def path(self): "Create a list of nodes from the root to this node." x, result = self, [self] while x.parent: result.append(x.parent) x = x.parent return result class Problem: """The abstract class for a formal problem. You should subclass this and implement the method successor, and possibly init, goal_test, and path_cost. Then you will create instances of your subclass and solve them with the various search functions.""" add def init (self, initial, goal=none): """The constructor specifies the initial state, and possibly a goal state, if there is a unique goal. Your subclass's constructor can other arguments.""" self.initial = initial self.goal = goal def successor(self, state): """Given a state, return a sequence of (action, state) pairs reachable from this state. If there are many successors, consider an iterator that yields the successors one at a time, rather than building them all at once. Iterators will work fine within the framework.""" successors=[] symmetry=false for action in state.legalmoves(): new_state = Node(state, action) successors.append((action, new_state)) return successors the def goal_test(self, state): """Return True if the state is a goal. The default method compares state to self.goal, as specified in the constructor. Implement this method if checking against a single self.goal is not enough.""" if state.pegsleft() == 1 and state.board[3][3]==true: print "Grattis till vinsten! Kulan i mitten och allt! :D" self.goal = True elif state.pegsleft() == 1: print "Grattis till vinsten!" self.goal = True else: self.goal = False 16

17 return self.goal def game(self, state): for x in range(7): for y in range(7): if (x,y) not in inactiveboard: activeboard.append((x,y)) winning_node=tree_search(problem1, []) for s in winning_node.path(): s.printboard() class Queue: """Queue is an abstract class/interface. There are three types: Stack(): A Last In First Out Queue. FIFOQueue(): A First In First Out Queue. PriorityQueue(lt): Queue where items are sorted by lt, (default <). Each type supports the following methods and functions: q.append(item) -- add an item to the queue q.extend(items) -- equivalent to: for item in items: q.append(item) q.pop() -- return the top item from the queue len(q) -- number of items in q (also q. len()) Note that isinstance(stack(), Queue) is false, because we implement stacks as lists. If Python ever gets interfaces, Queue will be an interface.""" def init (self): abstract def extend(self, items): for item in items: self.append(item) def Stack(): """Return an empty list, suitable as a Last-In-First-Out Queue.""" return [] class FIFOQueue(Queue): """A First-In-First-Out Queue.""" def init (self): self.a = []; self.start = 0 def append(self, item): self.a.append(item) def len (self): return len(self.a) - self.start def extend(self, items): self.a.extend(items) def pop(self): e = self.a[self.start] self.start += 1 if self.start > 5 and self.start > len(self.a)/2: self.a = self.a[self.start:] self.start = 0 return e def tree_search(problem, fringe): """Search through the successors of a problem to find a goal. The argument fringe should be an empty queue. Don't worry about repeated paths to a state. [Fig. 3.8]""" 17

18 fringe.append((none, Node())) while fringe: node = fringe.pop()[1] if problem.goal_test(node): return node fringe.extend(problem.successor(node)) return None def breadth_first_tree_search(problem): "Search the shallowest nodes in the search tree first. [p 74]" return tree_search(problem, FIFOQueue()) inactiveboard=[(0,0),(0,1),(1,0),(1,1),(0,5),(0,6),(1,5),(1,6),(5,0),(5,1), (6,0),(6,1),(5,5),(5,6),(6,5),(6,6)] activeboard=[] node1=node() problem1 = Problem(node1) problem1.game(node1) 18

Lektion 2: Sökagenter. Robin Keskisärkkä

Lektion 2: Sökagenter. Robin Keskisärkkä Lektion 2: Sökagenter Robin Keskisärkkä Lektionens innehåll Introduktion till laboration 2 Implementation av en sökalgoritm Livekodning Konfrontera ett liknande problem själva Extra: Heuristisk sökning

Läs mer

Övning 3 - Tillämpad datalogi 2012

Övning 3 - Tillämpad datalogi 2012 /home/lindahlm/activity-phd/teaching/12dd1320/exercise3/exercise3.py September 14, 20121 0 # coding : latin Övning 3 - Tillämpad datalogi 2012 Summering Vi gick igenom problemträd, sökning i problem träd

Läs mer

Nu lär vi oss tre i rad

Nu lär vi oss tre i rad Nu lär vi oss tre i rad Hanna Johansson HT 2016 729G43 Sammanfattning Tre i rad är ett enkelt spel som de flesta förstår sig på och är ett väldigt vanligt problem att försöka lösa just maskinellt. I den

Läs mer

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4 Grafer, traversering Koffman & Wolfgang kapitel 1, avsnitt 4 1 Traversering av grafer De flesta grafalgoritmer innebär att besöka varje nod i någon systematisk ordning precis som med träd så finns det

Läs mer

Övning 1 - Abstrakta datatyper

Övning 1 - Abstrakta datatyper /home/lindahlm/activity-phd/teaching/12dd1320/exercise1/exercise1.py September 3, 20121 0 # coding : latin Övning 1 - Abstrakta datatyper 18 Summering Vi gick igenom betydelsen av abstrakta datatyper/datastrukturer.

Läs mer

Sätt att skriva ut binärträd

Sätt att skriva ut binärträd Tilpro Övning 3 På programmet idag: Genomgång av Hemtalet samt rättning Begreppet Stabil sortering Hur man kodar olika sorteringsvilkor Inkapsling av data Länkade listor Användning av stackar och köer

Läs mer

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Programmering I Tobias Wrigstad fredag, 2009 augusti 28 Programmering I Tobias Wrigstad tobias@dsv.su.se Vad är programmering? Lågnivåspråk och högnivåspråk Kompilering och interpretering Variabler Notation för flödesschema (flow chart) Kontrollstrukturer (conditionals,

Läs mer

Mer grafik. Jan Erik Moström

Mer grafik. Jan Erik Moström Mer grafik from Tkinter import * root = Tk() mf = Frame(root) mf.pack() cv = Canvas(mf) o1 = cv.create_oval(100,100,80,80,outline="red",fill="blue", width=2) o2 = cv.create_oval(10,10,80,80,outline="red",fill="green",

Läs mer

Grundläggande datalogi - Övning 3

Grundläggande datalogi - Övning 3 Grundläggande datalogi - Övning 3 Björn Terelius November 14, 2008 Utskrift av stackar Tornen i Hanoi Principerna för rekursion: Hitta ett enkelt basfall (som har en känd lösning). Reducera varje annat

Läs mer

Grundläggande datalogi - Övning 2

Grundläggande datalogi - Övning 2 Grundläggande datalogi - Övning 2 Björn Terelius November 7, 2008 Klasser skapas med nyckelordet class Klasser Konstruktorer och destruktorer Undantagshantering class MyClass: Docstring and doctests for

Läs mer

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: """A representation of a last-in-first-out (LIFO) stack of objects."""

Övning 1. Abstrakta datatyper. 1. Stacken. class Stack: A representation of a last-in-first-out (LIFO) stack of objects. Per Sedholm DD1320 (tilda11) 2011-09-02 Övning 1 Abstrakta datatyper 1. Stacken -*- coding: utf-8 -*- """Classroom exercise 1, example 1.""" class Stack: """A representation of a last-in-first-out (LIFO)

Läs mer

Föreläsning 13 och 14: Binära träd

Föreläsning 13 och 14: Binära träd Föreläsning 13 och 14: Binära träd o Binärträd och allmänna träd o Rekursiva tankar för binärträd o Binära sökträd Binärträd och allmänna träd Stack och kö är två viktiga datastrukturer man kan bygga av

Läs mer

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program.

Python. Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program. Moduler Vi har ofta behov av att behandla datastrukturer på ett enhetligt sätt så att vi kan göra samma sak i flera olika program. Vi har också ofta behov av att skapa överblick i våra program. Som ett

Läs mer

LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik

LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik LUNDS TEKNISKA HÖGSKOLA Institutionen för Elektro- och Informationsteknik SIGNALBEHANDLING I MULTIMEDIA, EITA50, LP4, 209 Inlämningsuppgift av 2, Assignment out of 2 Inlämningstid: Lämnas in senast kl

Läs mer

Graphs (chapter 14) 1

Graphs (chapter 14) 1 Graphs (chapter ) Terminologi En graf är en datastruktur som består av en mängd noder (vertices) och en mängd bågar (edges) en båge är ett par (a, b) av två noder en båge kan vara cyklisk peka på sig själv

Läs mer

Fredag 10 juni 2016 kl 8 12

Fredag 10 juni 2016 kl 8 12 KTH CSC, Alexander Baltatzis DD1320/1321 Lösningsförslag Fredag 10 juni 2016 kl 8 12 Hjälpmedel: En algoritmbok (ej pythonkramaren) och ditt eget formelblad. För betyg E krävs att alla E-uppgifter är godkända,

Läs mer

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9

Quicksort. Koffman & Wolfgang kapitel 8, avsnitt 9 Quicksort Koffman & Wolfgang kapitel 8, avsnitt 9 1 Quicksort Quicksort väljer ett spcifikt värde (kallat pivot), och delar upp resten av fältet i två delar: alla element som är pivot läggs i vänstra delen

Läs mer

Länkade listor, stackar och köer

Länkade listor, stackar och köer Länkade listor, stackar och köer I fortsättningen ska vi ta upp några olika abstrakta datatyper. De kan ses som enkla verktyg i en verktygslåda som ska göra det lättare att programmera. Några av dessa

Läs mer

Grundläggande datalogi - Övning 1

Grundläggande datalogi - Övning 1 Grundläggande datalogi - Övning 1 Björn Terelius October 30, 2008 Python är ett tolkat språk som kan köras interaktivt. tcs-ray:~/grudat08>python >>> 11+3*4 23 >>> a = 15 >>> b=a >>> print "a =", a, "b

Läs mer

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C DD1316 Mikael Djurfeldt Föreläsning 2 Programmeringsteknik och C Python introduktion Utskrift Inläsning Variabler Datatyp Aritmetiska operatorer Omvandling

Läs mer

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två Binära träd Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två gånger, talar man om binära träd. Sådana

Läs mer

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D. Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D. tobias@dsv.su.se Notera att exemplen är i Python 2.5 För att översätta till Python 3.0, gör följande ändringar print(x,y) istället för print x,y input("ett

Läs mer

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2

Självbalanserande träd AVL-träd. Koffman & Wolfgang kapitel 9, avsnitt 1 2 Självbalanserande träd AVL-träd Koffman & Wolfgang kapitel 9, avsnitt 1 2 1 Balanserade träd Nodbalanserat träd: skillnaden i antalet noder mellan vänster och höger delträd är högst 1 Höjdbalanserat träd:

Läs mer

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer 729G04 Programmering och diskret matematik Python 2: Villkorssatser, sanningsvärden och logiska operatorer Föreläsningsöversikt Vad händer när vi kör vår pythonkod? Programmerare Villkorssatser Jämförelser

Läs mer

Objektsamlingar i Java

Objektsamlingar i Java 1 (6) Objektsamlingar i Java Objektorienterad programmering 3 Syfte Att ge träning i att använda objektsamlingar i Java. Mål Efter övningen skall du kunna använda objektsamlingsklasserna ArrayList och

Läs mer

1. Compute the following matrix: (2 p) 2. Compute the determinant of the following matrix: (2 p)

1. Compute the following matrix: (2 p) 2. Compute the determinant of the following matrix: (2 p) UMEÅ UNIVERSITY Department of Mathematics and Mathematical Statistics Pre-exam in mathematics Linear algebra 2012-02-07 1. Compute the following matrix: (2 p 3 1 2 3 2 2 7 ( 4 3 5 2 2. Compute the determinant

Läs mer

Datalogi för E Övning 3

Datalogi för E Övning 3 Datalogi för E Övning 3 Mikael Huss hussm@nada.kth.se AlbaNova, Roslagstullsbacken 35 08-790 62 26 Kurshemsida: http://www.csc.kth.se/utbildning/kth/kurser/2d1343/datae06 Dagens program Att skapa egna

Läs mer

Genetisk programmering i Othello

Genetisk programmering i Othello LINKÖPINGS UNIVERSITET Första versionen Fördjupningsuppgift i kursen 729G11 2009-10-09 Genetisk programmering i Othello Kerstin Johansson kerjo104@student.liu.se Innehållsförteckning 1. Inledning... 1

Läs mer

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes Vad kännetecknar en god klass F12 Nested & En odelad, väldefinierad abstraktion Uppgiften kan beskrivas kort och tydlig Namnet är en substantiv eller adjektiv som beskriver abstraktionen på ett adekvat

Läs mer

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-18 Idag Mer om grafer: Minsta uppspännande träd (för oriktade grafer). Prims algoritm. Kruskals algoritm. Djupet först-sökning. Cykel

Läs mer

Tentamen i Objektorienterad programmering

Tentamen i Objektorienterad programmering CHALMERS TEKNISKA HÖGSKOLA Datavetenskap TDA547 Tentamen i Objektorienterad programmering Lördagen 12 mars 2011, 8.30 12.30. Jourhavande lärare: Björn von Sydow, tel 0762/981014. Inga hjälpmedel. Lösningar

Läs mer

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4 Träd, binära träd och sökträd Koffman & Wolfgang kapitel 6, avsnitt 1 4 1 Träd Träd är ickelinjära och hierarkiska: i motsats till listor och fält en trädnod kan ha flera efterföljare ( barn ) men bara

Läs mer

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111 /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111 0 # coding : latin Sammanfattning Gick igenom listor, dictionary, felhantering, strängjämförelser, split(), rstrip()

Läs mer

Dugga Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036) Dugga Datastrukturer (DAT036) Duggans datum: 2012-11-21. Författare: Nils Anders Danielsson. För att en uppgift ska räknas som löst så måste en i princip helt korrekt lösning lämnas in. Enstaka mindre

Läs mer

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037) Föreläsning 7 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-21 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 Förra

Läs mer

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037) Föreläsning Datastrukturer (DAT037) Nils Anders Danielsson 2015-11-23 Idag Mer om grafer: Minsta uppspännande träd (för oriktade grafer). Djupet först-sökning. Minsta uppspännande träd Träd (utan rot)

Läs mer

Preschool Kindergarten

Preschool Kindergarten Preschool Kindergarten Objectives CCSS Reading: Foundational Skills RF.K.1.D: Recognize and name all upper- and lowercase letters of the alphabet. RF.K.3.A: Demonstrate basic knowledge of one-toone letter-sound

Läs mer

Språket Python - Del 1 Grundkurs i programmering med Python

Språket Python - Del 1 Grundkurs i programmering med Python Hösten 2009 Dagens lektion Ett programmeringsspråks byggstenar Några inbyggda datatyper Styra instruktionsflödet Modulen sys 2 Ett programmeringsspråks byggstenar 3 ETT PROGRAMMERINGSSPRÅKS BYGGSTENAR

Läs mer

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det? Föreläsning 10 Datalogi 1 DA2001 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer på skärmen print( Hej ) print( Hur är det?

Läs mer

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk Föreläsning 2 steknik DD1310 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer funktioner betyder att instruera en dator Ett program

Läs mer

Tentamen i Introduktion till programmering

Tentamen i Introduktion till programmering Tentamen i Introduktion till programmering Kurskod: Skrivtid: D0009E 09:00-13:00 (4 timmar) Totalt antal uppgifter: 7 Totalt antal poäng: 38 Tentamensdatum: 2014-05-17 Jourhavande lärare: Tillåtna hjälpmedel:

Läs mer

Föreläsning 9 Innehåll

Föreläsning 9 Innehåll Föreläsning 9 Innehåll Binära sökträd algoritmer för sökning, insättning och borttagning, implementering effektivitet balanserade binära sökträd, AVL-träd Abstrakta datatyperna mängd (eng. Set) och lexikon

Läs mer

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion Introduktion till programmering Föreläsning 4: Villkor och rekursion 1 1 Några inbyggda funktioner (med resultat!) Konverterar mellan de grundläggande typerna: >>> int("32") 32 >>> int(3.999) 3 >>> float(32)

Läs mer

Selektion och iteration

Selektion och iteration Selektion och iteration TDDD73 Funktionell och imperativ programmering i Python Föreläsning 6 Peter Dalenius Institutionen för datavetenskap 2014-09-15 Översikt Hur utformar man villkor för framför allt

Läs mer

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18 Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18 Dagens föreläsning Betygskriterier P-redovisning Komplettering Vad händer om man inte hinner klart? Plussa för betyg E ska

Läs mer

Ordlistor, filhantering och ut på webben. Linda Mannila 20.11.2007

Ordlistor, filhantering och ut på webben. Linda Mannila 20.11.2007 Ordlistor, filhantering och ut på webben Linda Mannila 20.11.2007 Vad kan vi nu? Primitiva datatyper Tal, strängar, booleska värden Samlingsdatatyp Listan Utskrift Indata Felhantering Funktioner och moduler

Läs mer

Lösningar Datastrukturer TDA

Lösningar Datastrukturer TDA Lösningar Datastrukturer TDA416 2016 12 21 roblem 1. roblem 2. a) Falskt. Urvalssortering gör alltid samma mängd av jobb. b) Sant. Genom att ha en referens till sista och första elementet, kan man nå både

Läs mer

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner Introduktion till programmering D0009E Föreläsning 5: Fruktbara funktioner 1 Retur-värden Funktioner kan både orsaka en effekt och returnera ett resultat. Hittills har vi ej definierat några egna funktioner

Läs mer

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam! Python Mer om datatyper Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam! Datatyper Dictionaries - {1: camelot,2: shrubbery } Tupler - (1,2,3,) 1 Lite om strängar Strängar innehåller specialtecken

Läs mer

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn. Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E Föreläsning 4: Villkor och rekursion Konverterar mellan de grundläggande typerna: >>> int("") >>> int(.999) >>> float().0

Läs mer

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Johan Falkenjack johan.falkenjack@liu.se Linköpings universitet Sweden December 4, 2013 1 Innehåll Arv och andra viktiga begrepp Abstrakta

Läs mer

Föreläsning 6: Introduktion av listor

Föreläsning 6: Introduktion av listor Föreläsning 6: Introduktion av listor Med hjälp av pekare kan man bygga upp datastrukturer på olika sätt. Bland annat kan man bygga upp listor bestående av någon typ av data. Begreppet lista bör förklaras.

Läs mer

Writing with context. Att skriva med sammanhang

Writing with context. Att skriva med sammanhang Writing with context Att skriva med sammanhang What makes a piece of writing easy and interesting to read? Discuss in pairs and write down one word (in English or Swedish) to express your opinion http://korta.nu/sust(answer

Läs mer

Föreläsning 8: Exempel och problemlösning

Föreläsning 8: Exempel och problemlösning TDA 545: Objektorienterad programmering Föreläsning 8: Exempel och problemlösning Magnus Myréen Chalmers, läsperiod 1, 2015-2016 De tre senaste föreläsningarna Läsanvisning: kap 2 & 13 meddelanden och

Läs mer

Laboration: Whitebox- och blackboxtesting

Laboration: Whitebox- och blackboxtesting Tilda11 höstterminen 2011 Laboration: Whitebox- och blackboxtesting Mål med laborationen Du ska lära dig begreppen white-box testing och black-box testing Du ska öva dig på att konstruera testfall Du ska

Läs mer

Styrteknik: Binära tal, talsystem och koder D3:1

Styrteknik: Binära tal, talsystem och koder D3:1 Styrteknik: Binära tal, talsystem och koder D3:1 Digitala kursmoment D1 Boolesk algebra D2 Grundläggande logiska funktioner D3 Binära tal, talsystem och koder Styrteknik :Binära tal, talsystem och koder

Läs mer

Pre-Test 1: M0030M - Linear Algebra.

Pre-Test 1: M0030M - Linear Algebra. Pre-Test : M3M - Linear Algebra. Test your knowledge on Linear Algebra for the course M3M by solving the problems in this test. It should not take you longer than 9 minutes. M3M Problem : Betrakta fyra

Läs mer

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen Programmeringsteknik II Inledning. Anmälningskod: Tentamen Programmeringsteknik II 2016-01-11 Inledning I bilagan finns ett antal mer eller mindre ofullständiga klasser. Några ingår i en hierarki: List, SortedList, SplayList och ListSet enligt vidstående

Läs mer

PYTHON SNABBREPETITION MEN FÖRST LITE ALLMÄNT OM PROGRAMMERING 729G04 PYTHON 2. Dagens Python

PYTHON SNABBREPETITION MEN FÖRST LITE ALLMÄNT OM PROGRAMMERING 729G04 PYTHON 2. Dagens Python Dagens Python 729G04 PYTHON 2 Mer om funktioner Villkorssatser JODY FOO Department of Computer and Information Science (IDA) Linköping University, Sweden Linköpings universitet 1 2 MEN FÖRST LITE ALLMÄNT

Läs mer

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner Introduktion till programmering Föreläsning 5: Fruktbara funktioner 1 Retur-värden Funktioner kan både orsaka en effekt och returnera ett resultat. Hittills har vi ej definierat några egna funktioner med

Läs mer

Par m 328 feet. Lång höger sväng. Korgen står placerad i en skogsglänta OB-linje på vänster sida.

Par m 328 feet. Lång höger sväng. Korgen står placerad i en skogsglänta OB-linje på vänster sida. 1 100 m 328 feet Lång höger sväng. Korgen står placerad i en skogsglänta -linje på vänster sida. Long right turn. Basket are placed in a forrest glade. -line on the left side. Snälla, skräpa ej ner vår

Läs mer

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036) Tentamen Datastrukturer (DAT036) Datum och tid för tentamen: 2013-12-16, 14:00 18:00. Ansvarig: Nils Anders Danielsson. Nås på 0700 620 602 eller anknytning 1680. Besöker tentamenssalarna ca 15:00 och

Läs mer

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037) Föreläsning 8 Datastrukturer (DAT037) Fredrik Lindblad 1 22 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037

Läs mer

ASSEMBLY INSTRUCTIONS SCALE CIRCLE - STANDARD

ASSEMBLY INSTRUCTIONS SCALE CIRCLE - STANDARD ASSEMBLY INSTRUCTIONS ALL COMPONENTS Metal profile 0 mm Gripper Ceiling attachments Screws for ceiling attachements (not included) Wires Metal profile 60 mm Metal profile 00 mm Felt - Full Felt - Half

Läs mer

Att skriva till och läsa från terminalfönstret

Att skriva till och läsa från terminalfönstret Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen

Läs mer

Tentamen Datastrukturer, DAT037 (DAT036)

Tentamen Datastrukturer, DAT037 (DAT036) Tentamen Datastrukturer, DAT037 (DAT036) Datum, tid och plats för tentamen: 2017-08-17, 8:30 12:30, M. Ansvarig: Fredrik Lindblad. Nås på tel nr. 031-772 2038. Besöker tentamenssalarna ca 9:30 och ca 11:00.

Läs mer

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python. är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar

Läs mer

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET UMEÅ UNIVERSITET Datavetenskap 010824 TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET Datum : 010824 Tid : 9-15 Hjälpmedel : Inga Antal uppgifter : 7 Totalpoäng : 40 (halva poängtalet krävs normalt

Läs mer

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19 TDDC74 Programmering: Abstraktion och modellering Dugga 2, 2017-04-06, kl 17-19 Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis i

Läs mer

Libers språklåda i engelska Grab n go lessons

Libers språklåda i engelska Grab n go lessons Libers språklåda i engelska 7-9 - Grab n go lessons PROVLEKTION Libers språklåda i engelska Grab n go lessons (47-90988-9) Författarna och Liber AB Får kopieras 1 Two stories in one Förberedelser Kopiera

Läs mer

Module 1: Functions, Limits, Continuity

Module 1: Functions, Limits, Continuity Department of mathematics SF1625 Calculus 1 Year 2015/2016 Module 1: Functions, Limits, Continuity This module includes Chapter P and 1 from Calculus by Adams and Essex and is taught in three lectures,

Läs mer

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis

Läs mer

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python. är, som Scheme, ett interpreterat språk men det finns kompilatorer för. När man interpreterar ett språk tillhandahåller man en interpretator som läser sats för sats och försöker tolka den. När man kompilerar

Läs mer

Föreläsning 3. Stack

Föreläsning 3. Stack Föreläsning 3 Stack Föreläsning 3 ADT Stack Stack JCF Tillämpning Utvärdera ett postfix uttryck Stack implementerad med en array Stack implementerad med en länkad lista ADT Stack Grundprinciper: En stack

Läs mer

ASSEMBLY INSTRUCTIONS SCALE SQUARE - STANDARD

ASSEMBLY INSTRUCTIONS SCALE SQUARE - STANDARD ASSEMBLY INSTRUCTIONS ALL COMPONENTS Metal profile 0 mm Gripper Ceiling attachments Screws for ceiling attachements (not included) Wires Metal profile 60 mm Metal profile 00 mm Felt - Full Felt - Half

Läs mer

Installation av F13 Bråvalla

Installation av F13 Bråvalla Website: http://www.rbdesign.se Installation av F13 Bråvalla RBDESIGN FREEWARE - ESCK Norrköping-Bråvalla 1. Ladda ner och packa upp filerna i en mapp som du har skapat på ett lättöverskådligt ställe utanför

Läs mer

12.6 Heat equation, Wave equation

12.6 Heat equation, Wave equation 12.6 Heat equation, 12.2-3 Wave equation Eugenia Malinnikova, NTNU September 26, 2017 1 Heat equation in higher dimensions The heat equation in higher dimensions (two or three) is u t ( = c 2 2 ) u x 2

Läs mer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk

Läs mer

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037) Föreläsning Datastrukturer (DAT037) Nils Anders Danielsson 2015-11-20 Idag Grafer: Terminologi. Datastrukturer. Topologisk sortering. Kortaste vägen. Bredden först-sökning. Dijkstras algoritm. (Vi får

Läs mer

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15.

Idag: Centrerad utskrift. Granskning. DD1311 Programmeringsteknik med PBL. Granskning Felhantering GUI. Föreläsning 15. Skolan för Datavetenskap och kommunikation Idag: DD1311 Programmeringsteknik med PBL Granskning Felhantering GUI Föreläsning 15 På torsdag: Mer om GUI På grupptimmen: genomgång av granskningsprotokollet

Läs mer

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16 TDDC74 Programmering: Abstraktion och modellering Dugga 2, 207-04-06, kl 4-6 Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis i svårighetsordning.

Läs mer

Kurskod: TAMS28 MATEMATISK STATISTIK Provkod: TEN1 05 June 2017, 14:00-18:00. English Version

Kurskod: TAMS28 MATEMATISK STATISTIK Provkod: TEN1 05 June 2017, 14:00-18:00. English Version Kurskod: TAMS28 MATEMATISK STATISTIK Provkod: TEN1 5 June 217, 14:-18: Examiner: Zhenxia Liu (Tel: 7 89528). Please answer in ENGLISH if you can. a. You are allowed to use a calculator, the formula and

Läs mer

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT 2007. Lars Larsson Algoritmer 1

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT 2007. Lars Larsson Algoritmer 1 Algoritmer Lars Larsson VT 2007 Lars Larsson Algoritmer 1 1 2 3 4 5 Lars Larsson Algoritmer 2 Ni som går denna kurs är framtidens projektledare inom mjukvaruutveckling. Som ledare måste ni göra svåra beslut

Läs mer

Lösningsförslag till exempeltenta 1

Lösningsförslag till exempeltenta 1 Lösningsförslag till exempeltenta 1 1 1. Beskriv hur binärsökning fungerar. Beskriv dess pseudokod och förklara så klart som möjligt hur den fungerar. 2 Uppgift 1 - Lösning Huvudidé: - Titta på datan i

Läs mer

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk Föreläsning 2 steknik och C DD1316 python introduktion Variabler Datatyp Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer betyder att instruera en dator Ett program

Läs mer

Tentamen MMG610 Diskret Matematik, GU

Tentamen MMG610 Diskret Matematik, GU Tentamen MMG610 Diskret Matematik, GU 2017-01-04 kl. 08.30 12.30 Examinator: Peter Hegarty, Matematiska vetenskaper, Chalmers/GU Telefonvakt: Peter Hegarty, telefon: 0766 377 873 Hjälpmedel: Inga hjälpmedel,

Läs mer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper Tentamen Programmeringsteknik II 2018-10-19 Skrivtid: 8:00 13:00 Tänk på följande Skriv läsligt. Använd inte rödpenna. Skriv bara på framsidan av varje papper. Lägg uppgifterna i ordning. Skriv uppgiftsnummer

Läs mer

Kurskod: TAIU06 MATEMATISK STATISTIK Provkod: TENA 17 August 2015, 8:00-12:00. English Version

Kurskod: TAIU06 MATEMATISK STATISTIK Provkod: TENA 17 August 2015, 8:00-12:00. English Version Kurskod: TAIU06 MATEMATISK STATISTIK Provkod: TENA 17 August 2015, 8:00-12:00 Examiner: Xiangfeng Yang (Tel: 070 2234765). Please answer in ENGLISH if you can. a. Allowed to use: a calculator, Formelsamling

Läs mer

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser Introduktion till programmering Föreläsning 2: Variabler, uttryck och satser 1 1 Värden De grundläggande saker som en dator manipulerar resultaten av beräkningar kallas värden Värden vi stött på: 2 och

Läs mer

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg LUNDS TEKNISKA HÖGSKOLA 1(5) Institutionen för datavetenskap Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg 2013 12 19 1. a) En samling element där insättning och borttagning

Läs mer

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Föreläsning 4 Kö Föreläsning 4 ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista ADT Kö Grundprinciper: En kö fungerar som en kö. Man fyller på den längst bak och

Läs mer

Support Manual HoistLocatel Electronic Locks

Support Manual HoistLocatel Electronic Locks Support Manual HoistLocatel Electronic Locks 1. S70, Create a Terminating Card for Cards Terminating Card 2. Select the card you want to block, look among Card No. Then click on the single arrow pointing

Läs mer

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

if (n==null) { return null; } else { return new Node(n.data, copy(n.next)); Inledning I bilagor finns ett antal mer eller mindre ofullständiga klasser. Klassen List innehåller några grundläggande komponenter för att skapa och hantera enkellänkade listor av heltal. Listorna hålls

Läs mer

EXPERT SURVEY OF THE NEWS MEDIA

EXPERT SURVEY OF THE NEWS MEDIA EXPERT SURVEY OF THE NEWS MEDIA THE SHORENSTEIN CENTER ON THE PRESS, POLITICS & PUBLIC POLICY JOHN F. KENNEDY SCHOOL OF GOVERNMENT, HARVARD UNIVERSITY, CAMBRIDGE, MA 0238 PIPPA_NORRIS@HARVARD.EDU. FAX:

Läs mer

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Introduktion till programmering SMD180. Föreläsning 9: Tupler Introduktion till programmering Föreläsning 9: Tupler 1 1 Sammansatta datatyper Strängar Sekvenser av tecken Icke muterbara Syntax: "abcde" Listor Sekvenser av vad som helst Muterbara Syntax: [1, 2, 3]

Läs mer

ASSEMBLY INSTRUCTIONS SCALE - SYSTEM

ASSEMBLY INSTRUCTIONS SCALE - SYSTEM ASSEMBLY INSTRUCTIONS 60 mm 00 mm 600 mm 000 mm R50 mm ALL COMPONENTS Metal profile 60 mm (start and end of system) Metal profile connection Wire Felt square Metal profile 00 mm Metal profile connection

Läs mer

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR

FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR FÖRBERED UNDERLAG FÖR BEDÖMNING SÅ HÄR Kontrollera vilka kurser du vill söka under utbytet. Fyll i Basis for nomination for exchange studies i samråd med din lärare. För att läraren ska kunna göra en korrekt

Läs mer

Webbregistrering pa kurs och termin

Webbregistrering pa kurs och termin Webbregistrering pa kurs och termin 1. Du loggar in på www.kth.se via den personliga menyn Under fliken Kurser och under fliken Program finns på höger sida en länk till Studieöversiktssidan. På den sidan

Läs mer

Calculate check digits according to the modulus-11 method

Calculate check digits according to the modulus-11 method 2016-12-01 Beräkning av kontrollsiffra 11-modulen Calculate check digits according to the modulus-11 method Postadress: 105 19 Stockholm Besöksadress: Palmfeltsvägen 5 www.bankgirot.se Bankgironr: 160-9908

Läs mer

Namn Stil Dokumentation Objekt-orienterad programmering OBS OBS OBS OBS OBS OBS OBS OBS

Namn Stil Dokumentation Objekt-orienterad programmering OBS OBS OBS OBS OBS OBS OBS OBS Namn Stil Dokumentation Objekt-orienterad programmering Dept. of Computer Science Umeå University jem@cs.umu.se OBS OBS OBS OBS OBS OBS OBS OBS Detta är inget gnäll på någon speciell utan jag ser detta

Läs mer