PROGRAMOWANIE DYNAMICZNE Dwuetapowa metoda
Transkrypt
PROGRAMOWANIE DYNAMICZNE Dwuetapowa metoda
Metody algorytmiczne c.d. PROGRAMOWANIE DYNAMICZNE Algorytm programowania dynamicznego do wyznaczania najkrótszej drogi przejścia z punktu początkowego do końcowego Dwuetapowa metoda polegająca najpierw na stopniowym gromadzeniu dodatkowej wiedzy o wszystkich możliwych cząstkowych rozwiązaniach zadania, a potem na wykorzystaniu tej wiedzy do wybrania najlepszego rozwiązania. Postępowanie w tym algorytmie ma związek z tzw. zasadą optymalności Bellmana: Przykładem zastosowania metody jest algorytm wyznaczania najkrótszej drogi w grafie skierowanym Jeżeli znamy najlepszą drogę przejścia od punktu początkowego do punktu końcowego, prowadzącą przez kolejne punkty, to każdy fragment tej drogi pomiędzy dowolnym punktem pośrednim a punktem końcowym jest najlepszą drogą przejścia od tego punktu pośredniego do punktu końcowego. Dane wejściowe: skończona liczba punktów (N), odcinki skierowane łączące wybrane pary punktów (M), liczby przypisane podanym odcinkom (ich długość, koszt, waga itp.) oraz wskazany punkt początkowy i końcowy drogi. Wynik: taki zbiór odcinków, który tworzy najkrótszą drogę przejścia od punktu początkowego do punktu końcowego. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 1 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 2 Algorytm Przykład dla N = 7 i M = 12: B 2 F 7 3 5 Faza 1: 1. Przypisz punktowi docelowemu G wartość L(G) = 0, 2. Powtarzaj co następuje, aż do wyznaczenia L(A): 2.1. Wybierz taki punkt Y, dla którego wszystkie odcinki z niego wychodzące prowadzą do punktów o już wyznaczonych wartościach L(X), 2.2. Wyznacz dla wybranego punktu wartość L(Y) wybierając najmniejszą sumę długości odcinka z niego wychodzącego i wartości L(X) dla punktu, do którego ten odcinek prowadzi 2.3. Zapamiętaj oprócz wartości L(Y) dla jakiego punktu ta suma była najmniejsza Faza 2: 1. Wyznacz najkrótszą drogę przejścia zaczynając od punktu A i odczytując kolejno, które kolejne punkty związane były z najmniejszymi sumami wybieranymi w 1. fazie 11 A 3 C 6 14 7 E 5 G 7 6 D L(X) – długość najkrótszej drogi przejścia od punktu X do G L(A) = ? Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 8 B A 3 14 127 C 6 4 JĘZYKI PROGRAMOWANIA 7 5 E 5 ALGORYTM 0 symbole G Faza 2: 7 6 L(G) = 0 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. F 3 11 Faza 1: L(F) = 7 7 2 5 13 3 D 6 słowa kluczowe Język programowania składnia A semantyka B L(E) = 5 E L(D) = min( 7+L(E), 6+L(G) ) = min(7+5, 6+0) = 6 G PROGRAM Składnia typowego języka programowania zawiera: L(B) = min( 3+L(E), 2+L(F)) = min(3+5, 2+7) = 8 zasady budowy struktur sterujących, L(C) = min( 11+L(B), 7+L(E), 6+L(D) ) = min(11+8, 7+5, 6+6) = 12 sposoby definiowania struktur danych, L(A) = min( 5+L(B), 3+L(C), 14+L(D) ) = min(5+8, 3+12, 14+6) = 13 wzorce podstawowych instrukcji. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 5 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 6 1 Algorytm sumowania liczb od 1 do N w przykładowym języku MJP Definiowanie składni języka w notacji BNF (Backus-Naur Form): symbol ::= oznacza „jest definiowana jako”, symbol | oznacza „lub” – postać alternatywna, nawiasy < > otaczają nazwę kategorii, nawiasy { } otaczają elementy, które można powtarzać. definiuj N, X, Y liczby całkowite; wczytaj N; X := 0; dla Y od 1 do N wykonuj <instrukcja-dla> ::= dla <nagłówek-dla> wykonuj <instrukcja> koniec koniec; wypisz X. <nagłówek-dla> ::= <zmienna> od <wartość> do <wartość> Słowa kluczowe: Instrukcje: <instrukcja> ::= <instrukcja-dla> | <instrukcja-przypisania> | ... X := X + Y <wartość> ::= <zmienna> | <liczba> | ... definiuj, wczytaj, dla, od, do, wykonuj ... X := 0 (przypisania) <zmienna> ::= <litera> { <cyfra> | <litera> } dla ... wykonuj ... koniec <liczba> ::= {<cyfra> } | ... (iteracja ograniczona) Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 7 definiuj TA tablica [1..50,8..107] w niej liczby całkowite instrukcja-dla i sposoby odwoływania się do elementów pamiętanych w tablicy: instrukcja-przypisania TA[wartość,wartość] instrukcja-dla nagłówek-dla dla nagłówek-dla wartość 8 Składnia podaje sposoby definiowania struktur danych, np.: Pomocnicze diagramy składniowe: instrukcja Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. zmienna od wykonuj wartość instrukcja do koniec Poza podaniem jak opisywać struktury sterujące i jak opisywać struktury danych, składnia określa: jak tworzyć poprawne ciągi symboli dla nazywania zmiennych i struktur danych, jak stosować interpunkcję (np. spacje, średniki, kropki, nawiasy) wartość zmienna cyfra zmienna cyfra litera Semantyka określa znaczenie poprawnych składniowo wyrażeń litera Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 9 Przykład problemu semantycznego - zmienne procedurowe Załóżmy, że składnia opracowywanego języka MJP dopuszcza stosowanie zmiennych, których wartościami mogą być nazwy procedur Zatem można zdefiniować procedurę Proc(V), która może być wywoływana z różnymi wartościami swojego parametru V, np. Proc(Rand) lub Proc(Quick), gdzie Rand i Quick, to wcześniej zdefiniowane procedury. Program będący zapisem algorytmu w języku wysokiego poziomu jest poddawany kompilacji, w celu przekształcenia go na zapis w języku adresów symbolicznych, lub interpretacji w celu wytworzenia kodu maszynowego koncepcja algorytmu 10 algorytm programowanie program w języku wysokiego poziomu kompilacja Semantyka języka MJP musi zawierać regułę rozstrzygającą, jaki wynik będzie dawało wywołanie Proc(Proc) w przypadku: Kompilacja – przełożenie całego programu zapisanego w języku wysokiego poziomu na program w języku niższego poziomu Procedura Proc(V): Proc(Proc) daje wynik 0, czy 1? 1. wywołaj V(V) i zapamiętaj wyznaczoną wartość w zmiennej X, 2. jeśli X = 1, to podaj jako wynik działania procedury wartość 0, 3. a jeśli nie, to podaj jako wynik działania procedury wartość 1, 4. wróć do poziomu wywołania. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. Interpretacja – przekładanie kolejno instrukcji języka wysokiego poziomu na instrukcje poziomu maszynowego program w języku adresów symbolicznych kod maszynowy wykonanie w komputerze 11 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 12 2 Uruchamianie kodu w systemie komputerowym Język wysokiego poziomu MJP: dla Y od 1 do N wykonuj (treść iteracji) koniec Najprostszy model komputera PROCESOR Język adresów symbolicznych (Asembler) Urządzenia wejściowe LDS 0,Y (załaduj 0 pod adres Y) PĘTLA POR N,Y (porównaj wartości pod adresami) SKR DALEJ (jeśli równe, to skocz do etykiety) DDS 1,Y (dodaj 1 do wart. pod adresem Y) (zapis treści iteracji) SKO PĘTLA (skocz do etykiety „PĘTLA”) DALEJ ... Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. Urządzenia wyjściowe Pamięć operacyjna Pamięci zewnętrzne 13 Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 14 Typowe etapy uruchamiania 3. krok 1. krok PROCESOR PROCESOR Pamięć zewnętrzna Pamięć operacyjna Pamięć operacyjna Dane Wyniki Kod Kod 2. krok Urz. wejściowe 4. krok PROCESOR Pamięć operacyjna Dane Pamięć zewnętrzna Pamięć operacyjna Urz. wyjściowe Kod Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. PROCESOR 15 Dane Wyniki Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. Kod 16 Wieża Babel języków programowania: BASIC, FORTRAN, COBOL, PL/I, Pascal, C, C++, Snobol, LISP, Prolog, APL, Ada, Java, Occam, ... Rozwój i badanie języków programowania: matematyczne podstawy interpretacji i kompilacji różne metody definiowania semantyki tworzenie języków zapytań i manipulowania danymi opracowywanie środowisk programowania wizualne języki programowania – „rysowanie” programów równoważność języków rozbudowa struktur sterujących i możliwość definiowania przez programistę własnych struktur sterujących Jarosław Sikorski - BUDOWA i ANALIZA ALGORYTMÓW, WIT 2006 r. 17 3