N-dronningproblemet Obligatorisk oppgave 1 I120, H-2000



Like dokumenter
Drosjesentralen. I-120: Obligatorisk oppgave 2, 2000

Backtracking som løsningsmetode

Backtracking som løsningsmetode

En algoritme for permutasjonsgenerering

UNIVERSITETET I OSLO

Grunnleggende Grafalgoritmer II

PG 4200 Algoritmer og datastrukturer Innlevering 2

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

TDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting

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

TDT4110 IT Grunnkurs Høst 2014

Fig1. Den konvekse innhyllinga av 100 tilfeldige punkter i planet (de samme som nyttes i oppgaven.)

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

OPPGAVER for IMT Algoritmiske metoder Høsten 2015 Høgskolen i Gjøvik

Matriser En matrise er en rektangulær oppstilling av tall og betegnes med en stor bokstav, f.eks. A, B, C,.. Eksempler:

PG 4200 Algoritmer og datastrukturer Innlevering 1. Frist: 2.februar kl 21.00

Obligatorisk oppgave 2 i INF 4130, høsten 2009

IN1010 V18, Obligatorisk oppgave 5

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

SIF8010 ALGORITMER OG DATASTRUKTURER

MAT1030 Diskret Matematikk

Obligatorisk oppgave 5: Labyrint

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Algoritmer og Datastrukturer

Matriser En matrise er en rektangulær oppstilling av tall og betegnes med en stor bokstav, f.eks. A, B, C,.. Eksempler:

Antall sider:5 (Inkludert denne) Alle skrevne og trykte hjelpemidler samt kalkulator

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

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

Matriser En matrise er en rektangulær oppstilling av tall og betegnes med en stor bokstav, f.eks. A, B, C,.. Eksempler:

UNIVERSITETET I OSLO

TDT4100 Objektorientert programmering

Algoritmer og Datastrukturer

MAT1030 Forelesning 25

EKSAMEN med løsningsforslag

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

IN1000 Obligatorisk innlevering 7

MAT1030 Diskret Matematikk

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

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

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

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

A 1 B 1 D 1 H 1 H 2 D 2 B 2 E 1 E 2 I 1 I 2...

Obligatorisk oppgave 1 i INF 4130, høsten 2008

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

MAT-INF 1100: Obligatorisk oppgave 1

Obligatorisk oppgave 1 i INF 4130, høsten 2009

Forelesning 30. Kompleksitetsteori. Dag Normann mai Informasjon. Oppsummering

MAT1030 Diskret matematikk

INF1010. Sekvensgenerering Alle mulige sekvenser av lengde tre av tallene 0, 1 og 2: Sekvensgenerering. Generalisering. n n n! INF1010 INF1010 INF1010

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

G høgskolen i oslo. Emnekode:!;_unstiq intelliqens lv 145A Gruppe(r) : Dato: Tillatte

MAT1030 Diskret matematikk

Rekursjon. Hanois tårn. Milepeler for å løse problemet

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

INF100/INF100-F - INNLEVERING 2 HØSTEN 2005

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

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

LIGHTNING ET PROGRAM FOR SKJERMFORSTØRRING BRUKERVEILEDNING. Bojo as Akersbakken 12, N-0172 Oslo Utgave 1206 Bojo as 2006

Oppgaver uke 1: Løsningsforslag

Rekursiv programmering

Øving 0 - Xcode TDT4102

Norsk informatikkolympiade runde

Løsningsforslag til 3. oblogatoriske oppgave i Diskret Matematikk. Høsten 2018

UNIVERSITETET I OSLO

MAT-INF 1100: Obligatorisk oppgave 1

MAT1030 Forelesning 28

LØSNINGSFORSLAG EKSAMEN VÅR07, MA0301

EKSAMEN. Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Administrering av SafariSøk

Oppgave 1. Sekvenser (20%)

4. Dynamisk skjemaer (GUI)

Rekursjon. Binærsøk. Hanois tårn.

INF2220: Forelesning 2

København 20 Stockholm

MAT-INF 1100: Obligatorisk oppgave 1

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

og Java

INF2220: Gruppe me 2. Mathias Lohne Høsten 2017

Emne 9. Egenverdier og egenvektorer

Grunnleggende Grafalgoritmer

Obligatorisk oppgave 1 INF1020 h2005

Husk å registrer deg på emnets hjemmeside!

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

TDT4102 Prosedyreog objektorientert programmering Vår 2016

E K S A M E N. EKSAMENSDATO: 15. desember 1994 TID: Kladd og oppgavearkene leveres sammen med besvarelsen. Kladd merkes med "KLADD".

King Kong Erfaren Scratch PDF

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Sprettball Erfaren ComputerCraft PDF

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Oppgave: BOW Bowling. Regler for Bowling. norwegian. BOI 2015, dag 1. Tilgjengelig minne: 256 MB

ITF20006 Algoritmer og datastrukturer Oppgavesett 7

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Office Kort oversikt over de viktigste nyhetene

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Argumenter fra kommandolinjen

Transkript:

N-dronningproblemet Obligatorisk oppgave 1 I120, H-2000 Innleveringsfrist : Mandag, 2. Oktober, kl.10:00 Besvarelsen legges i arkivskapet på UA i skuff merket I120 Innhold: utskrift av godt dokumentert (Javadoc) programkode (bruk c2ps ved utskrift). Utskrift av javadoc er ikke nødvendig utskrift fra kjøring av løsninger med n = 7 og n = 8 (bruk script) navnet på programmer og katalogen hvor de ligger (programmene skal kunne eksekveres av andre; bruk chmod a+x programnavn.*) Problemet er beskrevet i seksjon 1 under. Du skal skrive og levere inn 3 programmer som løser dette problemet, og disse er beskrevet i hhv seksjon 2.1, 2.2 og 2.3. Det første programmet er et rett-fram naivt løsningsforslag. Etter at denne er implementert skal den forbedres ved å konstruere passende avskjæringsmekanismer for å effektivisere programmet. Tilslutt skal denne løsningen videre forbedres ved å utelukke like løsninger. Alle programmene skal bruke rekursjon, med passende avskjæringer for effektivisering. I seksjon 2.5 og 2.6 beskriver vi to frivillige deler, hhv en real-time tidskonkurranse, og en mulig visualisering av problemet vha GUI.GridMatrix. 1 Problembeskrivelse Målet med n-dronningproblemet er å plassere n dronninger på et n-dimensjonalt sjakkbrett (en n n-matrise) slik at ingen dronning kan angripe en annen. En dronning kan angripe en annen dersom de står på samme horisontale, vertikale eller diagonale linje. 1.1 Tips 1.1.1 Representasjon av sjakkbrettet Den naive representasjonen av et sjakkbrett med dronninger på er en to-dimensjonal tabell. Men siden vi vet at i en løsning kan ingen dronninger stå i samme rad eller samme kolonne, kan vi bruke en smartere representasjon. Vi vet at det må være en, og bare en, dronning i hver rad (og hver kolonne). En stilling (av n dronninger) på brettet kan da representeres ved n verdier som sier hvilken kolonne dronningene i 1

de n radene befinner seg. Vi kan presentere disse n verdiene som en liste. 0 1 2 3 0 1 2 3 Sjakkbrettet over kan representeres som listen: 1.1.2 Permutasjoner [0, 3, 1, 2] Gitt en liste med n tall [0, 1...n 1], er en permutasjon en ny liste med de samme tallene i en vilkårlig rekkefølge. F.eks., er p 1 = [0, 3, 1, 2] og p 2 = [2, 1, 3, 0] to permutasjoner av listen [0, 1, 2, 3]. Alle listene vi er interessert i er blant de som er permutasjoner av [0, 1...n 1]; vi er f.eks. ikke interessert i lister som inneholder det samme tallet to ganger. Hvis vi kun ser på slike permutasjoner, sikrer vi at ingen dronninger kan angripe hverandre horisontalt eller vertikalt. I tillegg, for at en permutasjon skal være en løsning, må vi sjekke at ingen dronninger står på samme diagonal. På tegningen over står dronningene 2 og 3 på samme diagonalen og dermed er ikke permutasjonen [0, 3, 1, 2] en løsning. I flere av oppgavene i seksjon 2 er det nødvending å ha kontroll med hvilken rekkefølge man konstruerer permutasjoner. En måte å gjøre dette på er illustrert på figur 1.1.2(for n = 4). Løvnodene i dette treet er alle mulige permutasjoner av [1, 2, 3, 4]. De interne nodene er ufullstendige permutasjoner; lister der bare noen elementer er fiksert. På det øverste nivået i treet (rotnoden) er ingen elementer fiksert, på det neste er ett element fiksert, o.s.v. En slik metode som er illustrert her resulterer i en total ordning av permutasjoner, gitt ved å gjennomgå løvene fra venstre mot høyre. Den konkrete metoden som er brukt her gir en leksikografisk ordning der den første posisjonen (fra venstre) som inneholder forskjellige tall i to permutasjoner, avgjør hvilken som er minst. F.eks. for p 1 = [0, 2, 4, 1, 3] og p 2 = [0, 2, 1, 3, 4] er det tredje elementet det første som skiller disse og, siden 4 > 1, har vi at p 2 er mindre enn p 1. 1.1.3 Diagonalt angrep Merk at en dronning som står på rad r 1 og kolonne k i kan angripe diagonalt en annen dronning på rad r j og kolonne k j hvis og bare hvis k i r i = k j r j (parallel til hoveddiagonalen) k i + r i = k j + r j (parallel til bi-diagonalen) 2 Oppgaver 2.1 En naiv løsning En naiv løsning på n-dronning problemet er å lage en algoritme som 1. genererer alle mulige stillinger 2. og så sjekker om en gitt stilling er en løsning Dette kan gjøres ved følgende program: 1. input til programmet: n 2

[,,, ] [0,,, ] [1,,, ] [2,,, ] [3,,, ] [0, 1,, ] [1, 0,, ] [1, 2,, ] [1, 3,, ] [3, 2,, ] [1, 2, 0, ] [1, 2, 3, ] [0, 1, 2, 3] [0, 1, 3, 2] [1, 2, 0, 3] [1, 2, 3, 0] [3, 2, 1, 0] Figur 1: Permutasjons-tre. I en liste angir at elementet i listen ennå ikke er bestemt. 3

2. generer alle mulige permutasjonene av tallene 0, 1...n 1, og 3. for hver permutasjon sjekk om noen dronninger står på den samme diagonalen 4. output av programmet: alle mulige løsninger. Implementer denne algoritmen. Du vil raskt se at denne løsningen er uakseptabel allerede for små verdier av n vil det ta meget lang tid. (Hva er kompleksiteten til denne algoritmen?) 2.2 Avskjæring Skal man løse dette problemet effektivt, må man i tillegg komme opp med en del avkjæringsmekanismer for å redusere søkerommet. Den første algoritmen du laget er ineffektiv fordi det veldig ofte er unødvendig å generere hele permutasjonen for å avgjøre at den ikke er en løsning. Har vi f.eks. en permutasjon som starter [0, x, 2...], så vet vi at uansett hva... inneholder, blir det ikke noen løsning siden allerede den 0-te og den 2-dre dronning kan angripe hverandre. Istedenfor å generere hele permutasjonen før den sjekkes, kan man sjekke den mens den genereres. Du skal lage et program som oppfyller følgende: 1. input til programmet: n 2. generer permutasjoner av 0, 1...n 1 rekursivt 3. utfør passende sjekk slik at rekursjonen stopper (og dermed avskjærer rekursjonstreet) når det oppdages at permutasjonen som er iferd med å bygges opp ikke kan lede til en løsning (som i eksempelet over). 4. output av programmet: alle mulige løsninger Programmet skal være rekursivt, og det skal være vesentlig raskere enn den naive løsningen fra 2.1! 2.3 Speiling og rotering Tenk deg at du har funnet en løsning. Da kan du finne en ny løsning ved å rotere brettet 90. Den nye løsningen er ikke vesensforskjellig fra den opprinnelige fordi brikkenes plassering i forhold til hverandre er uendret. Likevel er det en ny løsning i den forstand at brettet representeres ved ulike permutasjoner. Et eksempel viser dette: 0 1 2 3 4 [0, 2, 4, 1, 3] 90 = [4, 1, 3, 0, 2] 0 1 2 3 4 Tilsvarende kan du generere nye løsninger ved å rotere 180 og 270, samt ved å speile (vende) brettet langs horisontal-aksen, vertikal-aksen, eller en av diagonalene: rotasjon 90, 180, 270 speiling horisontalt speiling vertikalt speiling hoveddiag. speiling bi-diag. 4

Følgende tabell viser, for n = 4, 5...10 antall forskjellige løsninger (#tot) som skulle finnes i oppgave 2.1, samt antall vesentlig forskjellige løsninger (#ulik) der ingen kan oppnåes ved rotering eller speiling fra en annen: n #tot #ulik 4 2 1 5 10 2 6 4 1 7 40 6 8 92 12 9 352 46 10 724 92 Du skal nå videreutvikle programmet ved å utelukke uvesentlige løsninger. Med andre ord: hver gang programmet genererer en fullstendig løsning, skal det sjekke at denne ikke kan fåes ved noen av avbildningene fra en løsning som allerede ble tatt med (og skrevet ut). 1 Dette kan, f.eks. gjøres ved å 1. passe på at permutasjoner genereres i en bestemt total ordning 2. for hver løsning l og for hver avbildning rs, konstruer permutasjonen, som vi kaller rs(l), som ville gitt permutasjonen l under avbildningen rs. Eksempel: La l = p 2 = [4, 1, 3, 0, 2] og la rs være 90 -rotasjon. Vi skal finne en permutasjon p 1 som ville gi p 2 om vi roterte p 1 med 90. Da må vi se hva vi får om vi roterer p 2 med 90. Svaret p 1 = rs 90 (p 2 ) kan dermed beregnes som følger: for alle k = 0, 1...n 1 : p 1 [n 1 p 2 [k]] = k ; der p[x] angir elementet på plass x i listen p. Svaret blir p 1 = [0, 2, 4, 1, 3]. Dette tilsvarer brettene i figuren gitt i begynnelsen av denne seksjonen. Du skal finne tilsvarende definisjoner for alle avbildningene 3. sjekk, for alle rs, om rs(l) er mindre enn l i så fall har en tilsvarende løsning alt blitt skrevet ut og l skal ikke være med i løsningsmengden. (I eksemplet over fant vi en p 1 som var mindre enn p 2, siden p 1 [0] = 0 < 4 = p 2 [0], (dersom permutasjoner genereres i den leksikografiske ordningen) og p 2 er dermed ikke med i den reduserte løsningsmengden.) 2 Følger du denne oppskriften, får du, for n = 8, løsningene generert i følgende rekkefølge: 1 : [0, 4, 7, 5, 2, 6, 1, 3] 2 : [0, 5, 7, 2, 6, 3, 1, 4] 3 : [1, 3, 5, 7, 2, 0, 6, 4] 4 : [1, 4, 6, 0, 2, 7, 5, 3] 5 : [1, 4, 6, 3, 0, 7, 5, 2] 6 : [1, 5, 0, 6, 3, 7, 2, 4]... : osv. 2.4 Følgende skal innleveres NB: Du skal skrive 3 programmer, slik de er beskrevet i seksjonene 2.1, 2.2 og 2.3, og innlevere disse slik det er beskrevet øverst på første side. 1 Faktisk kan dette forbedres da noen av avbildningene kan avskjæres før en fullstendig løsning foreligger. 2 Faktisk kan man forbedre denne biten også i.o.m. at, som eksempelet viser, kan noen løsninger som p 2 forkastes uten å konstruere hele forbildet p 1 = rs 90 (p 2 ). 5

2.5 Frivillig: Real-Time Tidskonkurranse Kjøretiden til dine program på f.eks. n = 13 kan måles som følger: Gitt at programmet ditt heter queen, kjør Unix kommando > /bin/time java queen 13. I tillegg til queen 13 sin output, får du da en liste med 3 tidsangivelser: real..., user... og sys... Det er den andre, user-tid som vi skal se på her. Denne tiden skal i prinsippet være uavhengig av maskinbelastning osv. Den kan dog variere litt fra kjøring til kjøring, som dere selv vil oppdage. På hjemmesiden til kurset vil vi kontinuerlig legge ut beste kjøretiden oppnådd av en av dere, for input n = 13, på våre maskiner, dvs ikke hjemmemaskin. Output tar mye tid, så vi gjør tidsmålingen på følgende program med minimal output: Programmet fra 2.3 som beregner antall ulike løsninger for n = 13, dvs størrelsen på en fullstendig samling løsninger hvor ingen av disse kan oppnåes gjennom rotasjon og speiling av noen annen løsning i samlingen, og skriver kun ut dette tallet. Den som implementerer ifølge fotnotene gitt i seksjon 2.3 vil ha en stor fordel. Såsnart du har et program som er raskere enn bestetiden som ligger ute på vår hjemmeside, sender du kjøretiden, og outputen programmet ditt ga, til agotnes@ii.uib.no, så vil vi kontakte deg for å teste ditt program og eventuellt oppdatere bestetiden. Heder, ære og en symbolsk premie til vinner(e). 2.6 Frivillig: Visualisering Bruk GUI.GridMatrix (som du brukte i første uke til å visualisere Conway s spill) til å visualisere løsningene generert av ditt program. Utvid dette programmet slik at bruker kan gi følgende kommandoer: q n der n er et heltall; finn løsningene for n n brett; og vis første løsning på skjermen; v vis neste løsning på sjermen (etterfølgende v-kommandoer skal vise etterfølgende løsninger). Her kan altså bruker se på noen løsninger for en gitt n (med q n etterfulgt av noen v er), og så skifte til en annen brettstørrelse ved å gi kommando q m for en m n. 6