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

Relevanta dokument
Grundläggande datalogi - Övning 3

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å

Lektion G43 Artificiell intelligens. Robin Keskisärkkä Ellinor Ihs Håkansson Cornelia Böhm

Grundläggande datalogi - Övning 4

Grundläggande datalogi - Övning 2

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Tentamen i Introduktion till programmering

Fredag 10 juni 2016 kl 8 12

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?

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.

Länkade listor, stackar och köer

Ordlistor, filhantering och ut på webben. Linda Mannila

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

Föreläsning 6. Rekursion och backtracking

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

Tenta i Grundläggande programmering DD klockan

Föreläsning 6. Rekursion och backtracking

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.

Grundläggande Datalogi

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

Kan ett datorprogram spela solitär?

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

Föreläsning 7 Datastrukturer (DAT037)

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning Datastrukturer (DAT036)

729G74 IT och programmering, grundkurs. Tema 3. Föreläsning 2 Jody Foo,

Föreläsning 4: Kombinatorisk sökning

Abstrakta datatyper Laboration 2 GruDat, DD1344

Föreläsning 4: Kombinatorisk sökning

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

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

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

Programmering grundkurs

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

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

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

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

Föreläsning 6: Introduktion av listor

Grundläggande databehandling ht 2005

de var svåra att implementera och var väldigt ineffektiva.

Tentamen i Algoritmer & Datastrukturer i Java

Optimering Kruskal s algoritm Prim-Jarník s algoritm

Föreläsning Datastrukturer (DAT036)

TDDE44 Programmering, grundkurs

Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Föreläsning Datastrukturer (DAT037)

729G04 Programmering och diskret matematik TEN kl 8-12

Lek$on 3: Kunskapsrepresenta$on. Robin Keskisärkkä

Föreläsning 2 Programmeringsteknik och C DD1316

Datastrukturer. föreläsning 8. Lecture 6 1

Föreläsning 9 Datastrukturer (DAT037)

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Artificial Intelligence

Övning 1 - Abstrakta datatyper

DD1314 Programmeringsteknik

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

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

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

Laboration: Whitebox- och blackboxtesting

Erfarenheter från labben

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

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

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

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

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

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

Föreläsning 7. Träd och binära sökträd

Tentamen, EDA501 Programmering M L TM W K V

729G04 Programmering och diskret matematik

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

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

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

Föreläsning 8 Datastrukturer (DAT037)

Pythons standardbibliotek

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

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Föreläsning Datastrukturer (DAT036)

Trädstrukturer och grafer

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Föreläsning Datastrukturer (DAT036)

Tentamen TEN1 HI

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

Föreläsning 8 Datastrukturer (DAT037)

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

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

JAVAUTVECKLING LEKTION 4

Klasser och objekt, referenser Grundkurs i programmering med Python

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

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

Extra lab. Nu på fredag kl 8-12 Frivillig Enbart hjälp med projektuppgiften Ingen examination

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

Föreläsning Datastrukturer (DAT037)

Programmering för språkteknologer II, HT2011. Rum

DD1321, Tentamen i tillämpad programmering och datalogi Lördagen den 18 dexember 2010 kl 13 18

Hur man programmerar. Exempel på problemlösning i Python

Transkript:

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

Laboration 2 Del 1 Uppdatera agentens State för att kunna representera agentens och omgivningens tillstånd i en fullt observerbar värld Generera nya tillstånd baserat på handlingar Del 2 Implementera en bredden-först sökning Diskussion VG-uppgift Implementera en heuristik (A* sökning)

Kartan Dictionary med koordinater (x, y) som nycklar Pacman börjar på (1,1) med riktning öst (1,0) Möjliga värden är w (vägg) och * (mat) Varning: Tomma koordinater finns inte med i kartan!

Position Position API:t kan användas för att arbeta med riktningar och koordinatförflyttningar Returnerar den koordinat som skulle bli resultatet av en viss handling Varning: Kan returnera otillåtna positioner! Tips: Kör help(position) i ett skalfönster/shell

Live kodning

Problem: Tower of Hanoi Flytta alla brickor från pinne A till pinne C. Endast en bricka får flyttas i taget och en större bricka får aldrig placeras på en mindre. Bilder hämtade ifrån: http://www.mclelun.com/blog/2011/07/tower-of-hanoi-flash-game-fla-source/

Hur formaliserar vi problemet? 1. Hur representerar vi tillstånd i världen? 2. Hur vet vi när vi har nått målet? 3. Vilka drag är tillåtna?

Hur representerar vi tillstånd i världen? Vad behöver representeras? Pinnar Brickor Utförda drag Hur ska vi representera tillstånden? Klasser, listor, tuplar, dictionaries, strängar?

Hur representerar vi tillstånd i världen? node = { roda : [3, 2, 1], rodb : [], rodc : [], moves : []} # (rod A, rod B, rod C, moves) node = ([3, 2, 1], [], [], []) class Node: def init (self, roda, rodb, rodc, moves): self.roda = roda self.rodb = rodb self.rodc = rodc self.moves = moves

Hur vet vi att vi har nått målet? Olika formuleringar När alla brickor på pinne A har flyttats till pinne C När alla brickor ligger på pinne C (eller när inga brickor finns på pinne A eller B) När pinne C ser ut som pinne A gjorde från början

Hur vet vi när vi har nått målet? Olika formuleringar När alla brickor på pinne A har flyttats till pinne C När alla brickor ligger på pinne C (eller när inga brickor finns på pinne A eller B) När pinne C ser ut som pinne A gjorde från början def goal_test(node): if node[ roda ] == [] and node[ rodb ] == []: return True else: return False

Hur vet vi när vi har nått måltillståndet? Måltillståndet har uppnåtts när inga brickor finns på vare sig pinne A och B. def goal_test(node): if node[ roda ] == [] and node[ rodb ] == []: return True else: return False

Hur vet vi när vi har nått måltillståndet? Måltillståndet har uppnåts när alla brickor på pinne A i startnoden har flyttats till pinne C. def goal_test(node): return node[ rodc ] == [3,2,1] eller mer generellt: def goal_test(node): return node[ rodc ] == start_node[ roda ]

Vilka handlingar är tillåtna? Den översta brickan får förflyttas från en pinne till en annan om den senare är tom eller har en större bricka högst upp. def movefromto(node, x, y): if node[x] == []: return None # om ingen bricka if node[y] == [] or node[x][-1] < node[y][-1]: brick = node[x].pop(-1) node[y].append(brick) node[ actions ].append(x + to + y) return node return None

Vilka handlingar är tillåtna? (forts) Nu kan vi beskriva alla möjliga förflyttningar. Expand returnerar en lista med alla tillstånd som vi kan nå från nuvarande tillstånd. def expand(node): nodes= [] for x in [ roda, rodb, rodc ]: for y in [ roda, rodb, rodc ]: if x == y: continue # hoppa över onödig förflyttning new_node = movefromto(copy.deepcopy(node), x, y) if new_node!= None: nodes.append(new_node) return nodes Kopiera noden!

Sökningsloopen En bredden först sökning består av att gå igenom alla möjliga noder ett djup i taget tills vi har hittat en lösning. Vi lägger alla noder i en kö, om ingen lösning hittats expanderar nuvarande nod och lägger till de nya noderna sist i kön. frontier = [start_node] # kö while len(frontier) > 0: node = frontier.pop(0) # ta noden som ligger först i kön if goal_test(node): print( Lösning hittad:, node[ actions ]) break else: frontier.extend(expand(node))

Möjliga förbättringar Loopkontroll Många tillstånd upprepas flera gånger Heuristik Sortera kölistan efter störst potential

Enkel loopkontroll Spara alla expanderade noder i en lista Om den aktuella noden redan expanderats så explored = [] frontier = [start_node] # kö while len(frontier) > 0: node = frontier.pop(0) # ta noden som ligger först i kön if node in explored: continue if goal_test(node): print( Lösning hittad:, node[ actions ]) break frontier.extend(expand(node)) expanded.append(node) # vad bestämmer om två noder är likadana?

www.liu.se