Obligatorisk oppgave 2 - inf

Like dokumenter
Obligatorisk oppgave 2 inf

Obligatorisk oppgave 1 INF1020 h2005

Rettede, ikke-sykliske grafer (DAG)

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

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

INF Algoritmer og datastrukturer

INF Innleveringsoppgave 6

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Obligatorisk oppgave 2 i INF 4130, høsten 2009

UNIVERSITETET I OSLO

INF Ekstrainnlevering

INF1000 Eksamen 2014 (modifisert)

Obligatorisk oppgave 1 i INF 4130, høsten 2009

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

MAT-INF 1100: Obligatorisk oppgave 1

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

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

Endret litt som ukeoppgave i INF1010 våren 2004

UNIVERSITETET I OSLO

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

2 Om statiske variable/konstanter og statiske metoder.

Eksamensoppgaver 2014

INF1020 Algoritmer og datastrukturer GRAFER

EKSAMEN med løsningsforslag

Obligatorisk oppgave 1 i INF 4130, høsten 2008

MAT-INF 1100: Obligatorisk oppgave 1

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

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

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

INF Repetisjon: Hvordan bygge treet og analysere? 8. september Typisk situasjon. De problematiske syntaks-diagrammene

UNIVERSITETET I OSLO

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

Oblig4 - obligatorisk oppgave nr. 4 (av 4) i INF1000

Informasjon Prøveeksamen i IN1000 høsten 2018

GRAFER. Hva er en graf? Det første grafteoretiske problem: Broene i Königsberg. Grafer vi har sett allerede

Eksamen IN1010/INF1010 våren 2018

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

UNIVERSITETET I OSLO

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

IN1010 V18, Obligatorisk oppgave 5

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

INF1020 Algoritmer og datastrukturer GRAFER

Obligatorisk oppgave 5: Labyrint

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

UNIVERSITETET I OSLO

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

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

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

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

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

Drosjesentralen. I-120: Obligatorisk oppgave 2, 2000

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Matchinger i ikke-bipartite grafer

UNIVERSITETET I OSLO

INF1000 Eksamen 2014 (modifisert)

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

løsningsforslag-uke5.txt

København 20 Stockholm

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

UNIVERSITETET I OSLO

Oppgave 1. Sekvenser (20%)

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

EKSAMEN. Algoritmer og datastrukturer

INF mai 2014 Stein Krogdahl, Ifi, UiO

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:

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

INF Algoritmer og datastrukturer

Det første grafteoretiske problem: Broene i Königsberg

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

INF Obligatorisk innlevering 5

INF100 INNLEVERING 3 HØSTEN 2004

UNIVERSITETET I OSLO

Grunnleggende Grafalgoritmer II

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

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

UNIVERSITETET I OSLO

Enkle generiske klasser i Java

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000 HashMap. Marit Nybakken 2. november 2003

K O N T I N U A S J O N S E K S A M E N

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

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

INF1010 Sortering. Marit Nybakken 1. mars 2004

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Transkript:

Obligatorisk oppgave 2 - inf2220 2007 Frist: fredag 9. november Det er mulig å jobbe sammen to og to på denne oppgaven, helst bør dere da ha samme gruppelærer. Vi anbefaler dere å løse oppgaven selvstendig. Prosjekt-planlegging Oppgaven går ut på å lage et hjelpemiddel for planlegging av større prosjekter. Dette hjelpemiddelet, som skal være et programsystem, skal ta imot informasjon om de forskjellige deler som det planlagte prosjekt kan deles opp i. Hver slik del skal vi kalle en aktivitet, og den informasjon som er knyttet til hver slik aktivitet er følgende: Et tekstlig navn på denne aktiviteten, til bruk i utskriften. Et unikt nummer på aktiviteten. Hvor stort mannskap som tenkes brukt på denne aktiviteten. Hvor lang tid aktiviteten er beregnet å ta. Hvilke aktiviteter som må være avsluttet før denne aktiviteten kan starte. (Dette oppgis som en sekvens av aktivitets-numre) Ut fra disse opplysningene skal så programmet finne svar på følgende spørsmål: (a) Er prosjektet gjennomførbart, eller finnes det aktiviteter som gjensidig vil komme til å vente på hverandre? (b) Om det kan gjennomføres: Hvordan kan prosjektet gjennomføres på kortest mulig tid om man har ubegrenset stort mannskap å ta av, og starter hver aktivitet så snart det er mulig? Hvor lang tid vil denne gjennomføringen ta? Hvor stort mannskap trengs til enhver tid med en slik gjennomføring? 1

A T = 3 M = 4 C T = 1 M = 2 F T = 4 M = 3 H T = 3 M = 2 B T = 5 M = 2 D T = 2 M = 4 E T = 8 M = 4 G T = 1 M = 3 Figur 1: Eksempel på aktivitesgraf. T er tidsbehov og M er mannskapsbehov. (c) Hvor kritisk er det at den enkelte aktivitet holder den oppgitte tid, når det er viktig at den totale tid for prosjektet ikke skal øke? (d) Dersom man bare har et gitt antall arbeidere til disposisjon, hvordan kan man da gjennomføre prosjektet på en fornuftig måte? (Det er vanskelig her å finne den beste måte, men man har til oppgave å finne en måte som utnytter arbeidsstokken rimelig bra). For å lette oversikten kan man tegne hver aktivitet som en sirkel med angivelse av tids og mannskaps-behov skrevet inni. Videre kan man markere at en aktivitet A ikke kan startes før en aktivitet B er ferdig, ved å tegne en pil fra B til A. Pilen går altså i tidsretningen. Vi har dermed en rettet graf, der aktivitetene er noder og avhengighetene er kanter. Et eksempel på en graf som kan representere et lite prosjekt er gitt i figur 1. Denne grafen må vi på en eller annen måte ha representert i maskinen når vi skal besvare spørsmålene over. Vi skal her bruke en nokså enkel representasjon, som bare bruker lister. Angående spørsmål (a) over skulle det være greit å innse at prosjektet er gjennomførbart hvis og bare hvis det ikke er løkker (sykler) i grafen, og at det å gjennomføre prosjektet er å foreta noe som likner på topologisk sortering. Etter innlesningen av grafen skal det derfor sjekkes om grafen har løkker, og dette skal gjøres ved en standard dybde først søking gjennom grafen. Dersom det finnes slike løkker skal man skrive ut en av dem (som en sekvens av aktiviteter), sammen med en beskjed om at videre behandling er umulig. 2

Dersom grafen viser seg å ikke ha løkker, skal vi gå videre til spørsmål (b). Resultatet av dette skal presenteres som følger: Man skal for det første tenke seg at man gjennomfører prosjektet ved å starte opp hver aktivitet så snart som mulig etter at alle de aktivitetene den er avhengig av er ferdig. Hvordan denne simuleringen kan gjennomføres skal vi se på lenger ned. Som en utskrift fra denne simuleringen skal man lage en kronologisk liste over alle interessante tidspunkter, nemlig når en eller flere aktiviteter starter eller slutter. Mellom hvert interessant tidspunkt skal det skrives ut hvor stort mannskap som er i arbeid. Tiden fra starten fram til alle aktiviteter er ferdig er den korteste tiden prosjektet overhodet kan gjennomføres på. For prosjektet over kunne denne utskriften f.eks. ta seg slik ut som i figur 2. Beregningene i punkt (c) bygger så på følgende betrakninger. Ut fra det totale bildet av hvordan aktivitene må vente på hverandre, kan man beregne hvor kritisk det er at den enkelte aktivitet overholder sin tidsplan, dersom prosjektet fremdeles skal kunne utføres på kortest mulig tid. Dette kan f.eks. uttrykkes ved et seneste starttidspunkt for aktiviteten, slik at tidsrammen fremdeles kan holdes om alle de andre aktivitetene ikke bruker lenger tid enn angitt. Alternativt kan dette uttrykkes som en slakk for hver aktivitet, som er differansen mellom seneste og tidligste starttidspunkt, og det er denne slakken som skal skrives ut. Legg her merke til at de aktiviteter som har slakk lik null danner en slags kritisk vei gjennom grafen. Om en av disse tar lengere tid en forutsatt, så forsinkes hele prosjektet tilsvarende. Seneste starttidspunkt ville man kunne finne ved å gjennomføre prosjektet bakfra etter samme mønster som i del (b) (ved da å tenke seg at hvert prosjekt blir avsluttet på det senest mulige tidspunktet før starten av alle de som er avhengig av den). Da ville man imidlertid være avhengig av også å lagre forgjengermengden i hver node, og bl.a. for å unngå dette skal vi bruke en annen metode. Vi skal gjennomføre en dybde først søking framover gjennom grafen, der det rekursive kall for hver aktivitet returnerer det seneste tidspunkt denne aktiviteten må startes, for at ikke totaltiden for prosjektet skal økes. Flere detaljer lenger ned. Utskriften fra del (c) skal være en liste over alle aktivitetene, sortert på nummer, der vi for hver aktivitet angir: - Nummer - Beskrivende tekst (navn) - Tidsbehov og mennskapsbehov - Slakk - De aktivitene som er avhengige av denne (ved nummer). 3

Tid: 0 Starter: A Starter: B I arbeid: 6 Tid: 3 Slutter: A I arbeid: 2 Tid: 5 Slutter: B Starter: C Starter: D I arbeid: 6 Tid: 6 Slutter: C Starter: F I arbeid: 7 Tid: 7 Slutter: D Starter: E I arbeid: 7 Tid: 10 Slutter: F I arbeid: 4 Tid: 15 Slutter: E Starter: H Starter: G I arbeid: 5 Tid: 16 Slutter: G I arbeid: 2 Tid: 18 Slutter: H **** Minste gjennomføringstid for prosjektet er 18 *** Figur 2: Eksempel på utskrift fra del (b) for prosjektet i aktivitetsgrafen 4

Beregn for hånd seneste starttidspunkt og slakken for aktivitetene i prosjektet gitt over, og angi hvordan utskriften kan bli. Angående punkt (d) så skal vi her skrive ut en ny gjennomføringsplan slik som over, men denne gangen med den begrensning at antall i arbeid ikke skal overstige et gitt tall. Programmet som produserer en slik gjennomføringsplan vil på mange måter være likt det som finner gjennomføringen under (b), men man kan ikke nå uten videre sette i gang en aktivitet så fort alle den er avhengig av er avsluttet. Det må sjekkes om det er ressurser nok til igangsettingen. Generelt vil vi dermed her sitte med en liste av aktiviteter som er klare for igangsetting, men som ikke er kommet i gang på grunn av personalmangel. Hvilke av disse aktivitene man skal sette i gang når det blir frigjort nye personer er et vanskelig spørsmål, men vi skal ikke kreve noe genialitet her. Om man VIL være litt lur kan man ta hensyn til at man må se å få i gang aktiviteter som fikk liten slakk under punkt (c), og at det lett kan bli til at aktiviteter som krever stort mannskap kommer i gang svært sent. 5

Detaljer i programutformingen Innlesing og opprettelse av grafen For å representere grafen internt skal vi bruke følgende klasser: class Aktivitet { int arbant, tid, nr; String navn; int tidligstestart, senestestart; Kant utkanter; int antforgj; int hjelp; // Brukes til litt ymse Aktivitet(int n) { nr = n; class Kant { Kant neste; Aktivitet aktivi; Kant(Aktivitet a) { aktivi = a; void leggtil(kant k){ if(this.neste == null){ neste = k; else{ neste.leggtil(k); Den datastrukturen vi skal ha er følgende: For hver aktivitet skal vi ha et objekt av klassen Aktivitet, og etter innlesningen skal den ha riktig nummer, navn, arbant, 6

tid og antforgj. Vi skal regne med at alle aktivitetsnummerene ligger i et område fra 1 til maxnr (men ikke nødvendigvis tett), der maxnr oppgis helt i starten i dataene. Vi skal ha en global Aktivitet [maxnr +1] akt, der de indeksene som tilsvarer brukte aktivitetsnummere har en peker til det tilsvarende objekt, mens resten av arrayen skal inneholde null. Knyttet til hver aktivitet skal det så være en liste av Kant-objekter, som angir de utgående kanter til aktiviteten (til de aktiviteter som ikke kan startes før denne er avsluttet). Rekkefølgen av kantobjektene i disse listene er uten betydning. Når man leser inn dataene kan denne datastrukturen opprettes etter hvert. Det eneste trikset er at man må opprette et aktivitets-objekt første gang denne aktiviteten nevnes i dataene, og dette kan godt være i en forgjenger-liste (se under) før selve definisjonen av aktiviteten kommer. Man må da bare la objektet stå tomt til definisjonen kommer. Formatet på dataene er en sekvens av aktivitetsdefinisjoner, og hver slik definisjon er en sekvens av følgende (skilt med blanke): Nummer på aktiviten (heltall) Navn på aktiviteten (som en tett sekvens av tegn avsluttet av blank) Tidsforbruk for aktiviteten (heltall) Personkrav til aktiviteten (heltall) En sekvens av aktivitetsnumre som angir de aktiviteter som må være ferdige før denne kan startes ( forgjenger-listen ). Denne listen avsluttes med en null. Foran dataene til første aktivitet ligger altså tallet maxnr, nevnt over. Det er ingen spesiell rekkefølge på aktivitetsdefinisjonene. Innlesningen av dataene skal ikke gjøres spesielt robust, men det skal sjekkes at alle aktiviteter som noensinne nevnes, blir definert en og bare en gang. Så fort man finner noe feil i dataene skal man bare gi en feilmelding å avslutte. Det kan være lurt å lage en global liste av kant-objekter som angir de aktiviteter som ikke har noen forgjengere, og som dermed kan startes umiddelbart når prosjektet settes i gang. Om å finne og skrive ut løkker Det å undersøke om det finnes løkker i grafen kan man gjøre ved å la en rekursiv prosedyre gjennomsøke grafen på standard dybde først maner, og se om vi fin- 7

ner en bakoverkant. Den rekursive prosedyren skal dermed kalles en gang for hver node, og man må passe på å starte opp kall i alle noder som ikke har forgjengere. Til å kontrollere utbredelsen av denne prosedyren kan man bruke atributtet hjelp. Initielt kan den være null i alle aktivitetene, og vi kan la den bli noe annet så fort vi kaller prosedyren i en aktivitet. I aktiviteter der prosedyren er kalt kan man skille mellom to tilstander, nemlig at prosedyren fremdeles er i gang, eller at den har terminert. Vi kan markere dette med at hjelp er h.h.v. positiv og negativ. I det siste tilfellet kan vi rett og slett la hjelp ha verdien -1, mens det i det første tilfellet er behagelig at hjelp inneholder nummeret til den aktiviteten der prosedyren i denne aktiviteten ble kalt fra. Den rekursive prosedyren bør derfor som parameter ha nummert til aktiviteten der kalleren er lokal. En bakoverkant (og dermed en løkke) er funnet dersom man skal til å kalle en node med som har en positiv verdi i hjelp. Ut fra verdiene i hjelp er det da lett å følge løkka bakover rundt, slik at man kan skrive den ut før man avslutter programmet. Gjennomgang med oppstarting på tidligste tidspunkt Vi skal så se på det å gjennomføre prosjektet, etter den filosofi at en aktivitet skal startes opp så fort alle de den er avhengig av er ferdige. De aktivitetene som ikke har noen forgjengere skal da selvfølgelig startes opp med en gang. Et viktig poeng her er at man hele tiden har en liste som angir de aktiviteter som er startet, men ikke avsluttet. Denne listen bør man holde sortert på avslutningstiden til aktivitetene, som man jo kan fastlegge når aktiviteten startes (eller man kan bruke en prioritetskø i stedet for bare en liste). Det nærmeste tidspunktet det skal skje noe på vil da hele tiden være avslutningstidspunktet til den første aktiviteten i listen. Når denne listen er tom er prosjektet ferdig utført. Denne listen lages mest behagelig av objekter som likner kant-objekter, men som i tillegg har et heltalls-atributt avsltid, som er den verdien listen skal sorteres etter. Nok et poeng er viktig, nemlig at man hele tiden holder rede på hvor mange uavsluttede aktiviteter hver av aktivitene venter på før de kan komme i gang. Til dette kan vi bruke variablen hjelp, og den må da altså i denne forbindelse initialiseres i alle aktiviteter til å være lik antall forgjengere. Vi må da passe på å telle variablen hjelp ned i alle etterfølgerne hver gang vi avslutter en aktivitet, og om verdien blir null skal denne etterfølgeren straks settes i gang. Den kronologiske utskriften produseres rett og slett underveis mens man utfører prosessen beskrevet over. Man må også ha en variabel som holder greie på hvor 8

mange personer som til enhver tid er i arbeid. Vi kan dermed lage utskriften til punkt (b). Beregning av slakk etc. For å finne seneste starttidspunkt under punkt (c) skal vi gjøre nok en dybdeførst søking gjennom grafen, og de rekursive kallene kan da passelig returnere det seneste starttidspunkt for den aktuelle noden (aktiviteten). Seneste starttidspunkt for de aktivitetene som ikke har etterfølgere bestemmes ut fra totaltiden for prosjektet, som ble funnet i fase (b). For andre noder kan den bestemmes ut fra svarene på de rekursive kallene. Vi kan også her passelig bruke hjelp til angi hvilke noder man allerede har vært innom, men vi behøver her bare skille mellom to verdier. Utskriften av en liste med alle opplysninger om alle aktivitene skulle etter dette være rett fram. Gjennomføring med begrensning i antall personer Det programmet man her skal skrive blir svært likt programmet for å gjennomføre prosjektet uten person-begrensning. Det viktige her er at man har en liste over de aktiviteter som er klare til å starte opp, men som enda ikke er igangsatt. I og med personbegrensnigen kan ikke disse settes i gang umiddelbart, men man må hele tiden passe på å sette i gang så mange som mulig. Hvilke som skal settes i gang når man har flere å velge i er imidlertid ikke noe lett spørsmål. For å gjøre det enkelt kan man holde denne listen sortert på slakk (slik at de med minst slakk blir satt i gang først) eller på personalkrav, etter som hva man tror gir minst total gjennomføringstid. Hver gang en aktivitet avsluttes, må man da sørge for å sette i gang (altså gjøre utskrift, og flytte over i den andre listen) så mange aktiviteter som mulig fra denne listen, innenfor den rammen at personbruken ikke overgår den totale personalbegrensningen. Levering Oppgaven skal leveres til den gruppen dere normalt går på. (Hvis dere ikke går på noen gruppe: den gruppen dere er oppmeldt på.) Det skal leveres en zippet fil som pakker filene ut til en katalog med navn = navnene til de som har laget oppgaven. Katalogen skal inneholde 9

Utskrift av kildekoden. Kjøringer av filene husbygg, husfeil og veibygg (ligger på kurssiden). En kjørbar fil. Du kan få godkjent denne oppgaven selv om du ikke løser punkt (d). Det er mulig vi kommer til å bruke Joly systemet på denne innleveringen, hvis vi gjør det kommer det instruksjoner på kursets hjemmeside. 10