Gustav Johansson

Storlek: px
Starta visningen från sidan:

Download "Gustav Johansson"

Transkript

1 LINKOPINGS UNIVERSITET, IDA Liv eller död agent Artificiell intelligens på liv eller död Gustav Johansson

2

3 Innehållsförteckning Go - introduktion... 1 Liv eller död... 2 Liv eller död agent... 4 Representation... 4 Problemidentifikation... 4 Utvärdering... 4 Sökning... 5 Utvärdering och resultat... 5 Referenser... 7

4 Go - introduktion Spelet Go är ett brädspel som spelas mellan två spelare vilka omväxlande spelar svarta eller vita stenar på spelbrädets lediga platser. Spelets bräde består av ett rutnät med 19x19 linjer, spelets pjäser spelas på skärningspunkterna mellan dessa linjer. Om en sten placeras på brädet så säger man att antalet friheter som stenen har utgörs av alla angränsade tomma skärningspunkter, se figur 1. Figur 1 Figur 2 Figur 3 I figur 1 så har den svarta stenen fyra friheter vilka är markerade med blå kryss, i figur 2, en frihet och i figur 3 så har den vita spelaren fångat den svarta stenen då den inte längre har några friheter alls. Vidare så kan antalet friheter för en sten utökas om den kopplas ihop med en annan sten av samma färg, dessa kallas då för en grupp av stenar, exempelvis så har gruppen i figur 4 sex friheter. Figur 4 Spelets mål är att avgränsa mer territorium än sin motspelare. Spelet avslutas när båda spelarna anser att det inte finns några meningsfulla drag kvar att göra. Under vägen så genomgås tre övergripande perioder. Öppningsspelet, mellanspelet samt slutspelet. Alla dessa faser av spelet är intressanta och har problem som är intressanta för AI. Ett specifikt problem som ofta uppstår under mellanspelet är s.k. liv eller död situationer. 1

5 Liv eller död I liv eller död situationer så utvärderas en eller flera gruppers status som levande, död eller osäker. När man bedömer gruppers levnadsstatus pratar man ofta om ögon. Ett öga är ett område som är inringat av en grupp. Formen och storleken på ett öga samt antalet ögon som en grupp har är alla avgörande faktorer för liv eller död utvärdering. Den vita gruppen i figur 5 har ett öga, men ögon kan vara formade på många olika sätt, det viktiga är att det är helt eller potentiellt helt omringade områden. Figur 5 Den vita gruppen har ett öga som är den markerade positionen En grupp är levande om den alltid har minst en frihet kvar oavsett vad motspelaren gör, med reservation för att spelaren som gruppen tillhör inte saboterar den själv. Ett exempel visas i figur 6 Figur 6 Den vita gruppen ovan är levande Den vita gruppen har alltid minst en frihet kvar oavsett var svart spelar. Skulle svart välja att placera en sten i något av de markerade områdena skulle den stenen omedelbart ha noll friheter och därför vara död. 2

6 En grupp sägs vara död om spelare som gruppen tillhör inte kan skapa två ögon för gruppen oavsett vad den gör. Se figur 7 för exempel Figur 7 En död vit grupp Den vita gruppen ovan är död, för att den endast har ett område som kan klassas som ett öga och kan inte skapa fler friheter på något sätt. En grupps status sägs vara osäker när den inte entydligt lever eller är död. Här handlar det om att levnadsstatus avgörs beroende på hur spelarna gör sina drag. Figur 8 Svarta gruppens status som levande eller död är osäker. I Figur 8 så är den viktiga rutan den som är markerad, om svart spelar på den positionen så är gruppen levande, men om vit spelar på den positionen så är den död. 3

7 Liv eller död agent För att en datoragent ska kunna lösa liv eller död problem så finns det ett antal problem som måste lösas. Representation Ett första problem är representation av brädet. I mitt fall så har jag funnit ett färdigt program som spelar Go. Detta programmet heter Disco och är skrivet av Mark Dufour. I filen go.py så återfinns klassern Board som innehåller all information om brädet och spelarnas drag. Brädets spelpositioner listas i Board som värden mellan 0 och 80 där varje siffra innehåller information om huruvida rutan är tom eller innehåller vit eller svart spelpjäs. Positionerna innehåller dessutom information om vilka positioner som är grannar. Utöver denna information så finns det även information om antal fångar som tagits och en del annan information. Problemidentifikation Nästa problem som uppstår är hur man ska identifiera grupper som är potentiella liv-eller-död problem. Detta är för att det är praktiskt omöjligt att utvärdera varenda position i hela brädet i något sökdjup som är intressant. Även med ett 9x9 bräde och ett sökdjup på 6 så tar det fruktansvärt lång tid att hitta lösningar. Genom att identifiera och avgränsa potentiella problemområden minskar man tidsoch minneskomplexiteten väldigt mycket. Den metod jag valt att använda är att först sätta ihop de grupper som tillhör varandra och sedan utvärdera dessa grupper mot fara. Vidare så har jag försökt att lokalisera sökrymden till kringliggande tomma områden. Än så länge klarar koden att identifiera problem som är på den mycket lätta skalan. Utvärdering Vidare problem är utvärdering av resultat. Jag har valt att skapa en utvärdering som funkar för lokala problem av typen liv-eller-död. B = P + C x2 C x2 Där B = utvärdering för svart, P = antal svarta stenar spelade, C = antal vita fångade stenar och C = antal stenar fångade av svart. Nu är utvärderingsfunktionen ett av de största problemen som Go programmerare ställs inför, men hyffsade uppskattningar, speciellt för sådana här specialiserade, lokala, situationer kan ofta uppskattas med en finurlig funktion. Den jag valt löser de korta, lokala problem som agenten i övrigt har förmågan att lösa. Mer komplexa problem kräver mer utförlig utvärderingsfunktion. 4

8 Sökning Slutligen så ska agenten lyckas söka igenom den förhoppningsvis avgränsade sökrymden med någon typ av sökmetod. Den metod jag valt att använda är minimax metod med alpha-beta cutoff med bestämt ett maxdjup som beror på förgreningsfaktorn. Förgreningsfaktorn bestäms av storleken på gruppen i fråga. Just nu så utvärderas exempelvis en förgreningsfaktor på 10 på ett sökdjup av 4. Utvärdering och resultat Just nu så klarar problemlösaren att lösa mycket enkla problem, men när problemen blir lite svårare så har koden mycket svårare att hitta rätt lösning. Mina problem ligger huvudsakligen i området problemidentifikation. Byuung-Doo Lee beskriver i sin avhandling[] en liv-eller-död agent som använder sig av mönster igenkänning samt analys av ögonformation i syfte att generera ett litet antal öppningsdrag. Den metoden visar på stor potential och bred generaliserbarhet. I min ursprungliga plan hade jag tänkt implementera en ögon-analys funktion men fastnade på andra problem. I min bedömning så är det för krångligt att skriva ett mönsterigenkänningssystem samt producera den mängd problem för den att träna sig på. Jag menar att det går att avgränsa sökrymden med mer klumpiga, närhets heuristiker för att begränsa sökrymden. Slutligen så går det alldeles för långsamt. Problemet i fig 12 tog ca 2 minuter att lösa. Det hade en förgreningsfaktor på 12 och ett sökdjup på 5. En simpel ögonanalys skulle reducera de initiala noderna till bara 3 och en mer effektiv alpha-beta cutoff skulle ytterligare reducera söktiden. Försvårar man problemet bara lite i stil med figur 13 så missar sökningen lösningen, om inte sökdjupet ytterligare expanderas. Figur 9 Svart att spela för att överleva, kortsiktigt. Blå krysset markerar rätt drag 5

9 Figur 10 Figur 11 Vit att spela och döda den svarta gruppen. Vit sten på den markerade positionen i figur X avgör. Figur 12 Markerade positionen avgör huruvida svarta gruppen överlever eller inte Figur 13 Svart har valet mellan att placera en sten i ena eller andra markerade positionen för att överleva Slutsatsen är att problemlösaren tyvärr inte är praktiskt användbar, men med lite mer arbete och så skulle den kunna vara åtminstone intressant. Det finns en stor mängd intressanta metoder som bara väntar på att bli implementerade. Mönsterigenkänning är inte den enda, det finns vidare intressanta algoritmer. 6

10 Referenser Bruno Bouzy, T. C. (2000). Computer Go: An AI oriented survey. Lee, B.-D. (2004). Life-and-death Problem Solver in Go. Auckland. 7

11 Bilaga 1: go.py kod # -*- coding: cp1252 -*- import random, math, sys SIZE = 9 GAMES = 1500 KOMI = 7.5 EMPTY, WHITE, BLACK = 0, 1, 2 SHOW = {EMPTY: '.', WHITE: 'o', BLACK: 'x'} PASS = -1 MAXMOVES = SIZE*SIZE*3 TIMESTAMP = 0 MOVES = 0 def to_pos(x,y): return y * SIZE + x def to_xy(pos): y, x = divmod(pos, SIZE) return x, y class Square: def init (self, board, pos): self.board = board self.pos = pos self.timestamp = TIMESTAMP self.removestamp = TIMESTAMP self.zobrist_strings = [random.randrange(sys.maxint) for i in range(3)] def set_neighbours(self): x, y = self.pos % SIZE, self.pos / SIZE; self.neighbours = [] for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: newx, newy = x + dx, y + dy if 0 <= newx < SIZE and 0 <= newy < SIZE: self.neighbours.append(self.board.squares[to_pos(newx, newy)]) def move(self, color): global TIMESTAMP, MOVES TIMESTAMP += 1 MOVES += 1 self.board.zobrist.update(self, color) self.color = color self.reference = self self.ledges = 0 self.used = True for neighbour in self.neighbours: neighcolor = neighbour.color if neighcolor == EMPTY: self.ledges += 1 else: neighbour_ref = neighbour.find(update=true) if neighcolor == color: if neighbour_ref.reference.pos!= self.pos: self.ledges += neighbour_ref.ledges neighbour_ref.reference = self 8

12 self.ledges -= 1 else: neighbour_ref.ledges -= 1 if neighbour_ref.ledges == 0: neighbour.remove(neighbour_ref) self.board.zobrist.add() def remove(self, reference, update=true): self.board.zobrist.update(self, EMPTY) self.removestamp = TIMESTAMP if update: self.color = EMPTY self.board.emptyset.add(self.pos) if self.board.color == BLACK: self.board.white_dead += 1 else: self.board.black_dead += 1 for neighbour in self.neighbours: if neighbour.color!= EMPTY and neighbour.removestamp!= TIMESTAMP: neighbour_ref = neighbour.find(update) if neighbour_ref.pos == reference.pos: neighbour.remove(reference, update) else: if update: neighbour_ref.ledges += 1 def find(self, update=false): reference = self.reference if reference.pos!= self.pos: reference = reference.find(update) if update: self.reference = reference return reference def repr (self): return repr(to_xy(self.pos)) class EmptySet: def init (self, board): self.board = board self.empties = range(size*size) self.empty_pos = range(size*size) def random_choice(self): choices = len(self.empties) while choices: i = int(random.random()*choices) pos = self.empties[i] if self.board.useful(pos): return pos choices -= 1 self.set(i, self.empties[choices]) self.set(choices, pos) return PASS def add(self, pos): self.empty_pos[pos] = len(self.empties) self.empties.append(pos) def remove(self, pos): 9

13 self.set(self.empty_pos[pos], self.empties[len(self.empties)-1]) self.empties.pop() def set(self, i, pos): self.empties[i] = pos self.empty_pos[pos] = i class ZobristHash: def init (self, board): self.board = board self.hash_set = set() self.hash = 0 for square in self.board.squares: self.hash ^= square.zobrist_strings[empty] self.hash_set.clear() self.hash_set.add(self.hash) def update(self, square, color): self.hash ^= square.zobrist_strings[square.color] self.hash ^= square.zobrist_strings[color] def add(self): self.hash_set.add(self.hash) def dupe(self): return self.hash in self.hash_set class Board: def init (self): self.groups={} self.terminal = 10 self.squares = [Square(self, pos) for pos in range(size*size)] for square in self.squares: square.set_neighbours() self.reset() ######################################################################## ## def terminal(self): ## if self.score > 10: ## self.terminal = True ######################################################################## def reset(self): for square in self.squares: square.color = EMPTY square.used = False self.emptyset = EmptySet(self) self.zobrist = ZobristHash(self) self.color = BLACK self.finished = False self.lastmove = -2 self.history = [] self.white_dead = 0 self.black_dead = 0 def move(self, pos): square = self.squares[pos] 10

14 if pos!= PASS: square.move(self.color) self.emptyset.remove(square.pos) elif self.lastmove == PASS: self.finished = True if self.color == BLACK: self.color = WHITE else: self.color = BLACK self.lastmove = pos self.history.append(pos) def random_move(self): return self.emptyset.random_choice() def useful_fast(self, square): if not square.used: for neighbour in square.neighbours: if neighbour.color == EMPTY: return True return False def useful(self, pos): global TIMESTAMP TIMESTAMP += 1 square = self.squares[pos] if self.useful_fast(square): return True old_hash = self.zobrist.hash self.zobrist.update(square, self.color) empties = opps = weak_opps = neighs = weak_neighs = 0 for neighbour in square.neighbours: neighcolor = neighbour.color if neighcolor == EMPTY: empties += 1 continue neighbour_ref = neighbour.find() if neighbour_ref.timestamp!= TIMESTAMP: if neighcolor == self.color: neighs += 1 else: opps += 1 neighbour_ref.timestamp = TIMESTAMP neighbour_ref.temp_ledges = neighbour_ref.ledges neighbour_ref.temp_ledges -= 1 if neighbour_ref.temp_ledges == 0: if neighcolor == self.color: weak_neighs += 1 else: weak_opps += 1 neighbour_ref.remove(neighbour_ref, update=false) dupe = self.zobrist.dupe() self.zobrist.hash = old_hash strong_neighs = neighs-weak_neighs strong_opps = opps-weak_opps return not dupe and \ (empties or weak_opps or (strong_neighs and (strong_opps or weak_neighs))) def useful_moves(self): return [pos for pos in self.emptyset.empties if self.useful(pos)] def replay(self, history): 11

15 for pos in history: self.move(pos) def score(self, color): if color == WHITE: count = KOMI + self.black_dead *2 - self.white_dead * 2 else: count = self.white_dead * 2 - self.black_dead * 2 for square in self.squares: squarecolor = square.color if squarecolor == color: count += 1 elif squarecolor == EMPTY: surround = 0 for neighbour in square.neighbours: if neighbour.color == color: surround += 1 if surround == len(square.neighbours): count += 1 return count def check(self): for square in self.squares: if square.color == EMPTY: continue members1 = set([square]) changed = True while changed: changed = False for member in members1.copy(): for neighbour in member.neighbours: if neighbour.color == square.color and neighbour not in members1: changed = True members1.add(neighbour) ledges1 = 0 for member in members1: for neighbour in member.neighbours: if neighbour.color == EMPTY: ledges1 += 1 root = square.find() #print 'members1', square, root, members1 #print 'ledges1', square, ledges1 members2 = set() for square2 in self.squares: if square2.color!= EMPTY and square2.find() == root: members2.add(square2) ledges2 = root.ledges #print 'members2', square, root, members1 #print 'ledges2', square, ledges2 assert members1 == members2 assert ledges1 == ledges2, ('ledges differ at %r: %d %d' % (square, ledges1, ledges2)) empties1 = set(self.emptyset.empties) 12

16 empties2 = set() for square in self.squares: if square.color == EMPTY: empties2.add(square.pos) def repr (self): result = [] for y in range(size): start = to_pos(0, y) result.append(''.join([show[square.color]+' ' for square in self.squares[start:start+size]])) return '\n'.join(result) class UCTNode: def init (self): self.bestchild = None self.pos = -1 self.wins = 0 self.losses = 0 self.pos_child = [None for x in range(size*size)] self.parent = None def play(self, board): """ verkar generera en nod utifrn sig sjlv dr du r. Detta grs.. jag vet inte hru mnga gnger""" """ testa!! Tills child!= false.. vettefan.""" """ uct tree search """ color = board.color node = self path = [node] while True: pos = node.select(board) if pos == PASS: break board.move(pos) child = node.pos_child[pos] if not child: child = node.pos_child[pos] = UCTNode() child.unexplored = board.useful_moves() child.pos = pos child.parent = node path.append(child) break path.append(child) node = child self.random_playout(board) self.update_path(board, color, path) def select(self, board): """ select move; unexplored children first, then according to uct value """ if self.unexplored: i = random.randrange(len(self.unexplored)) pos = self.unexplored[i] self.unexplored[i] = self.unexplored[len(self.unexplored)-1] self.unexplored.pop() return pos elif self.bestchild: return self.bestchild.pos else: 13

17 return PASS def random_playout(self, board): """ random play until both players pass """ for x in range(maxmoves): # XXX while not self.finished? if board.finished: break board.move(board.random_move()) def update_path(self, board, color, path): """ update win/loss count along path """ wins = board.score(black) >= board.score(white) for node in path: if color == BLACK: color = WHITE else: color = BLACK if wins == (color == BLACK): node.wins += 1 else: node.losses += 1 if node.parent: node.parent.bestchild = node.parent.best_child() def score(self): winrate = self.wins/float(self.wins+self.losses) parentvisits = self.parent.wins+self.parent.losses if not parentvisits: return winrate nodevisits = self.wins+self.losses return winrate + math.sqrt((math.log(parentvisits))/(5*nodevisits)) def best_child(self): maxscore = -1 maxchild = None for child in self.pos_child: if child and child.score() > maxscore: maxchild = child maxscore = child.score() return maxchild def best_visited(self): maxvisits = -1 maxchild = None for child in self.pos_child: if child and (child.wins+child.losses) > maxvisits: maxvisits, maxchild = (child.wins+child.losses), child return maxchild def user_move(board): while True: text = raw_input('?').strip() if text == 'p': return PASS if text == 'q': raise EOFError try: x, y = [int(i) for i in text.split()] except ValueError: continue if not (0 <= x < SIZE and 0 <= y < SIZE): continue pos = to_pos(x, y) 14

18 if board.useful(pos): return pos def computer_move(board): global MOVES pos = board.random_move() if pos == PASS: return PASS tree = UCTNode() tree.unexplored = board.useful_moves() nboard = Board() for game in range(games): node = tree nboard.reset() nboard.replay(board.history) node.play(nboard) # print 'moves', MOVES return tree.best_visited().pos def calgroups(board): testcolors = {BLACK:[],WHITE:[]} alreadystored = [] for u in testcolors: for square in board.squares: isingroup = False if square.color == u: for x in square.neighbours: if x.color == u: isingroup = True break if isingroup == True: groupstored = False for i in testcolors[u]: for z in i: if square not in z: for p in z: if square in p.neighbours: z.append(square) groupstored = True if groupstored == False: testcolors[u].append([[square]]) board.groups = testcolors print testcolors def calliberties(board): blackies = board.groups[black] whities = board.groups[white] for x in whities: liberties =0 neighbouries=0 for y in x[0]: for u in y.neighbours: if u!= 0: neighbouries+=1 15

19 if u.color == EMPTY: liberties +=1 x.append(liberties) for x in blackies: neighbouries = 0 liberties = 0 for y in x[0]: for u in y.neighbours: if u!= 0: neighbouries+=1 if u.color == EMPTY: liberties +=1 x.append(liberties) board.groups[black] = blackies board.groups[white] = whities def checkfordanger(board): groups = board.groups returngrp = [] prio1 = False prio2 = False for u in groups: for x in groups[u]: if x[1] < 3: prio1 = True if len(x[0]) > len(returngrp): returngrp = x[0] elif x[1] < 4: if prio1 == False: returngrp = max(len(returngrp),len(x[0])) return returngrp def identifysearch(group,board): global RARGH searchspace = [] for x in group: for u in x.neighbours: if u not in searchspace and u.color == 0: searchspace.append(u) for i in u.neighbours: if i not in searchspace and i.color == 0: searchspace.append(i) for p in i.neighbours: if p not in searchspace and p.color == 0: searchspace.append(p) print searchspace testlist = [] tobeappended = [1,2,3,4,5,6,7,8,9] ## for x in group: ## for x in group: ## for u in tobeappended: ## if u+x.pos not in testlist and u+x.pos < 81: ## testlist.append(u+x.pos) ## if u-x.pos not in testlist and u-x.pos > -1: ## testlist.append(u-x.pos) searchspace2=[] for x in searchspace: searchspace2.append(x.pos) for x in searchspace2: 16

20 if x not in testlist: testlist.append(x) ## print searchspace2 for x in testlist: if board.squares[x].color == 2 or board.squares[x].color == 1: testlist.remove(x) for x in testlist: if board.squares[x].color == 2 or board.squares[x].color == 1: testlist.remove(x) for x in testlist: if board.squares[x].color == 2 or board.squares[x].color == 1: testlist.remove(x) testrange = testlist print testlist return testlist testrange = [] ######################################################################## EVALDIC = {} def alphabetatest(board,searchspace): if board.color == BLACK: player = BLACK opponent = WHITE else: player = WHITE opponent = BLACK print len(searchspace) if len(searchspace) > 9: depth = 5 elif len(searchspace) > 6: depth = 7 else: depth = 9 if depth > len(searchspace): depth = len(searchspace) depth = depth + len(board.history) depth = len(board.history) + 6 def maxivali(history,move,alpha,beta): tbored = Board() for x in history: tbored.move(x) tbored.move(move) value = if len(tbored.history)>depth: return tbored.score(player) for x in searchspace: if x not in tbored.history: value = max(value,minivali(tbored.history,x,alpha,beta)) if value >= beta: return value alpha = max(alpha,value) return value def minivali(history,move,alpha,beta): tbored = Board() 17

21 for x in history: tbored.move(x) tbored.move(move) value = 1000 if len(tbored.history)> depth: return tbored.score(player) for x in searchspace: if x not in tbored.history: value = min(value,maxivali(tbored.history,x,alpha,beta)) if value <= alpha: return value beta = min(beta,value) return value for x in searchspace: EVALDIC[x] = minivali(board.history,x,-10000,10000) val = -100 for u in EVALDIC: if EVALDIC[u] >val and EVALDIC[u]!= and EVALDIC[u]!=1000: action = u val = EVALDIC[u] return action ######################################################################## ##class NEWSEARCHBITCH(board): ##def minimaxie(board): ## player = board.color ## ## def max_val(board): ## # if board.terminal == True: ## # return utility in posit ## #v=-infinity ## board = Board() 18

22 def versus_cpu(): while True: if board.lastmove!= PASS: print board print 'thinking..' pos = computer_move(board) if pos == PASS: print 'I pass.' else: print 'I move here:', to_xy(pos) board.move(pos) break #board.check() if board.finished: break if board.lastmove!= PASS: print board pos = user_move(board) board.move(pos) #board.check() if board.finished: break print 'WHITE:', board.score(white) print 'BLACK:', board.score(black) ##if name == ' main ': ## random.seed(1) ## try: ## versus_cpu() ## except EOFError: ## pass ##board.move(to_pos(4,1)) ##board.move(to_pos(5,1)) ##board.move(to_pos(1,1)) ##board.move(to_pos(7,1)) ##board.move(to_pos(2,1)) ## ##board.move(to_pos(4,4)) ##board.move(to_pos(6,6)) ##board.move(to_pos(3,4)) ##board.move(to_pos(7,6)) ## ##board.move(to_pos(1,8)) ##board.move(to_pos(5,2)) ##board.move(to_pos(2,8)) ##board.move(to_pos(6,2)) ##board.move(to_pos(3,8)) ##board.move(to_pos(7,2)) ##board.move(to_pos(4,8)) ##board.move(to_pos(8,1)) ## Exempelproblem: 1-2 step problem ## ## ##board.move(to_pos(0,0)) 19

23 ## ##board.move(to_pos(6,8)) ##board.move(to_pos(5,8)) ##board.move(to_pos(5,7)) ##board.move(to_pos(4,8)) ##board.move(to_pos(6,7)) ##board.move(to_pos(1,1)) ## Exempelproblem: 2-2 step problem. ##board.move(to_pos(0,0)) ##board.move(to_pos(6,8)) ##board.move(to_pos(5,8)) ##board.move(to_pos(5,7)) ##board.move(to_pos(4,8)) ##board.move(to_pos(4,7)) ##board.move(to_pos(2,7)) ##board.move(to_pos(1,1)) ## Exempelproblem 3 - kort problem ##board.move(to_pos(0,1)) ##board.move(to_pos(1,1)) ##board.move(to_pos(1,0)) ##board.move(to_pos(0,2)) ## Exempelproblem 4 - problem! ##board.move(to_pos(2,0)) ##board.move(to_pos(3,0)) ##board.move(to_pos(1,1)) ##board.move(to_pos(3,1)) ##board.move(to_pos(2,1)) ##board.move(to_pos(3,2)) ##board.move(to_pos(0,2)) ##board.move(to_pos(2,3)) ##board.move(to_pos(8,8)) ##board.move(to_pos(0,3)) ##board.move(to_pos(1,2)) ##board.move(to_pos(1,3)) ##board.move(to_pos(7,7)) ##board.move(to_pos(2,2)) ## Exempelproblem 5 - problem, sv 岡 re! board.move(to_pos(2,0)) board.move(to_pos(3,0)) board.move(to_pos(1,1)) board.move(to_pos(3,1)) board.move(to_pos(2,1)) board.move(to_pos(3,2)) board.move(to_pos(0,3)) board.move(to_pos(2,3)) board.move(to_pos(1,3)) board.move(to_pos(0,4)) board.move(to_pos(1,2)) 20

24 board.move(to_pos(1,4)) board.move(to_pos(8,8)) board.move(to_pos(2,2)) board.move(to_pos(8,1)) board.move(to_pos(2,4)) calgroups(board) calliberties(board) x = checkfordanger(board) u = identifysearch(x,board) alphabetatest(board,u) 21

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

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

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

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

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

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

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

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

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

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

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 Datatyper Aritmetiska operatorer av typer Reserverade ord logiska operatorer If-sats kommentarer betyder att instruera en dator Ett program är

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

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

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen Föreläsning 2 Programmeringsteknik och Matlab DD1312 Introduktion till python Variabler, datatyper, omvandling av typer sfunktioner Två olika typer av program omvandlar högnivå till lågnivå program: Interpreterande

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

Artificiell intelligens En agent som spelar Black Jack Andreas Perjons [andpe813]

Artificiell intelligens En agent som spelar Black Jack Andreas Perjons [andpe813] 1 Artificiell intelligens En agent som spelar Black Jack Andreas Perjons [andpe813] Linköpings Universitet 2019 2 Innehåll Introduktion...3 Metod..4 Programmets komponenter.4 Resultat...5 Diskussion...7

Läs mer

Grundläggande datalogi - Övning 4

Grundläggande datalogi - Övning 4 Grundläggande datalogi - Övning 4 Björn Terelius November 21, 2008 Definitioner Olika mått på komplexitet Definition En funktion f sägs vara O(g) om det existerar konstanter c, N så att f (n) < cg(n) för

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

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen Föreläsning 2 Programmeringsteknik och Matlab DD1312 Introduktion till python Variabler,datatyper, omvandling av typer sfunktioner Två olika typer av program omvandlar högnivå till lågnivå program: Interpreterande

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

Kan ett datorprogram spela solitär?

Kan ett datorprogram spela solitär? Kan ett datorprogram spela solitär? Malin Persson malpe323@student.liu.se 1 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

Läs mer

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1 Skolan för Datavetenskap och kommunikation DD1310/DD1314/DA3009 Programmeringsteknik Föreläsning 1 Kursinfo Python-intro: print variabler reserverade ord input kommentarer beräkningar datatyper if-satser

Läs mer

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1 Skolan för Datavetenskap och kommunikation DD1310/DD1314/DA3009 Programmeringsteknik Föreläsning 1 Kursinfo Diagnostiskt prov Python-intro: print variabler reserverade ord input kommentarer beräkningar

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

DD1314 Programmeringsteknik

DD1314 Programmeringsteknik Skolan för Datavetenskap och kommunikation DD1314 Programmeringsteknik Föreläsning 1 o print o variabler o reserverade ord o input o kommentarer o beräkningar o datatyper o if-satser Kursinformation Programmering:

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

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

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

Pythons standardbibliotek

Pythons standardbibliotek Pythons standardbibliotek Python 3 skall, enligt standarddokumenten http://docs.python.org/py3k/library/index.html ha stöd för vissa funktioner, typer och datastrukturer Så länge man håller sig till detta

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

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

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for Inför provet Provet skrivs för hand och är uppdelad i två delar. Den första delen är på E-nivå och den andra delen är på C- och A-nivå. För att det ska bli enklare för er att träna inför provet så har

Läs mer

AI för Hive. Kungliga Tekniska Högskolan. Examensarbete inom datalogi, grundnivå (DD143X) Författare: Urban Pettersson

AI för Hive. Kungliga Tekniska Högskolan. Examensarbete inom datalogi, grundnivå (DD143X) Författare: Urban Pettersson Kungliga Tekniska Högskolan Examensarbete inom datalogi, grundnivå (DD143X) AI för Hive Författare: Urban Pettersson urbanpe@kth.se Handledare: Per Austrin 29 april 2014 Sammanfattning I projektet implementerades

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

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

AGA-regler. goforbundet.se/ Referens: AGA 1991

AGA-regler. goforbundet.se/ Referens: AGA 1991 AGA-regler Referens: AGA 1991 Varje formulering av dessa regler vars innehåll är identiskt, är godtagbar som ett uttryck för AGAs goregler, så länge de hänvisar till de mer kompletta regler som ges i AGAs

Läs mer

Datalogi, grundkurs 1

Datalogi, grundkurs 1 Datalogi, grundkurs 1 Fiktiv Tentamen Lösningsförslag och kommentarer 1. Lösningsförslaget nedan förutsätter ingenting om filens innehåll och är alltså mer generell än nödvändigt: alfa= ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ

Läs mer

Handbok Othello. Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll

Handbok Othello. Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll 2 Innehåll 1 Inledning 5 2 Hur man spelar 6 3 Spelets regler, strategi och tips 7 3.1 Spelets grunder.......................................

Läs mer

Föreläsning 4: Kombinatorisk sökning

Föreläsning 4: Kombinatorisk sökning DD2458, Problemlösning och programmering under press Föreläsning 4: Kombinatorisk sökning Datum: 2009-09-25 Skribent(er): Kristina Nylander, Dennis Ekblom, Marcus Öman Föreläsare: Fredrik Niemelä 1 Introduktion

Läs mer

Tenta i Grundläggande programmering DD klockan

Tenta i Grundläggande programmering DD klockan Tenta i Grundläggande programmering DD1331 2017-10-20 klockan 14.00 16.00 Marcus Dicander, KTH CST Tillåtna hjälpmedel: En Pythonbok, skrivmaterial, mat, medicin och vattenflaska. Otillåtna hjälpmedel:

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

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

Ö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

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

Scratch Junior. makeandshape.com. by MIT. Gränssnitt Scratch Junior

Scratch Junior. makeandshape.com. by MIT. Gränssnitt Scratch Junior Scratch Junior by MIT Gränssnitt Scratch Junior 1. Spara 2. Scen 3. Presentationsläge (fullskärm) 4. Rutnät 5. Byt bakgrund 6. Lägg till text 7. Återställ figur (till sin ursprungliga position) 8. Grön

Läs mer

Handbok Kigo. Sascha Peilicke Översättare: Stefan Asserhäll

Handbok Kigo. Sascha Peilicke Översättare: Stefan Asserhäll Sascha Peilicke Översättare: Stefan Asserhäll 2 Innehåll 1 Inledning 6 2 Hur man spelar 7 2.1 Starta ett spel........................................ 7 2.1.1 Ställ in ett nytt spel.................................

Läs mer

Skillnader mellan Python och Java

Skillnader mellan Python och Java Java Utvecklat på SUN Microsystems mitten 1990-talet Ursprungligen för Webprogram Nu mycket spritt Massor med läroböcker Vi använder Lewis&Loftus http://javasuncom/javase/6/docs/api/ Skillnader mellan

Läs mer

Handbok Othello. Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll

Handbok Othello. Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll Clay Pradarits Utvecklare: Mario Weilguni Granskare: Lauri Watts Översättare: Stefan Asserhäll 2 Innehåll 1 Inledning 5 2 Hur man spelar 6 3 Spelets regler, strategi och tips 7 3.1 Spelets grunder.......................................

Läs mer

Tentamen FYTA11 Javaprogrammering

Tentamen FYTA11 Javaprogrammering Lunds universitet FYTA11 Institutionen för Teoretisk fysik HT 11 Tentamen FYTA11 Javaprogrammering Måndag 9:e januari 2012, 10:15 14:15 Instruktioner Hjälpmedel: enkla ritverktyg och Javadoc-genererade

Läs mer

Föreläsning 8 Programmeringsteknik och Matlab DD1312. Klassmetod. Egen modul

Föreläsning 8 Programmeringsteknik och Matlab DD1312. Klassmetod. Egen modul Föreläsning 8 Programmeringsteknik och Matlab DD1312 er, Self Metoderna:, av metoder, Det är en metod som tillhör klassen och inte objektet. class Skylt(object): antal=0 def init (,r):.reklam=r def antal():

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

Trädsökning och datorschack

Trädsökning och datorschack Trädsökning och datorschack Johnny Bigert Nada, KTH johnny@kth.se Datorschack Hobby: schackdatorn Rainman http://www.nada.kth.se/~johnny/chess_comp.html Påbörjad i oktober 2002 Spelar på free internet

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

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander F11 - Rekursion ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Rekursion Rekursion är en programmeringsteknik En metod anropar sig själv public String reverse (String s) { if (s.length()

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

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

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. 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

Programmering grundkurs

Programmering grundkurs Programmering grundkurs Föreläsning 11 Jody Foo, jody.foo@liu.se Föreläsningsöversikt Laboration 6 Abstraktion och OOP Klassdiagram med UML (Unified Modelling Language) Egna klasser som innehåller andra

Läs mer

Tommy Färnqvist, IDA, Linköpings universitet

Tommy Färnqvist, IDA, Linköpings universitet Föreläsning 9 Pekare, länkade noder, länkade listor TDDD86: DALP Utskriftsversion av föreläsning i Datastrukturer, algoritmer och programmeringsparadigm 25 september 2015 Tommy Färnqvist, IDA, Linköpings

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

Ö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

Fyra i rad Javaprojekt inom TDDC32

Fyra i rad Javaprojekt inom TDDC32 Fyra i rad Javaprojekt inom TDDC32 Analys och design-dokument Version 2.0 Datum 2008-05-19 Dokumentnummer 20080303 Sammanfattning Detta är analys och design-dokumentet för programmet Fyra i rad. Fyra i

Läs mer

Programmeringsuppgift Game of Life

Programmeringsuppgift Game of Life CTH/GU STUDIO TMV06a - 0/0 Matematiska vetenskaper Programmeringsuppgift Game of Life Analys och Linär Algebra, del A, K/Kf/Bt Inledning En cellulär automat är en dynamisk metod som beskriver hur komplicerade

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

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006 Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006 Detta lösningsförslag är skrivet i stor hast, så det är möjligt att det innehåller en del slarvfel jag ber i så fall om ursäkt för

Läs mer

Filer. DA2001 (Föreläsning 16) Datalogi 1 Hösten / 19

Filer. DA2001 (Föreläsning 16) Datalogi 1 Hösten / 19 Filer När ett program behöver spara data för senare användning måste dessa data antingen sparas i en databas eller skrivas på en sekundärminnesfil Sådan skrivning på fil är inte mer komplicerad än att

Läs mer

Några saker till och lite om snabbare sortering

Några saker till och lite om snabbare sortering Några saker till och lite om snabbare sortering Generellt om avbrott Generera avbrott Snabb sortering principer Snabb sortering i Scheme och Python QuickSort (dela städat slå ihop) Mergesort (dela slå

Läs mer

ETS052 Internet Routing. Jens A Andersson

ETS052 Internet Routing. Jens A Andersson ETS052 Internet Routing Jens A Andersson Routing Routing-konceptet Unicast Routing Multicast Routing (en kort översikt) Läsanvisning: Kapitel 8 Nätverkslagret /Lager 3 Olika länkprotokoll! Datagram och

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

Introduktion till programmering SMD180. Föreläsning 8: Listor

Introduktion till programmering SMD180. Föreläsning 8: Listor Introduktion till programmering Föreläsning 8: Listor 1 1 Listor = generaliserade strängar Strängar = sekvenser av tecken Listor = sekvenser av vad som helst Exempel: [10, 20, 30, 40] # en lista av heltal

Läs mer

Uppgifter teknik HT17 (uppdaterad v. 40)

Uppgifter teknik HT17 (uppdaterad v. 40) Uppgifter teknik HT17 (uppdaterad v. 40) Uppgifterna bedöms inte, de är bara till för att öva. Samarbeta gärna med andra! Du behöver inte skriva ner svaren, men se till att du förstår lösningarna! 1. Det

Läs mer

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2 Laboration 2 Datastrukturer En liten uppgift Frågor 1 Laboration 2 - Datastrukturer Länkade datastrukturer Stack Kö (En. Queue) Lista

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

Övning 6. Ali Tofigh 24 Oktober, 2006

Övning 6. Ali Tofigh 24 Oktober, 2006 Övning 6 Ali Tofigh 24 Oktober, 2006 1 Sortering Att sortera behöver man göra väldigt ofta i programmering. Python tillhandahåller bland annat en metod i listor för detta ändamål. Det enda metoden behöver

Läs mer

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2 Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket 1 Länkade listor Likadant som i Ada-kursen. 2 Stack MyStack MyStack

Läs mer

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00 1 ( 7) Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00 Tillåtna hjälpmedel: Dator, penna, papper, linjal, suddgummi, godkänd(a) bok/böcker/kompendier (ej anteckningar,

Läs mer

public class Main extends MovieClip { var hillpage:hillpage; var ifpage:ifpage;

public class Main extends MovieClip { var hillpage:hillpage; var ifpage:ifpage; I förra övningen skapade du ett nytt Movie Clip som du döpte till IfPage och bland annat lade ut lite textrutor på. I den här övningen ska vi med hjälp av det du gjorde i förra övningen skapa ett spel

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel 732G11 Linköpings universitet 2011-02-15 1 2 3 4 Extrapass Extrapass håller på att bokas. Blir 3-4 st. och öppet för alla. Mer info på kursmailen när bokningen är klar. i Java En funktion i Java... public

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 Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2012-11-13 Idag Mer om grafer: Topologisk sortering. Kortaste vägen. Bredden först-sökning. Dijkstras algoritm. Floyd-Warshall. Topologisk sortering

Läs mer

Lösningsförslag. 1 Lösningsförslag. Uppgift 1

Lösningsförslag. 1 Lösningsförslag. Uppgift 1 Uppgift 1 Lösningsförslag import java.awt.rectangle; public class ImprovedRectangle extends Rectangle { public ImprovedRectangle(int width, int height) { super(width, height); public ImprovedRectangle(int

Läs mer

Lösningsförslag till tentamen

Lösningsförslag till tentamen Uppgift 1 Lösningsförslag till tentamen 140828 a) public class MyMax { public static void main(string[] args) { //5 ändra String till String[] System.out.println("Maximum is: " + maximum(5, 7)); //2 ändra

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

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass Övningstillfälle 4 Klasser och objekt (s. 221 ff.) Syfte 1: En naturlig fortsättning på koncepten abstraktion och inkapsling! Funktion (återanvändning av skyddad, säker och testad kod) Modul (återanvändning

Läs mer

Sökning. Sökning. Köoperationer. Generell sökalgoritm

Sökning. Sökning. Köoperationer. Generell sökalgoritm Sökning Sökning! Datastrukturer och operationer! Värdering av sökstrategier! Blind sökning! Heuristisk sökning! Constraint satisfaction! Spelförande program Datastruktur: nod = [tillstånd, förälder, operator,

Läs mer

Algoritmer och datastrukturer TDA Fredrik Johansson

Algoritmer och datastrukturer TDA Fredrik Johansson Algoritmer och datastrukturer TDA143 2015-02- 18 Fredrik Johansson Algoritmer Informell beskrivning E" antal steg som beskriver hur en uppgi5 görs. A set of steps that defines how a task is performed.

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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-25 Idag Starkt sammanhängande komponenter Duggaresultat Sökträd Starkt sammanhängande komponenter Uppspännande skog Graf, och en möjlig

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

Grundläggande programmering med C# 7,5 högskolepoäng

Grundläggande programmering med C# 7,5 högskolepoäng Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student)

Läs mer

Referenshanteringsprogrammet

Referenshanteringsprogrammet Referenshanteringsprogrammet Åbo Akademis bibliotek referenshantering@abo.fi RefWorks Med hjälp av RefWorks kan du: Importera referenser från olika databaser och bibliotekskataloger och skapa en egen databas

Läs mer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (

Läs mer

Lösning till tentamen EDAA45 Programmering, grundkurs

Lösning till tentamen EDAA45 Programmering, grundkurs LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap Lösning till tentamen EDAA45 Programmering, grundkurs 2017-08-23, 08:00-13:00 Generella bedömningsriktlinjer Del A: Varje rad kan ge max 2p. Del

Läs mer

Övning 2. (Länkade) Listor, noder

Övning 2. (Länkade) Listor, noder Per Sedholm DD30 (tilda3) 03-09-03 Övning Listor, pekare, binära träd, rekursion, komplexitet (Länkade) Listor, noder. Ta bort andra noden (a) Skriv en sats som tar bort andra noden ur en länkad lista.

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

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsning 2 Programmeringsteknik och C DD1316 Föreläsning 2 Programmeringsteknik och C DD1316 Föreläsning 2 Programmeringsteknik och C Datatyp Aritmetiska operatorer Omvandling av typer Reserverade ord Mikael Djurfeldt Logiska operatorer

Läs mer

729G04 Programmering och diskret matematik. Python 3: Loopar

729G04 Programmering och diskret matematik. Python 3: Loopar 729G04 Programmering och diskret matematik Python 3: Loopar Översikt Labbar Punktnotation och strängmetoder Loopar Labb 3 Labbar? Punktnotation Punktnotation Ni har stött på punktnotation tidigare - kapitel

Läs mer