Obligatorisk oppgave 2 i INF 4130, høsten 2009

Like dokumenter
Obligatorisk oppgave 1 i INF 4130, høsten 2008

Obligatorisk oppgave 1 i INF 4130, høsten 2009

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Prioritetskøer. Prioritetskøer. Binære heaper (vanligst) Prioritetskøer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

IN Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Binær heap. En heap er et komplett binært tre:

INF2220: Time 4 - Heap, Huffmann

Obligatorisk oppgave 1 INF1020 h2005

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Notater til INF2220 Eksamen

Definisjon: Et sortert tre

Høgskolen i Gjøvik. Avdeling for elektro- og allmennfag K O N T I N U A S J O N S E K S A M E N. EKSAMENSDATO: 11. august 1995 TID:

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

UNIVERSITETET I OSLO

INF Innleveringsoppgave 6

INF Obligatorisk innlevering 7

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Definisjon av binært søketre

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

Notat for oblig 2, INF3/4130 h07

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

København 20 Stockholm

Hvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?)

Drosjesentralen. I-120: Obligatorisk oppgave 2, 2000

Hjemmeeksamen 1 i INF3110/4110

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Litt om Javas class-filer og byte-kode

Eksamen IN1010/INF1010 våren 2018

Brukermanual for TrackGrabber

N-dronningproblemet Obligatorisk oppgave 1 I120, H-2000

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Obligatorisk oppgave nr. 3 (av 4) i INF1000, våren 2006

MAT1030 Diskret matematikk

UNIVERSITETET I OSLO

Stack. En enkel, lineær datastruktur

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

EKSAMENSOPPGAVE. INF-1101 Datastrukturer og algoritmer. Adm.bygget, rom K1.04 og B154 Ingen

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 10

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Oppgave 1. Sekvenser (20%)

IN1000 Obligatorisk innlevering 7

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF oktober Dagens tema: Uavgjørbarhet. Neste uke: NP-kompletthet

INF3/4130 PRØVE-EKSAMEN MED SVARFORSLAG Gjennomgås 1/ , (lille aud.)

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

Kap 9 Tre Sist oppdatert 15.03

INF2220: Forelesning 2

MAT-INF 1100: Obligatorisk oppgave 1

Algoritmer og Datastrukturer IAI 21899

Turingmaskiner en kortfattet introduksjon. Christian F Heide

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

UNIVERSITETET I OSLO

Prøveeksamen IN1000. IN Prøveeksamen. Dato november 2017 Tid 12:30-12:00 Alle trykte og skrevne hjelpemidler er tillatt.

Datastrukturer for rask søking

Matchinger i ikke-bipartite grafer

INF Obligatorisk innlevering 5

UNIVERSITETET I OSLO

Obligatorisk oppgave 2 - inf

PG4200 Algoritmer og datastrukturer Forelesning 7

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

IN1010 V18, Obligatorisk oppgave 5

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Backtracking som løsningsmetode

Innlevering 2a i INF2810, vår 2017

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

TDT4110 IT Grunnkurs Høst 2014

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

Oppgaver til kodegenerering etc. INF-5110, 16. mai, 2014

Svarforslag til ukeoppgaver til INF 4130

EKSAMENSOPPGAVE. NB! Det er ikke tillatt å levere inn kladd sammen med besvarelsen

Løsnings forslag i java In115, Våren 1996

UNIVERSITETET I OSLO

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

Algoritmer og Datastrukturer

Transkript:

Obligatorisk oppgave 2 i INF 410, høsten 2009 Leveringsfrist 2. oktober Generelt for alle oppgavene Samme reglement gjelder som for obligatorisk oppgave 1. Det kan komme presiseringer og forandringer i oppgaveteksten underveis, så følg med på beskjeder. Husk at det ikke bare er programkode som skal leveres! Det er like viktig å svare skikkelig på drøftingsspørsmål som å levere god kode. Vi legger opp til at programmene deres vil testes automatisk mot en rekke datasett når de mottas. Det er derfor viktig at output-formatet er identisk (tegn for tegn, også blanke) med formatet som er gitt i eksempelet på hver oppgave. Vi anbefaler derfor sterkt at en sjekker svaret programmet lager nøye med testdataene som følger med hver oppgave. Spør gjerne gruppelærer dersom en er usikker på dette. Det er lagt ut en side med ytterligere leveringsanvisning for obliger. Den ligger under Oppgaver på kurssiden. Det blir typisk utvidet etter hvert, så følg med! Det skal her i oblig 2 leveres to programmer (ett i oppgave 1 og ett i oppgave 2) og disse skal ha navn nøyaktig Oppgave1 og Oppgave2 (på den måten det blir mest naturlig innenfor språket en bruker, for eksempel skal klassen med main( )-metoden hete OppgaveX i Java og skriptfila skal hete OppgaveX.py i Python). Alle programmer skal ta input-fil som sin første parameter og output-fil som sin andre parameter. Under vil vi bare referere til input og output, da er det disse vi mener. Regler for programmeringsspråk er som på forrige oblig. De som fikk godkjent et annet språk for oblig 1 kan bruke dette på denne obligen også. Se oppgave 1 i oblig 1 angående tips til I/O-håndtering i Java. Oppgave 1 (Venstrevridde og korte heaper) Venstrevridde heaper (leftist heaps) holder orden på nullsti-lengder (null path lengths) og snur om på barnenoder hvis nullsti-lengden i høyre barn av en node er større enn nullsti-lengden i venstre barn. Dette for å sikre at den høyre stien i trærne våre forblir nogenlunde kort, slik at merging av heaper (og andre operasjoner implementert via merge) går raskt. Vi skal i oppgavene 1a, 1b og 1c tenke ut fra venstrevridde heaper med tradisjonell implementasjon, men i oppgave 1d skal vi lage en vri på implementasjonen. a) Tegn treet vi får ved å sette inn følgende elementer i en vanlig, tom venstrevridd heap: 5,, 4, 1, 2 (altså en hvor vi snur om på barna på vanlig måte). Tegn også opp alle mellomstadiene. Som vanlig betyr lav key høy prioritet. Vi tar 1

altså utgangspunkt i implementasjonen til Mark Allen Weiss som ligger på kurssiden: www.uio.no/studier/emner/matnat/ifi/inf410/h09/obliger/kildekode.xml b) Finnes det en rekkefølge (m.h.t. prioritet) slik at om vi setter elementer inn i denne rekkefølge i en vanlig, tom venstrevridd heap (uten å ta noen ut), så vil vi med jevne mellomrom (når antall elementer er 2 n 1) få et fullt balansert tre? Forklar. c) Finnes det en (annen) rekkefølge som, igjen for en vanlig en venstrevridd heap, gir oss en lang (venstre)sti uten forgreininger? Forklar hvorfor dette er en heldig situasjon for venstrevridde heaper. d) Når vi skal implementere venstrevridde heaper er det imidlertid ikke nødvendig å bytte om på barna, så lenge vi husker hvilket av dem som har kortest nullsti-lengde. (Man kan tenke seg situasjoner hvor man ikke ønsker å vri på trærne, men vil beholde strukturen slik den var.) Implementér en variant av venstrevridde heaper (vi nøyer oss med merge( ), insert( ) og deletemin( )) som ikke baserer seg på å rotere subtrær, men som isteden, på passelig måte, husker hvilket barn som har kortest nullsti-lengde. For entydighetens skyld tenker vi oss at et ikke-eksisterende barn har nullsti-lengde lik 1 (minus en), og at vi velger det venstre barnet dersom venstre og høyre barn har lik nullsti-lengde. Implementasjonen til Mark Allen Weiss kan passelig brukes som utgangspunkt. Input Programmet i 1d skal lese input fra en angitt fil, denne angis til programmet ved oppstart, sammen med navnet for output-fil. Filen inneholder to linjer med tall som skal settes inn i to heaper (alt heltall, med blanke mellom), som så skal merges. Output Treet en slik merging resulterer i skal skrives ut på infix form, deretter skal det kommet en bindestrek, så skal stien som fremkommer ved å starte i roten og hele tiden å gå til barnet med lavest nullsti-lengde skrives ut. Eksempel-input 1 Eksempel-output 1 2 1 2 1-1 2 Eksempel-input 2 Eksempel-output 2 2 1 2 1 4 5-1 2 4 5 Figur 1 viser hvordan heapene i eksempel 2 over merges. Et lite sett med testdata ligger på kurssidene (filene Obl2-Opg1-Test[1-].txt ). 2

1 1 2 + 4 5 2 4 5 Figur 1: To heaper h 1 og h 2 merges til h. De korte stiene som fremkommer ved å hele tiden gå til barnet med lavest nullsti-lengde er markert med heltrukne fete piler. Stien vi merget langs (de to korte stiene fra h 1 og h 2 spleiset sammen) er i h stiplet. Oppgave 2 (A*-søk) Oppgaven er å skrive et program for løsing av 15-spillet, som også kommer som 8-spillet og generelt (N N 1)-spillet (på et N N-brett). Dette er diskutert i læreboka som 8-puzzle game på side 717. Programmet skal lages generelt for N N-brett (men du kan i implementasjonen forutsette at N 10). En tilstand for spillet med N = kan vises slik: 1 2 0 4 5 7 8 6 Her angir 0 det tomme feltet. Programmet skal da finne frem til en måte å flytte brikkene (et antall trekk ) slik at man kommer til måltilstanden: 1 2 4 5 6 7 8 0 (og tilsvarende for N N-brett). Et lovlig trekk er å la den tomme posisjonen (0-en) bytte posisjon med en av de (maksimalt 4) nabobrikkene. Et slikt trekk angis med hvordan den tomme posisjonen flytter seg, med V, H, O, N (for Venstre, Høyre, Opp og Ned). En løsning på problemet over er derved: HHN, og denne skal skrives ut på skjermen om programmet finner en løsning. Merk at løsningen man finner skal være optimal, i den forstand at det ikke finnes noen løsning som har færre trekk. Programmet skal bruke A*-søking, og kan passelig bruke en rett fram Manhattanheuristikk (se oppgave 2.7). Programmet bør kunne løse alle 8-spill-problemer på rimelig tid, og noe mer vil ikke bli forlangt. Det er jo imidlertid morsomt å se om det også kan løse enklere 15-spillproblemer (slike som kan løses i få trekk), og det er morsomt om dere legger ved i leveringa en kommentar om hva programmet klarer, og på hvilken tid. Input Programmet i skal lese input fra en angitt fil, denne angis til programmet ved oppstart, sammen med navnet for output-fil. Første linje av input-fila skal inneholde verdien av N, og startilstanden er så angitt på N linjer.

Output Første linje i output-fila skal være antall trekk løsningen er på, denne verdien er entydig bestemt for hver oppgave. Andre linje skal være en sekvens av O, N, V og H, som angir løsningen slik som angitt over (på noen oppgaver er det flere mulige svar her). Tredje til femte linje skal angi hvor mange tilstander en måtte innom etc. (disse verdiene er ikke entydig bestemt og vil variere bl.a. avhengig av heuristikk). Nærmere bestemt skal de angi henholdsvis: - Antall tilstander en besøkte, inklusive starttilstanden og sluttilstanden (altså omtrent antall kall til extractmin i prioritetskøen, litt avhengig av implementasjonen). - Antall ganger det skjer at en oppdager en ny tilstand (= antall insert i prioritetskøen av en tilstand som ikke ligger i køen fra før). - Antall ganger en modifiserer kosten til en allerede oppdaget (men ikke besøkt) tilstand (= antall decreasekey/re-insert i prioritetskøen). Eksempel-input 1 2 0 4 5 7 8 6 Eksempel-output HHN 4 8 0 Implementasjonstips Hver tilstand må representeres på en eller annen måte. Det enkleste er å bruke objekter av en egen klasse State med en byte[]-array, og gjør gjerne det (det går fint siden N 10). Det finnes også mer plassbesparende representasjoner, f.eks. som ett eller flere lange tall, eller ved å la hver byte representere to posisjoner på brettet. Men disse vil jo bruke mer tid. A*-søk krever en del spesialiserte datastrukturer, og en trenger i alle fall en prioritetskø til å lagre køen, og en effektiv oppslagsstruktur (hashmap, søketre, el.l.) til å lagre allerede besøkte noder. Du kan her bruke en passende innebygd struktur eller et valgfritt open source-bibliotek. Se http://www.uio.no/studier/emner/matnat/ifi/inf410/h09/faq.html for flere tips til hvordan oppgaven kan implementeres. Oppgave (Algoritmer og avgjørbarhet) NB: Stoffet til denne oppgaven vil bli gjennomgått 8/10. Merk at det kan komme presiseringer og ekstrainformasjon til oppgaven (som eventuelt blir annonsert med en beskjed). Følg med! 4

Du skal her avgjøre om følgende problemer er avgjørbare eller ikke. Et skritt i programutføringen er en passelig basal enhet som klart kan utføres på endelig tid. Det kan f.eks. være det å hente en operand, det å utføre en aritmetisk eller logisk operasjon, eller å utføre et assignment, og skrittet må være slik definert at input eller output av ett tegn regnes som ett skritt. Et skritt her skal grovt sett tilsvare et steg for en Turing-maskin. For å løse oppgavene under må du altså enten vise at om det aktuelle problemet kunne løses så kan også stoppeproblemet løses (som jo er en motsigelse, slik at problemet er uavgjørbart), eller du må komme opp med en algoritme som løser det. a) Instans: Gitt et program Spørsmål: Vil dette programmet, for ethvert input, alltid skriver ut tegnet A? b) Instans: Gitt et program Spørsmål: Vil dette programmet skrive ut en A for input abc? c) Instans: Gitt et program Spørsmål: Vil dette programmet, for ethvert input, alltid skrive ut en A etter mindre enn 50 skritt? Leveringsanvisning Det skal kun leveres kildekode og ett enkelt PDF-dokument som besvarelse. Kommentarer til besvarelsen som du ønsker å gi kan du legge på starten av PDFdokumentet. Dersom du er klar over en svakhet i algoritmen som slår ut på et spesifikt tilfelle kan du også (hvis du vil, dvs. ønsker tilbakemelding om hvor feilen ligger) legge ved et datasett som demonstrerer dette og henvise til det i besvarelsen. Merk: Koden du leverer skal kunne kjøre på de vanlige Ifi-maskinene. Legg kildekoden (så mange filer du vil, men ikke spre koden over flere mapper) og et dokument kalt oblig1.pdf i en mappe kalt: oblig2_<ditt brukernavn>. Pakk mappa i en tar.gz-fil eller zip-fil med samme navn. For eksempel tar cvzf oblig1_kjetimh.tar.gz oblig2_kjetimh Send fila til: inf410-1@ifi.uio.no. Dersom du ønsker kan du eventuelt legge ved et plain text-dokument i stedet for PDF, kalt oblig1.txt (men det kan jo konverteres med f.eks. kommandoen a2ps eller a2pdf). [slutt] 5