System komputerowy -architektura Rozwój nowoczesnych technik obliczeniowych Magistrala systemowa (System Bus) Budowa komputera, algorytmika i języki programowania Cezary Bolek Katedra Informatyki Pamięć operacyjna ROM, RAM Jednostka centralna Układy we/wy In/Out Magistrala systemowa i pamięć RAM Magistrala danych Magistrala adresowa Magistrala sterująca ROM, RAM In/Out Magistrala adresowa Magistrala danych Magistrala sterująca ROM, RAM In/Out Magistrala danych słuŝy do przesyłania danych pomiędzy komórkami pamięci, rejestrami procesora oraz układami we/wy. Magistrala adresowa słuŝy do przesyłania adresów komórek pamięci (lub układów we/wy), które biorą udział w operacji odczytu lub zapisu. Magistrala sterująca słuŝy do określenia typu operacji ma się wykonać (zapis czy odczyt) oraz kierunku transferu danych (np. do pamięci, pamięć do ) RAM Pamięć operacyjna Pamięć RAM zawiera dane i rozkazy (programy) określające jak przetwarzać dane Magistrala danych przesyła dane z pamięci do w celu ich przetworzenia Magistrala danych przesyła przetworzone dane do pamięci w celu ich późniejszego przetwarzania, wyświetlenia, zapisania itp Jednostka centralna Przetwarza dane 1
Procesor Procesor (processor) - urządzenie cyfrowe sekwencyjne potrafiące pobierać, interpretować i wykonywać ciąg rozkazów. Wykonuje on bardzo szybko dowolny ciąg prostych operacji wybranych ze zbioru operacji podstawowych. Procesor składa się z: zespołu rejestrów do przechowywania danych i wyników, jednostki arytmetycznej (arytmometr) do wykonywania prostych operacji na danych, układu sterującego przebiegiem obliczeń, rejestru rozkazów, czyli operacji podstawowych. Procesor Działania wykonywane przez procesor: działania arytmetyczne: dodawanie, odejmowanie, porównywanie dwóch liczb, dodawanie i odejmowanie jedności, zmiana znaku liczby, działania logiczne: iloczyn logiczny - AND, suma logiczna - OR, suma modulo2 (róŝnica symetryczna) - XOR, negacja - NOT, przesunięcie bitów w lewo lub prawo, działania na bitach. Algorytm Innymi słowy, czym jest algorytm? Przepis na rozwiązanie określonego problemu za pomocą prostych czynności wykonywanych w ściśle określonej kolejności. Czynności: 1. muszą być znacznie prostsze od realizowanego algorytmu 2. muszą być wykonywalne dla danego sprzętu (prostota czynności jest sprawą względną) Kolejność: 1. określenie kolejności wykonywania czynności jest krytyczne dla osiągnięcia celu algorytmu; 2. musi istnieć mechanizm rozgałęziania algorytmu, tj. decydowania o kolejności w trakcie wykonywania algorytmu na podstawie zaistniałych warunków. Zbiór logicznie powiązanych kroków prowadzących do określonego celu Sposób rozwiązania problemu "Przepis" Sposób opisu zachowania Algorytm zawiera: Dane Instrukcje 2
Dane wejściowe Algorytm Dane wyjściowe Rola algorytmu Algorytm Przepis Ciasteczka czekoladowe DANE (składniki) 2 1/4 szklanki mąki 1 łyŝeczka soli 1 łyŝeczki proszku do pieczenia 2 jajka 3/4 szklanki brązowego cukru 1 łyŝeczki wanilii 3/4 szklanki cukru 1 paczka masła 30 dag startej na tarce czekolady INSTRUKCJE (czynności) Rozgrzać piekarnik do temperatury 375 C. W misie zmieszać mąkę, sól, proszek do pieczenia. Utrzeć razem cukier, masło i wanilię aŝ do uzyskania jednolitej konsystencji. Dodać jajka i utrzeć. Dodać zmieszaną wcześniej mąkę, sól itd., utrzeć. Dodać kawałki czekolady NałoŜyć łyŝeczką niewielkie porcje ciasta na blachę przykrytą do pieczenia. Piec 8 do 10 minut. papierem Cechy dobrego algorytmu Co jest złego w tym algorytmie? Dobry algorytm musi być: Skończony Kompletny Jednoznaczny Poprawny Prosty Zawierać poziomy abstrakcji (Z etykiety szamponu) Sposób uŝycia: Zmoczyć włosy NałoŜyć niewielką ilość szamponu na włosy Wetrzeć Spłukać Czynności powtórzyć 3
Sposoby opisu algorytmu Algorytm: Średnie zuŝycie paliwa w l/km Język naturalny (np. angielski) Opis graficzny (np. sieć działań) Pseudokod lub język programowania 1. Pobierz wartości: zuŝyte paliwo w litrach, początkowy i końcowy stan licznika w kilometrach 2. Ustaw wartość: przejechany dystans na wartość (końcowy stan licznika - początkowy stan licznika) 3. Ustaw wartość: średnie zuŝycie paliwa na wartość (zuŝyte paliwo / przejechany dystans) 4. Wydrukuj wartość: średnie zuŝycie paliwa 5. Koniec Zapis algorytmu - sieć działań Zwięzłość, czytelność i wysoki poziom abstrakcji Sieć działań (schemat blokowy): 1. Elementarne czynności oznaczone są blokami (węzły sieci), a kolejność wyznaczona jest poprzez gałęzie sieci, łączące węzły. 2. Kształt bloków odpowiada rodzajowi operacji, a strzałki gałęzi identyfikują jednoznacznie ich kolejność. 3. NiezaleŜność struktury algorytmu od architektury konkretnej maszyny i rodzaju kodowania liczb. Za pomocą sieci działań moŝliwe jest zapisanie kaŝdego poprawnego algorytmu! KaŜdy algorytm moŝna zapisać za pomocą wielu róŝnych sieci działań! Sieć działań: Średnie zuŝycie paliwa w l/km Start zuŝyte paliwo początkowy stan licz. końcowy stan licz. przejechany dystans końcowy stan licz. - końcowy stan licz. średnie zuŝycie paliwa na wartość zuŝyte paliwo / przejechany dystans drukuj średnie zuŝycie paliwa Stop 4
Przykład A Znajdowanie największej z trzech liczb: max(a,b,c) Start a,b,c Przykład B Start a,b,c m a Znajdowanie największej z trzech liczb: max(a,b,c) T a>b N m<b T m b T a>c N T c>b N N m<c T m c drukuj a drukuj c drukuj b N drukuj m Stop Stop A max(a,b,c) rozmiar: 4 we/wy 3 dec. 0 op. szybkość: 2 we/wy 2 dec. 0 op. rozbudowa: trudna Sieci A vs B? B max(a,b,c) rozmiar: 2 we/wy 2 dec. 3 op. szybkość: 2 we/wy 2 dec. 1..3 op. rozbudowa: łatwa Rozwiązanie problemu moŝliwe jest za pomocą róŝnych sieci działań. Optymalizacja algorytmu polega na znalezieniu sieci najlepszej według określonego kryterium: np. rozmiaru, szybkości, rozbudowy. Przykład. Wykonanie pseudokodu - krok 1 1. Pobierz wartości dla Litry (zuŝyte paliwo), Start (początkowy stan licznika) i Koniec (końcowy stan licznika) 2. Ustaw wartość dla Dystans (przejechany dystans) na (Koniec - Start) 3. Ustaw wartość dla Sred (średnie zuŝycie paliwa) na (Litry / Dystans) 4. Wydrukuj wartość: Sred 5. Stop Rozkaz Pobierz pobiera dane z zewnątrz i zapisuje je do pamięci Pobierz zmienia zawartość pamięci Zmienne algorytmu odnoszą się do konkretnych miejsc w pamięci 1a PAMIĘĆ 1c Prześlij pobrane dane do pamięci PAMIĘĆ Litry=36 Start=430 Koniec=940 1b Czekaj na dane wej. I/O I/O 5
Wykonanie pseudokodu: krok 2 1. Pobierz wartości dla Litry (zuŝyte paliwo), Start (początkowy stan licznika) i Koniec (końcowy stan licznika) 2. Ustaw wartość dla Dystans (przejechany dystans) na (Koniec - Start) 3. Ustaw wartość dla Sred (średnie zuŝycie paliwa) na (Litry / Dystans) 4. Wydrukuj wartość: Sred 5. Stop Rozkaz Ustaw moŝe zmienić zawartość pamięci Procesor wykonuje operacje matematyczne Procesor pobiera dane z pamięci na których operuje Procesor przesyła wynik do pamięci 2a Litry=39 Start=330 Koniec=980 2b 2d Pobierz wart. Prześlij wynik do odejm. do pamięci PAMIĘĆ Litry=39 Start=330 Koniec=980 Dystans=650 PAMIĘĆ I/O 2c: Oblicz róŝnicę I/O Wykonanie pseudokodu: krok 3 1. Pobierz wartości dla Litry (zuŝyte paliwo), Start (początkowy stan licznika) i Koniec (końcowy stan licznika) 2. Ustaw wartość dla Dystans (przejechany dystans) na (Koniec - Start) 3. Ustaw wartość dla Sred (średnie zuŝycie paliwa) na (Litry / Dystans) 4. Wydrukuj wartość: Sred 5. Stop Kolejna operacja Ustaw Analogiczne kroki Analogiczne operacje na pamięci 3a Litry=39 Start=330 Koniec=980 PAMIĘĆ I/O Dystans=650 3b Pobierz wart. 3d do dziel. Prześlij wynik do pamięci Litry=39 Start=330 Koniec=980 PAMIĘĆ Dystans=650 Sred=0.06 3c: Oblicz iloraz I/O Wykonanie pseudokodu: krok 4 1. Pobierz wartości dla Litry (zuŝyte paliwo), Start (początkowy stan licznika) i Koniec (końcowy stan licznika) 2. Ustaw wartość dla Dystans (przejechany dystans) na (Koniec - Start) 3. Ustaw wartość dla Sred (średnie zuŝycie paliwa) na (Litry / Dystans) 4. Wydrukuj wartość: Sred 5. Stop Wartość, która ma być wydrukowana znajduje się w pamięci Procesor wysyła Ŝądanie wysłania zawartości pamięci do urządzenia wyjściowego 4a Litry=39 Start=330 Koniec=980 PAMIĘĆ Dystans=650 Sred=0.06 4b Pobierz wartość z pamięci Litry=39 Start=330 Koniec=980 Dystans=650 Sred=0.06 PAMIĘĆ Wyślij wartośćna wyjście 4c I/O I/O 0.06 Pamięć operacyjna np. 01001000 00001000 11001010 00001011 11111110 Język maszynowy 48 h 08 h CA h 0B h FE h Instrukcja procesora (kod programu) w pamięci zapisane są w postaci liczb dwójkowych. Zapis programu za pomocą liczb, które mogą być bezpośrednio wykonywane przez maszyną nazywa się językiem maszynowym., 48, 08, CA, 0B, FE, Pisanie programów w języku maszynowym przez człowieka jest bardzo Ŝmudne, ale było stosowane do programowania komputerów I i II generacji. 6
np. 48 h 08 h CA h 0B h FE h Język asemblera KaŜdej instrukcji procesora (która moŝe zajmować jeden lub więcej bajtów) moŝna przypisać skrót literowy (mnemonik), a kaŝdemu rejestrowi nazwę. Zapis programu za pomocą mnemoników nazywa się językiem asemblera, który jest znacznie łatwiejszy do opanowania przez człowieka. BL,8 ADD BL,B INC BL BL,8 ADD BL,B INC BL Program zapisany w języku asemblera nie moŝe być wykonywany bezpośrednio przez komputer i wymaga tłumaczenia na kod maszynowy za pomocą programu zwanego asemblerem. PoniewaŜ istnieje ścisły związek pomiędzy mnemonikami a instrukcjami maszynowymi, proces tłumaczenia (asemblacja) jest stosunkowo prosty. Proces odwrotny nazywa się deasemblacją (za pomocą disasemblera). BL,8 ADD BL,B INC BL Asembler, 48, 08, CA, 0B, FE, Języki wysokiego poziomu Program zapisany w języku wysokiego poziomu charakteryzuje: Abstrakcja danych programista operuje na zmiennych bez konieczności organizacji wykorzystania rejestrów procesora i lokalizacji liczb w pamięci ZłoŜone struktury danych proste jest deklarowanie i korzystanie ze złoŝonych struktur liczb jak np. tablice (macierze), stosy, kolejki, drzewa, etc. Zaawansowane konstrukcje sterujące określenie kolejności wykonywania programu realizuje się z pomocą intuicyjnych konstrukcji warunkowych typu IF-THEN-ELSE, FOR, DO-WHILE, etc. Dowolność układu zapisu programu programista moŝe zapisywać program w postaci najbardziej dla niego czytelnej i zgodnej z upodobaniami. for (i=1; i<10, i++) { n=10+x*2 }; for (i=1; i<10, i++) { n=10+x*2 }; for (i=1; i<10, i++) { n=10+x*2 }; Kompilacja programów Programy napisane w językach wysokiego poziomu muszą być tłumaczone na język maszynowy za mocą programu zwanego kompilatorem, a proces tłumaczenia nazywa się kompilacją. for (i=1; i<10, i++) { n=10+x*2 }; Kompilator, 48, 08, CA, 0B, FE, BL,8 ADD BL,B INC BL Kompilacja programów jest zadaniem bardzo złoŝonym, ze względu na mnogość moŝliwości realizacji zadania w języku asemblera. Kompilatory są jednymi z najbardziej zaawansowanych i złoŝonych programów dla komputerów osobistych. X = X + Y*Z MUL ADD AL,X BL,Y CL,Z CL,BL lub AL,CL X,AL MUL ADD AL,Y BL,Z AL,BL BL,X AL,BL X,AL MUL ADD lub AL,Z AL,Y CL,X X,AL Przykład - algorytm Euklidesa Znajdowanie największego wspólnego podzielnika Największy Wspólny Dzielnik (NWD) dwóch liczb jest największą liczbą naturalną spośród tych, które dzielą obie te liczby bez reszty Np. NWD(24,18) = 6. Aby znaleźć Największy Wspólny Dzielnik dwóch liczb, to od większej liczby naleŝy odejmować mniejszą dotąd, aŝ obie liczby będą sobie równe. Wynik jest ich największym wspólnym podzielnikiem. NWD(24,15) 24-15 = 9 15-9 = 6 9-6 = 3 6-3 = 3 Od większej liczby odejmujemy mniejszą. Liczby 24 i 15 przechodząw 15 i 9. PoniewaŜnie sąone równe, wykonujemy dalej odejmowanie Teraz otrzymujemy parę9 i 6, która dalej nie składa sięz liczb sobie równych, więc kontynuujemy odejmowanie. Para 6 i 3 - odejmujemy dalej Para 3 i 3 - otrzymaliśmy równość, więc liczba 3 jest największym wspólnym podzielnikiem liczb 24 i 15. 7
Przykład - algorytm Euklidesa Lista kroków K01: Czytaj a,b K02: Dopóki a b: wykonuj krok K03 K03: JeŜeli a > b, to a a - b. Inaczej b b a K04: nwd a K05: Zakończ algorytm Schemat blokowy Algorytm Euklidesa kod maszynowy i asembler b9 18 00 00 00 b8 0f 00 00 00 3b c8 7e 04 2b c8 eb 02 2b c1 3b c8 75 f4 33 c0 c3 b9 18 00 00 00 b8 0f 00 00 00 3b c8 7e 04 2b c8 eb 02 2b c1 3b c8 75 f4 33 c0 c3 mov ecx, 24 mov eax, 15 cmp ecx, eax $L591: jle SHORT $L584 sub ecx, eax jmp SHORT $L585 $L584: sub eax, ecx $L585: cmp ecx, eax jne SHORT $L591 xor eax, eax ret 0 Algorytm Euklidesa język Pascal 1 2 3 4 program Od języka wysokiego poziomu do kodu varm,n: Euclide; maszynowego beginreadln(m); readln(n); integer; $L591: mov cmp eax, ecx, 24 15 eax while if else m<> m> nnthen writeln(m); m:= n:= m n $L584: jle sub jmp ecx, eax $L584 sub SHORT eax, ecx $L585 end. n-m; $L585: cmp jne xor ret ecx, SHORT eax, 0 eax $L591 b9 f4 18 3300 c0 0000b8 c3 0f 0000003b c8 7e 042b c8 eb02 2b c1 3b c8 75 8
Algorytm Euklidesa Język C i Ada with use procedure Text_IO; int { main(int begin a, b: Integer; Euklides is argc, char* argv[]) printf("podaj a,b; a b while := 153; scanf("%d", a.\n"); if 1326; while &a); if &b); b.\n"); elseb a (a > /= a b) b) -b; then loop elseb (a (a a!= b){ -= > b; a; end end loop; if; := b -a; } }printf("nwd return 0; to: %d", a); end; Put_Line("Największy &Integer'Image(b)); wspólny dzielnik (NWD) to: " Język ADA Język C Historia języków programowania 1 Plankalkül (1946, Niemcy) A-O (1951, USA) AutoCode (1952, Wlk.Brytania) FORTRAN I (1957, IBM, USA) FORTRAN II (1958, IBM, USA) pierwszy na świecie język programowania twórca Konrad Zues, komputer Z3 kmdr. Grace Hopper opracowuje kompilator A-O znany takŝe pod nazwą AT-3 studentka Alick Glennie opracowuje w ramach studiów kompilator AutoCode dla komputera Manchester Mark I rozwinięcie kompilatora A-O; opublikowany pod nazwą Math-Matic; programy numeryczno-modelujące rozwinięcie FORTRAN-u I wprowadzenie podprogramów Historia języków programowania 2 Historia języków programowania 3 COBOL (1959, USA) LISP (1959, USA) Algol 60 (1960) język dla przetwarzania duŝych zespołów danych w systemach ewidencyjno-zarządczych (skrót: COmmon Business Oriented Language) John McCarthy publikuje specyfikację LISP-u (skrót: LISt Processing) międzynarodowy zespół publikuje specyfikację języka Algol 60 Snobol (1962, Bell Labs, USA) BASIC (1964, USA) PL/I (1964, IBM, USA) język programowania ukierunkowany na przetwarzanie tekstów i wzorców językowych John Kemeny i Thomas Kurtz opracowują język BASIC (skrót: Beginners All-purpose Symbolic Instruction Code) publikacja specyfikacji języka PL/I przeznaczonego do ogólnych zastosowań APL (1961, USA) Keneth Iversson publikuje specyfikację języka APL ukierunkowanego na zagadnienia matematyczne RPG (1964, IBM, USA) publikacja specyfikacji języka RPG przeznaczonego do raportowania baz danych (skrót: Report Program Generator) FORTRAN IV (1962, USA) publikacja specyfikacji czwartej wersji języka FORTRAN LOGO (1966, USA) język wzorowany na LISP-ie, ukierunkowany na nauczanie dzieci i osób poznających programowanie 9
Historia języków programowania 4 Historia języków programowania 5 Simula (1967, Norwegia) język wzorowany na Algolu 60; wprowadzenie pojęcia klasy i obiektu; ukierunkowany na symulacje Smalltalk (1970, XEROX, USA) pierwszy język całkowicie obiektowy PASCAL (1968, Szwajcaria) Niklaus Wirth opracowuje język PASCAL do nauki programowania strukturalnego Icon (1970, USA) język programowania ukierunkowany na przetwarzanie tekstów i wzorców językowych BCPL (1969, Wlk.Brytania) Forth (1970, USA) PROLOG (1970, Francja) język niskiego poziomu zawierający wyłącznie bardzo proste typy danych (skrót: Basic Combined Programming Language) Charles Moore opracowuje język wysokiego poziomu Forth stosujący odwrotną notację polską język wysokiego poziomu stosowany w badaniach nad sztuczną inteligencją (skrót: PROgramming LOGic) B (1970, USA) C (1972, Bell Labs, USA) Tiny BASIC (1975, USA) język bazujący na BCPL opracowany dla komputera PDP-11 Dennis Ritchie opracowuje język C (bazujący na języku B) dla komputera PDP-11 dr Wong opracowuje miniaturową (tylko 2 KB pamięci) wersję BASIC-a dla mikroprocesorów Intela i Ziloga; jest to pierwszy program freeware; w programie uŝyto zastrzeŝeń: All Wrongs Reserved oraz Copyleft Historia języków programowania 6 Historia języków programowania 7 BASIC (1975, USA) Bill Gates i Paul Allen opracowują własną wersję BASIC-a, którą sprzedają dla firmy MITS produkującej mikrokomputer Altair, w którym stosowany jest mikroprocesor Intel 8080 Modula-2 (1983, Szwajcaria) C++ (1983, Bell Labs, USA) Niklaus Wirth opracowuje ulepszoną wersję języka Modula zespół Bjarne Stroustrupa opracowuje język C++ na bazie rozszerzonego języka C (C z klasami) DSL (1975, USA) ADA (1977, USA) Modula (1977, Szwajcaria) język będący poprzednikiem PostScriptu Jean Ichbiahn wraz z zespołem opracowują język ADA przyjęty później jako standardowy język programowania Ministerstwa Obrony USA Niklaus Wirth opracowuje język stosujący modularyzację i współbieŝność Perl (1987) Java (1995, Sun, USA) C# (2000, Microsoft, USA) udostępniona zostaje wersja 1.0 języka PERL opracowanego przez Larry ego Walla i Randala Schwartza; (skrót: Practical Extract and Report Language) zaprezentowano język programowania i środowisko opracowywane od roku 1991 przez zespół Jamesa Goslinga w Sun Microsystems Microsoft prezentuje język C# dla platformy.net będący kompilacją języków C++ i Java 10
Rozwój języków programowania Dlaczego tak duŝo języków programowania? Ewolucja Osobiste preferencje Specjalne zastosowania Obszary zastosowań Co czyni język popularnym? Aplikacje naukowe (Fortran, TCE) Aplikacje biznesowe (Cobol) Sztuczna inteligencja (Lisp) Programowanie systemowe (C, C++) Aplikacje sieciowe (Java, C#) Języki bardzo wysokiego poziomu (perl) Języki wysoce specjalizowane (make, sh) Efektywność kodu Łatwość nauki Łatwość implementacji Open Source Dostępność kompilatorów, bibliotek Ekonomia, patronat, inercja Składnia podobna do języka C 11
Paradygmaty programowania ZłoŜoność obliczeniowa ZłoŜoność obliczeniowa miara efektywności algorytmu Imperatywne (C, Pascal, etc.) Funkcjonalne (Lisp, ML, Haskell) Logiczne (Prolog) Zorientowane obiektowo (C++, Java, CLOS) Podawana jako liczba operacji potrzebnych do wykonania algorytmu, wyraŝona w stosunku do liczby elementów zbioru (n), na którym działa dany algorytm. PoniewaŜ dokładna liczba operacji zaleŝy od konkretnych danych wejściowych, złoŝoność obliczeniową podaje się dla najgorszego moŝliwego przypadku ZłoŜoność obliczeniową wyraŝa się za pomocą tzw. notacji O( ), która określa dominującą tendencję zaleŝności liczby operacji od n. np. algorytm sortowania bąbelkowego zbioru n-elementowego: liczba porównań = 0.5(n 2 -n) liczba przesunięć = 0.75(n 2 -n) złoŝoność obliczeniowa = O(n 2 ) Big-Oh np. 100n, 2n+4, 0.5n+n -1, 0.01n O(n) ZłoŜoność przykład Sortowanie zbioru n=1,000,000 (słowniki, ksiąŝki telefoniczne, bazy danych) Proste metody sortowania O(n 2 ) (wstawianie, wybieranie, bąbelkowe) Sprzęt Czas 1mln op/s 6 dni 100,000 op/s 2 miesiące 10,000 op/s 2 lata Zaawansowane metody sortowania O(n*log(n)) (Shell a, przez podział, ) Sprzęt Czas 1mln op/s 12s 100,000 op/s 2min 10,000 op/s 20min (op/s dotyczy operacji na elementach sortowanego zbioru, które mogąbyćzłoŝone, a nie elementarnych operacji procesora. ZłoŜoność przykład Sortowanie zbioru n=1,000,000,000 (symulacje fizyczne, astronomiczne, biologiczne) Proste metody sortowania O(n 2 ) (wstawianie, wybieranie, bąbelkowe) Sprzęt 1mln op/s Czas 160 lat Zaawansowane metody sortowania O(n*log(n)) (Shell a, przez podział, ) Sprzęt Czas 1mln op/s 0.5h 100,000 op/s 4.5h 10,000 op/s 2 dni (op/s dotyczy operacji na elementach sortowanego zbioru, które mogąbyćzłoŝone, a nie elementarnych operacji procesora. 12
Przykład - WieŜe Hanoi WieŜe Hanoi: Rozwiązanie Stan początkowy Ruch 1 A B C Cel: Przenieść wszystkie krąŝki z jednego drąŝka na inny Zasada 1: Wolno przenosić tylko jeden krąŝek za kaŝdym razem Zasada 2: Nie wolno połoŝyć większego krąŝka na mniejszym Ruch 2 Ruch 3 Ruch 4 Ruch 5 Ruch 6 Ruch 7 WieŜe Hanoi - ZłoŜoność WieŜe Hanoi (2 N ) Dla trzech pierścieni naleŝy wykonać 7 operacji. W ogólnym przypadku: koszt wynosi 2 N 1 = O(2 N ) Przy kaŝdym zwiększeniu N o jeden, nakłady pracy zwiększają się dwukrotnie. Przyrost pracy rośnie bardzo szybko! Dla N = 64 2 N = 2 64 = 18,450,000,000,000,000,000 Dysponując komputerem mogącym wykonywać milion instrukcji na sekundę Wykonanie zajęłoby 584,000 lat! Ale moŝe być jeszcze gorzej 13
ZłoŜoność rozsądna i nierozsądna Algorytmy o rozsądnej złoŝoności obliczeniowej mają złoŝoność najwyŝej wielomianową : O (Log N) O (N) O (NK) where K is a constant Algorytmy o nierozsądnej złoŝoności obliczeniowej mają złoŝoność wykładniczą i wyŝszą O (2 N ) O (N!) O (N N ) O( ) 10 50 100 300 1000 n log n 33 282 665 2469 9966 n 2 100 2500 10,000 90,000 1,000,000 n 3 1000 125000 1,000,000 27mln 1mld (10-cyfr) 2 n 1024 16-cyfr 31-cyfr 91-cyfr n! 3,6mld 65-cyfr 161-cyfr n n 10mld 85-cyfr 201-cyfr Algorytmy heurystyczne - heurystyka Heurystyka od greckiego słowa heurisco odkrywać znajdować Heurystyka twórcze rozwiązywanie problemów, zarówno logicznych, jak i matematycznych przez eksperyment, metodą prób i błędów bądź odwołaniem się do analogii Zastosowanie wszędzie tam, gdzie rozwiązanie problemu wymaga olbrzymiej ilości obliczeń. Dzięki heurystyce moŝna wyeliminować pewne obszary poszukiwanej przestrzeni, redukując koszty obliczeniowe i przyspieszając znalezienie rozwiązania dla porównania: liczba protonów we wszechświecie 126-cyfr liczba mikrosekund od powstania wszechświata 24 cyfry Heurystyka idea - przykład Przypuśćmy, Ŝe komuś upadło szkło kontaktowe. MoŜliwości poszukiwań: Szukanie ślepe schylanie się i szukanie po omacku, nie gwarantuje pozytywnego rezultatu Szukanie systematyczne polega na rozszerzaniu przeszukiwanej przestrzeni w sposób metodyczny i zorganizowany. Zawsze gwarantuje sukces, ale jest bardzo czasochłonne Szukanie analityczne wymaga rozwiązania równania matematycznego rządzącego upadkiem szkła z uwzględnieniem oporu powietrza, siły wiatru, ciąŝenia. Gwarantuje sukces, ale jest niepraktyczne. Szukanie leniwe polega na znalezieniu najbliŝszego optyka i zakupie nowego szkła Szukanie heurystyczne określamy przybliŝony kierunek upadku i domyślamy się, na jaką odległość moŝe upaść szkło, a następnie przeszukujemy wybrany obszar Heurystyka Przeszukiwanie ślepe i heurystyczne jest w penym stopniu do siebie podobne, ale: o szukaniu ślepym mówi się wtedy, gdy nie są wykorzystywane informacje o dziedzinie rozwiązywanego problemu w poszukiwaniu heurystycznym korzysta się z dodatkowych informacji o przestrzeni stanów, a ponadto jest się w stanie ocenić postępy poprawiające efektywność działania Pokonanie mistrza świata w szachach przez komputer stało się moŝliwe dzięki technikom heurystycznym, które pozwoliły wykluczyć warianty nie rokujące sukcesu. 14
Systemy sztucznej inteligencji Wykorzystują heurystykę w celu realizacji celu. Inteligencja - cecha umysłu odpowiadajaąca za sprawność myślenia i innych czynności poznawczych, umoŝliwiajaąca jednostce korzystanie z nabytej wiedzy oraz skuteczne zachowanie się wobec nowych zadań i sytuacji. Encyklopedia Powszechna PWN Inteligencja - umiejętność wnioskowania, rozumowania, kojarzenia faktów. Słownik jęz. ang. Webster Systemy sztucznej inteligencji AI Artificial Intelligence AI jest nauką podejmującą próbę stworzenia urządzeń cechujących się INTELIGENCJĄ W świetle definicji inteligencji, nie (Test wiadomo Turinga) konkretnie jakich urządzeń MoŜna załoŝyć takich jak my (bądź sprytniejszych od nas) Systemy AI to systemy, które (Sieci zachowują Neuronowe) się jak ludzie. Systemy AI to systemy, których budowa i działanie jest oparta o działanie mózgu. (poprawne wnioskowanie) Systemy AI to systemy, których działanie oparte jest o racjonalne zasady. (poprawne wnioskowanie + optymalne decyzje) Systemy AI to systemy, które w działaniu wykazują znamiona racjonalności. Systemy sztucznej inteligencji Systemy ekspertowe Sieci neuronowe Systemy ewolucyjne (algorytmy genetyczne) Technologie oparte na logice rozmytej Algorytmy mrówkowe Teoria gier inne 15