Dynamisk programmering

Relevanta dokument
i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Dynamisk programmering

Algoritmer, datastrukturer och komplexitet

Föreläsning 5: Dynamisk programmering

Dekomposition och dynamisk programmering

Föreläsning 7: Syntaxanalys

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Tommy Färnqvist, IDA, Linköpings universitet

Uppgift 1 (grundläggande konstruktioner)

Algoritmer, datastrukturer och komplexitet

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

Sökning och sortering

Komplexitetsklasser och repetition

Föreläsning 7: Syntaxanalys

Algoritmer, datastrukturer och komplexitet

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Tentamen i Grundläggande Programvaruutveckling, TDA548

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Algoritmer, datastrukturer och komplexitet

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programkonstruktion och Datastrukturer

Föreläsning 5: Grafer Del 1

Tentamen i Algoritmer & Datastrukturer i Java

Tommy Färnqvist, IDA, Linköpings universitet

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Asymptotisk komplexitetsanalys

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

*Pekarvärden *Pekarvariabler & *

Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Föreläsning 5 Innehåll

Grundläggande datalogi - Övning 9

Tommy Färnqvist, IDA, Linköpings universitet

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

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

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Algoritmer, datastrukturer och komplexitet

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Rekursion och induktion för algoritmkonstruktion

Tentamen Grundläggande programmering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Algoritmer, datastrukturer och komplexitet

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Rekursion och induktion för algoritmkonstruktion

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Magnus Nielsen, IDA, Linköpings universitet

Programmering II (ID1019) :00-11:00

Alfabeten, strängar och språk. String

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Föreläsning 8: Aritmetik och stora heltal

Dugga Datastrukturer (DAT036)

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Tentamen i. TDDC67 Funktionell programmering och Lisp

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

DD1361 Programmeringsparadigm. Carina Edlund

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

Objektorienterad modellering och diskreta strukturer. 13. Problem. Sven Gestegård Robertz. Datavetenskap, LTH

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

PROV I MATEMATIK Automatateori och formella språk DV1 4p

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Föreläsning 9: Talteori

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

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

Användarhandledning Version 1.2

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

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Kontextfria grammatiker

Instuderingsfrågor, del D

Värmedistribution i plåt

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Föreläsning 3-4 Innehåll

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

En kort text om programmering i C.

Föreläsning 5: Kardinalitet. Funktioners tillväxt

Programmering II (ID1019) :00-12:00

Ekvivalensrelationer

Lösning till tentamensskrivning i Diskret Matematik för CINTE, CL2 och Media 1, SF1610 och 5B1118, onsdagen den 17 augusti 2011, kl

Datastrukturer och algoritmer

Transkript:

DD2354, Algoritmer och komplexitet, 27 Uppgifter till övning 4 Dynamisk programmering Talföljder Givet är två följder av positiva heltal a,a 2,,a n och b,b 2,, b n där alla tal är mindre än n 2 samt ett positivt heltal B där B n 3 Problemet är att avgöra om det finns någon talföljd c,c 2,,c n så att n i= c i = B och c i = a i eller c i = b i för i n Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering Tala också om hur man ska utvidga algoritmen så den också talar om hur lösningen ser ut, alltså om c i = a i eller c i = b i för i n Matriskedjemultiplikation Följande algoritm beräknar det minimala antalet talmultiplikationer som krävs för att multiplicera ihop ett antal matriser av varierande storlek med varandra Algoritmen har komplexiteten O(n 3 ) och bygger på dynamisk programmering m[i, j] kommer att innehålla det minimala antalet multiplikationer som behövs för att räkna ut matrisprodukten M i M i+ M j Rekursionsekvationen för m[i, j] är: { om i = j m[i, j] = min i k<j (m[i, k]+m[k +,j]+r[i ]r[k]r[j]) om i<j procedure OptimalMatmul(var m: matris; r: vektor; n: integer); 2 var i, j, k, t, len: integer; 3 begin 4 for i:= to n do m[i,i]:= ; 5 for len:= to n- do 6 for i:= to n-len do begin 7 j:= i+len; 8 m[i,j]:= m[i+,j]+r[i-]*r[i]*r[j]; 9 for k:= i+ to j- do begin t:= m[i,k]+m[k+,j]+r[i-]*r[k]*r[j]; if t < m[i,j] then begin 2 m[i,j]:= t; 3 end; 4 end; 5 end; 6 end /* OptimalMatmul */; Om vi har n stycken matriser M M 2 M n där matris M i har dimension r[i ] r[i] så beräknas det minimala antalet multiplikationer av anropet OptimalMatmul(m, r, n) Svaret finns då i m[,n] Man vill egentligen inte bara veta det minimala antalet multiplikationer utan också i vilken ordning man ska multiplicera ihop matriserna för att uppnå det minimala antalet Bygg ut OptimalMatmul så att man kan få reda på ordningen Lägg till en hjälpmatris bryt[i, j] som innehåller var gränsen går mellan dom två matriserna som bildar produkten M i M i+ M j Exempel: bryt[7, 9] = 7 betyder att man ska multiplicera M 7 (M 8 M 9 ) och bryt[7, 9] = 8 betyder att man ska multiplicera (M 7 M 8 )M 9 Skriv sedan en procedur som skriver ut hur multiplikationen ska ske, dvs tolkar värdena av bryt och skriver ut en parentetisering Utskriften ska inte innehålla matrisindexen (som är onödiga) utan bara symbolisera varje matris med ett M

Exempel: (((MM)M)(MM)) Proteinvikning Ett protein är en lång kedja av aminosyror Proteinkedjan är inte rak som en pinne utan hopvikt på ett intrikat sätt som minimerar den potentiella energin Man vill väldigt gärna kunna räkna ut hur ett protein kommer att vika sig I denna uppgift ska vi därför studera en enkel modell av proteinvikning där aminosyrorna är antingen hydrofoba eller hydrofila Hydrofoba aminosyror tenderar att klumpa ihop sig För enkelhets skull ser vi proteinet som en binär sträng där ettor motsvarar hydrofoba aminosyror och nollor hydrofila aminosyror Strängen (proteinet) ska sedan vikas i ett tvådimensionellt kvadratiskt gitter Målet är att få dom hydrofoba aminosyrorna att klumpa ihop sig, det vill säga att få så många ettor som möjligt att ligga nära varandra Vi har alltså ett optimeringsproblem där målfunktionen är antalet par av ettor som ligger intill varandra i gittret (lodrätt eller vågrätt) utan att vara intill varandra i strängen Du ska konstruera en algoritm som med hjälp av dynamisk programmering konstruerar en optimal dragspelsvikning av en given proteinsträng av längd n En dragspelsvikning är en vikning där strängen först går en sträcka rakt nedåt, sedan en sträcka rakt uppåt, sedan en sträcka rakt nedåt, och så vidare I en sådan vikning kan man notera att lodräta par av intilliggande ettor alltid kommer i följd i strängen, så det är bara vågräta par av ettor som bidrar till målfunktionen I följande figur är strängen dragspelsvikt på ett sådant sätt att målfunktionen blir 4 Definition av problemet Proteindragspelsvikning: Inmatning: En binär sträng med n tecken Problem: Hitta den dragspelsvikning av indatasträngen som ger det största värdet på målfunktionen, alltså det största antalet par av ettor som ligger bredvid varandra men inte direkt efter varandra i strängen Konstruera och analysera tidskomplexiteten för en algoritm som löser proteindragspelsvikningsproblemet med dynamisk programmering Dufår gärna använda dig av nedanstående algoritm, som beräknar antalet par ettor i ett varv (dvs mellan två sträckor) i en dragspelsvikning som ligger bredvid varandra (men inte direkt efter varandra i strängen) Anta att proteinet lagras i en array p[n] Parametrarna a och b anger index i arrayen för den första sträckans ändpunkter Parametern c anger index för den andra sträckans slutpunkt Se figuren nedanför till höger a profit(a,b,c) = shortest min(b-a,c-(b+)); s ; for i to shortest do if p[b-i]= and p[b++i]= then s s+; return s; c b b+ 2

Not: Proteinvikningsproblemet är ett viktigt algoritmiskt problem som studeras i bioinformatiken Det behandlas tillsammans med många andra problem med biologisk anknytning i den valfria kursen Algoritmisk bioinformatik som går i period 4 varje år Analysator för kontextfri grammatik En kontextfri grammatik brukar användas för att beskriva syntax för bland annat programspråk En kontextfri grammatik i Chomskynormalform beskrivs av en mängd slutsymboler T (som brukar skrivas med små bokstäver), en mängd ickeslutsymboler N (som brukar skrivas med stora bokstäver), startsymbolen S (en av ickeslutsymbolerna i mängden N), en mängd omskrivningsregler som antingen är på formen A BC eller A a, där A, B, C N och a T Om A N så definieras L(A) genom L(A) ={bc : b L(B) och c L(C) där A BC {a : A a Språket som genereras av grammatiken definieras nusom L(S), vilket alltså är alla strängar av slutsymboler som kan bildas med omskrivningskedjor som börjar med startsymbolen S Exempel: Betrakta grammatiken med T = {a, b, N = {S, A, B, R, startsymbolens och reglerna S AR, S AB, A a, B b, R SB Vi kan se att strängen aabb tillhör språket som genereras av grammatiken med hjälp av följande kedja av omskrivningar: S AR ar asb asb aabb aabb aabb I själva verket kan man visa att det språk som genereras av grammatiken är precis alla strängar som består av k stycken a följt av k stycken b där k är ett positivt heltal Din uppgift är att konstruera och analysera en effektiv algoritm som avgör ifall en sträng tillhör det språk som genereras av en grammatik Indata är alltså en kontextfri grammatik på Chomskynormalform samt en sträng av slutsymboler Utdata är sant eller falskt beroende på om strängen kunde genereras av grammatiken eller inte Ange tidskomplexiteten för din algoritm uttryckt i antalet regler m i grammatiken och längden n av strängen Mer om grammatiker kan man läsa i kursen Artificiella språk och syntaxanalys ar Talföljder Vi skapar en boolesk n B-matris M som från början är fylld med nollor En etta i M[k, s] ska betyda att det finns något val av c,,c k så att k i= c i = s Rekursionsekvationen för M[k, s] blir: om k =och (s = a eller s = b ), M[k, s] = om k> och (M[k,s a k ]=eller M[k,s b k ]=), annars Beräkningen börjar med att M[,a ] och M[,b ] sätts till Därefter sätter man ettor i M[2,a + a 2 ], M[2,a + b 2 ], M[2,b + a 2 ] och M[2,b + b 2 ] i den andra raden av matrisen, sedan sätter man ettor i den tredje raden och så vidare Om det hamnar en etta i M[n, B] så är svaret på problemet ja Algoritmen kan se ut så här i C: 3

int ExistsC(int n, int a[], int b[], int B) { char M[n + ][B + ]; /* Dynamiska matriser är ett tillägg i gcc */ int i, j; for (i = ; i <= n; i++) for (j = ; j <= B; j++) M[i][j] = ; M[][a[]] = M[][b[]] = ; for (i = 2; i <= n; i++) for (j = ; j <= B; j++) { if (j - a[i] > && M[i - ][j - a[i]]) M[i][j] = ; if (j - b[i] > && M[i - ][j - b[i]]) M[i][j] = ; return M[n][B]; Satserna inuti den dubbla forslingan utförs (n )B gånger och i dom satserna utförs högst 4 jämförelser och 2 tilldelningar, dvs ett konstant antal Hela algoritmen går alltså i O(n 2 )+O((n )B) =O(n 2 + nb) O(n 4 ) Genom att gå bakifrån (från den n-te raden och uppåt) och undersöka i vilka positioner det finns ettor kan man lista ut en lösning Ettan i M[n, B] måstehasattsditpågrundavattdet finns en etta i antingen M[n,B a n ] eller M[n,B b n ] Kom ihåg vilken av dessa det är Om det står en etta i båda positionerna är det bara att välja en av dom (eftersom bara en enda lösning efterfrågas) Fortsätt på samma sätt från den valda positionen ända tills rad har nåtts Implementationen i C ser ut på följande sätt void WriteC(int n, int a[], int b[], int B) { int c[n + ], pos; /* samma satser som i proceduren ExistsC ovan ska in här*/ pos = B; for (i = n; i > ; i++) { if (pos - a[i] > && M[i - ][pos - a[i]]) c[i] = a[i]; else c[i] = b[i]; pos -= c[i]; c[] = pos; printf("en är %d", c[]); for (i = 2; i <= n; i++) printf(" + %d", c[i]); Matriskedjemultiplikation Stoppa in satsen bryt[i,j]:= i; efter rad 8 och satsen bryt[i,j]:= k; efter rad 2 i proceduren ovan Utskrift av parentetiseringen görs sedan med anropet Skriv(, n, bryt) procedure Skriv(a, b: integer; bryt: matris); begin if a = b then Write( M ) else begin Write( ( ); Skriv(a, bryt[a,b], bryt); Skriv(bryt[a,b] +, b, bryt); Write( ) ); end end; 4

Proteinvikning Låt q a,b vara det maximala värdet på målfunktionen man kan få för en vikning av delen p[an] av proteinet, där den första sträckan i vikningen har ändpunkterna a och b Vi kan uttrycka q a,b rekursivt på följande sätt: q a,b = max b+<c n (profit(a, b, c)+q b+,c) Basfallen är q a,n =för a<nsvarethittarvisedansom max <b n q,b Nugäller det bara att beräkna q a,b enligt dessa formler i rätt ordning: for a to n- do q[a,n] ; for b n- downto 2 do for a to b- do t -; for c b+2 to n do v profit(a,b,c)+q[b+,c]; if v>t then t v; q[a,b] t; max ; for b 2 to n do if q[,b]>max then max q[,b]; return max; Eftersom vi som mest har tre nästlade for-slingor och ett anrop till profit tar tid O(n) blir tidskomplexiteten uppenbarligen O(n 4 ) Analysator för kontextfri grammatik Vi använder dynamisk programmering ungefär som i problemet där man letar efter optimal matriskedjemultiplikationsordning Här ska vi istället bestämma i vilken ordning och på vilken delsträng reglerna ska tillämpas Indata är en uppsättning regler R och en vektor w[n] som alltså indexeras från till n Låt oss bygga upp en matris M[n,n] där elementet M[i,j] anger dom ickeslutsymboler från vilka man med hjälp av kedjor av omskrivningar kan härleda delsträngen w[ij] Rekursiv definition av M[i,j]: { {X :(X w[i]) R om i = j M[i, j] = {X :(X AB) R k : A M[i, k ] B M[k, j] om i<j Eftersom varje position i matrisen är en mängd av ickeslutsymboler så måste vi välja en lämplig datastruktur också för detta Låt oss representera en mängd av ickeslutsymboler som en bitvektor som indexeras med ickeslutsymboler betyder att symbolen är med i mängden och att den inte är med i mängden Exempel: Om M[i,j][B]=så är ickeslutsymbolen B med i mängden M[i,j], vilket betyder att det finns en kedja av omskrivningsregler från B till delsträngen w[ij] Algoritm som beräknar matrisen M[i,j] och returnerar sant ifall strängen tillhör språket som genereras av grammatiken: for i to n do M[i,i] ; /* alla bitar nollställs */ för varje regel X w[i] do M[i,i][X] ; for len 2 to n do for i to n-len+ do j i+len-; 5

M[i,j] ; for k i+ to j do för varje regel X AB do if M[i,k-][A]= and M[k,j][B]= then M[i,j][X] ; return M[,n][S]= ; Tid: O(n 3 m) Minne: O(n 2 m) (eftersom m är en övre gräns för antalet ickeslutsymboler) 6