ACM ICPC Praktikum Kapitel 8: Backtracking. Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem.

Slides:



Advertisements
Ähnliche Präsentationen
Klassen - Verkettete Liste -
Advertisements

ACM ICPC Praktikum Kapitel 4: Sortieren.
Informatik II – Kapitel 11
Kapitel 9: Graphdurchlauf
Kapitel 6: Kombinatorik
„Such-Algorithmen“ Zusammenfassung des Kapitels 11
Kapitel 6. Suchverfahren
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
Finale Semantik und beobachtbares Verhalten
Lösung 5.1Schleifen 1.while (x < 5)if (x < 5) thenwhile Bif B then { do {{do { x = x + 1; x = x + 1; A A }}}} while (x < 5) while B do {x = x + 1;do {A.
1 Computergestützte Verifikation Probleme bei der Softwareverifikation 1.komplexe Datentypen und Expressions 2.Pointer und dynamische Datenstrukturen.
Binäre Bäume Richard Göbel.
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Dynamische Programmierung (2) Matrixkettenprodukt
Prinzipien des Algorithmenentwurfs Backtracking Prof. Dr. Th. Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (04 – Entwurfsverfahren) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
V11 Auflösen der Formen Abräumen der Reihen. Erweiterung der Klasse ultris class ultris { private: … void aufloesen() void aufruecken() public: … }

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Einführung Wat jibt´s denn? Mit Computa kenn´ ick mir aus! Guten Tag,
Diskrete Mathematik I Vorlesung 6 Binärer Suchbaum II.
Kapitel 10: Graphalgorithmen
Struktogramme IF-ELSE FOR – Schleife
FH-Hof Sortieren mit Binären Bäumen Richard Göbel.
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
Isabelle/HOL ( Kripke Structures & Model Checking ) Ying Wang, Nelli Bärsch, Bartosz Rynarzewski,
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Quantum Computing Hartmut Klauck Universität Frankfurt WS 05/ /2.1.
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Efficient Alias Set Analysis Using SSA Form Proseminar Programmanalyse WS 11/12 André Hunke.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Die Zählschleife int s = 0 for (int k=1; k
Parallel Matrix Multiplication
Informatik 1 Übung 5. NACHBESPRECHUNG Übung 5 Korrekturen Ich prüfe keine Syntax – schreibt wenn was nicht kompiliert Lösungen müssen nicht perfekt sein.
Informatik 1 Übung 4.
Christian Mansky Design - Fallstudien Christian Mansky
Dynamische Datentypen
Felder (Arrays) und Zeiger (Pointers) - Teil II Zeichen, Texte, String Matching; Mehrdimensionale Felder; kürzeste Wege.
Auswahlanweisungen, Iterationsanweisungen, Blöcke, Sprunganweisungen
Perspektiven – “Perspectives” – Herr Wallace
Purga - Scriptengine Ein Einblick.
Algorithmen und Datenstrukturen SS 2005
CuP - Java Neunte Vorlesung Entspricht Kapitel 4.2 und 5 des Skriptums
CuP - Java Sechste Vorlesung Entspricht ungefähr Kapitel 3. 1 – 3
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Data Mining Spectral Clustering Junli Zhu SS 2005.
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
1 // Heap als ADT // JW: V1.0 // Vorlage gemaess EED-Quelltext // #include #include // für double pow (double d, int i) #include // fuer INT_MIN.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
MATLAB Control Statements.
Institut für Kartographie und Geoinformation Diskrete Mathematik I Vorlesung Binärer Suchbaum I-
Fallunterscheidung und Iteration Programmierung I Prof. Dr. Michael Löwe.
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Controller Werkstatt updaten Werkstatt ws = werkstattarray.get(werkstattId); ws.setName(name); ws.setAnsprechpartner(ansprechpartner); ws.setTelefonnummer(telefonnummer);
Arrays of Objects, a 3 part process
 Präsentation transkript:

ACM ICPC Praktikum Kapitel 8: Backtracking

Übersicht Backtracking Aufzählung aller Teilmengen Aufzählung aller Permutationen n-Königinnen-Problem

Backtracking Grundsätzlicher Ansatz: Angenommen, Lösung sei gegeben als Vektor a=(a 1,a 2,…,a n ), a i 2 S i Gegeben Teillösung (a 1,…,a k ), erweitere sie durch weiteres Element. Lösung vollständig: werte sie aus, sonst führe weiteres Backtracking über Elemente a k+1 2 S k+1 durch

Backtracking 1.bool finished = FALSE; /* found all solutions yet? */ 2.backtrack(int a[], int k, data input) 3.{ 4. int c[MAXCANDIDATES]; /* candidates for next position */ 5. int ncandidates; /* next position candidate count */ 6. int i; /* counter */ 7. if (is_a_solution(a,k,input)) 8. process_solution(a,k,input); 9. else { 10. k = k+1; 11. construct_candidates(a,k,input,c,&ncandidates); 12. for (i=0; i<ncandidates; i++) { 13. a[k] = c[i]; 14. backtrack(a,k,input); 15.if (finished) return;/* terminate early */ 16. } 17. } 18.}

Backtracking Anwendungsspezifische Teile: is_a_solution(a,k,input): testet auf vollständige Lösung process_solution(a,k): wertet Lösung aus construct_candidates(a,k,input,c,ncandidat es): füllt Feld c mit allen möglichen Kandidaten für a k

Aufzählung aller Teilmengen S k = {TRUE, FALSE} gibt an, ob a k in der Teilmenge ist. is_a_solution(int a[], int k, int n) { return (k == n); } construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { c[0] = TRUE; c[1] = FALSE; *ncandidates = 2; }

Aufzählung aller Teilmengen process_solution(int a[], int k) { gib Permutation aus } generate subsets(int n) { int a[NMAX]; backtrack(a,0,n); }

Aufzählung aller Permutationen S k = {1,…,n} process_solution(int a[], int k) { int i;/* counter */ for (i=1; i<=k; i++) printf(" %d",a[i]); printf("\n"); } is_a_solution(int a[], int k, int n) { return (k == n); }

Aufzählung aller Permutationen construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { int i;/* counter */ bool in_perm[NMAX];/* what is now in the permutation? */ for (i=1; i<NMAX; i++) in_perm[i] = FALSE; for (i=0; i<k; i++) in_perm[ a[i] ] = TRUE; *ncandidates = 0; for (i=1; i<=n; i++) if (in_perm[i] == FALSE) { c[ *ncandidates] = i; *ncandidates = *ncandidates + 1; } Aufruf: backtrack(a,0,3);

n-Königinnen-Problem Problem: platziere n Königinnen auf n £ n Schachfeld so, dass sie sich nicht schlagen können. Test aller möglichen Platzierungen: (n 2 )!/(n 2 -n)! n!), was schnell zur gigantischen Zahl wird

n-Königinnen-Problem Beschränkungen des Suchraums: Jede Zeile muss genau eine Königin enthalten Jede Spalte muss genau eine Königin enthalten Reihenfolge der Königinnen spielt keine Rolle (zählt als eine Möglichkeit) Also kann jede legale Positionierung der Königinnen als Permutation angesehen werden. Ist Permutation legal, dann auch jeder Shift und die inverse Permutation

n-Königinnen-Problem int solution_count; /* how many solutions are there? */ process_solution(int a[], int k) { int i;/* counter */ solution_count ++; } is_a_solution(int a[], int k, int n) { return (k == n); }

n-Königinnen-Problem construct_candidates(int a[], int k, int n, int c[], int *ncandidates) { int i,j;/* counters */ bool legal_move;/* might the move be legal? */ *ncandidates = 0; for (i=1; i<=n; i++) { legal_move = TRUE; for (j=1; j<k; j++) { if (abs((k)-j) == abs(i-a[j])) /* diagonal threat */ legal_move = FALSE; if (i == a[j]) /* column threat */ legal_move = FALSE; } if (legal_move == TRUE) { c[*ncandidates] = i; *ncandidates = *ncandidates + 1; }

n-Königinnen-Problem main() { int a[NMAX];/* solution vector */ int i;/* counter */ for (i=1; i<=10; i++) { solution_count = 0; backtrack(a,0,i); printf("n=%d solution_count=%d\n",i,solution_count); }