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