07.03.2017 System komputerowy -architektura Rozwój nowoczesnych technik obliczeniowych Magistrala systemowa (System Bus) Budowa komputera, algorytmika i języki programowania Cezary Bolek Pamięć operacyjna ROM, RAM Katedra Informatyki Magistrala systemowa Układy we/wy In/Out Jednostka centralna CPU CPU i pamięć RAM Magistrala danych Magistrala adresowa Magistrala sterująca Magistrala danych Magistrala adresowa ROM, RAM CPU In/Out Magistrala sterująca ROM, RAM CPU 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. CPU do pamięci, pamięć do CPU) RAM Pamięć operacyjna Magistrala danych przesyła dane z pamięci do CPU w celu ich przetworzenia Magistrala danych przesyła przetworzone dane do pamięci w celu ich późniejszego przetwarzania, wyświetlenia, zapisania itp Pamięć RAM zawiera dane i rozkazy (programy) określające jak przetwarzać dane CPU Jednostka centralna CPU Przetwarza dane 07.03.2017 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 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. Innymi słowy, czym jest algorytm ? • 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 07.03.2017 Rola algorytmu Dane wejściowe Algorytm Dane wyjściowe 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. Cechy dobrego algorytmu Co jest złego w tym algorytmie? Dobry algorytm musi być: (Z etykiety szamponu) • Skończony • Kompletny • Jednoznaczny Sposób użycia: • Poprawny • Prosty • Zawierać poziomy abstrakcji papierem • • • • • Zmoczyć włosy Nałożyć niewielką ilość szamponu na włosy Wetrzeć Spłukać Czynności powtórzyć 07.03.2017 Sposoby opisu algorytmu Algorytm: Średnie zużycie paliwa w l/km • Język naturalny (np. angielski) 1. Pobierz wartości: zużyte paliwo w litrach, początkowy i końcowy stan licznika w kilometrach • Opis graficzny (np. sieć działań) 2. Ustaw wartość: przejechany dystans na wartość (końcowy stan licznika - początkowy stan licznika) • Pseudokod lub język programowania 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! 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 Każdy algorytm można zapisać za pomocą wielu różnych sieci działań! Stop 07.03.2017 Przykład A Przykład B Znajdowanie największej z trzech liczb: max(a,b,c) Start Start a,b,c a,b,c T T a>c ma N a>b N T m<b c>b drukuj c T mb T mc N N m<c drukuj a Znajdowanie największej z trzech liczb: max(a,b,c) N drukuj b drukuj m Stop Stop Sieci A vs B ? max(a,b,c) rozmiar: 1a B 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 PAMIĘĆ dystans) na (Koniec - Start) 3. Ustaw wartość dla Sred (średnie zużycie paliwa) na (Litry / Dystans) 4. Wydrukuj wartość: Sred 1c Prześlij pobrane dane do pamięci 5. Stop max(a,b,c) rozmiar: 4 we/wy 3 dec. 0 op. 2 we/wy 2 dec. 3 op. szybkość: 2 we/wy 2 dec. 0 op. szybkość: 2 we/wy 2 dec. 1..3 op. rozbudowa: trudna 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. CPU I/O 1b Czekaj na dane wej. • 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 Litry=36 Start=430 Koniec=940 PAMIĘĆ A Przykład. Wykonanie pseudokodu - krok 1 CPU I/O 07.03.2017 Wykonanie pseudokodu: krok 2 Wykonanie pseudokodu: krok 3 Litry=39 Start=330 Koniec=980 2d Prześlij wynik do pamięci I/O CPU 2b Pobierz wart. do odejm. 2c: Oblicz różnicę 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 PAMIĘĆ 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 3a PAMIĘĆ 2a Litry=39 Start=330 Koniec=980 Dystans=650 3d Prześlij wynik do pamięci I/O CPU 3b Pobierz wart. do dziel. 3c: Oblicz iloraz • Procesor pobiera dane z pamięci na których operuje Litry=39 Start=330 Koniec=980 Dystans=650 • Kolejna operacja Ustaw I/O CPU • Analogiczne kroki • Analogiczne operacje na pamięci • Procesor przesyła wynik do pamięci Wykonanie pseudokodu: krok 4 • Procesor wysyła żądanie wysłania zawartości pamięci do urządzenia wyjściowego PAMIĘĆ 0.06 4b Pobierz wartość z pamięci Litry=39 Start=330 Koniec=980 Dystans=650 Sred=0.06 PAMIĘĆ • Wartość, która ma być wydrukowana znajduje się w pamięci I/O CPU CPU I/O 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. Pamięć operacyjna Litry=39 Start=330 Koniec=980 Dystans=650 Sred=0.06 CPU Język maszynowy Wyślij wartość na wyjście 4c 4a 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 Litry=39 Start=330 Koniec=980 Dystans=650 Sred=0.06 PAMIĘĆ • Procesor wykonuje operacje matematyczne PAMIĘĆ • Rozkaz Ustaw może zmienić zawartość pamięci np. 01001000 00001000 11001010 00001011 11111110 I/O 48h 08h CAh 0Bh FEh ..., 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. 07.03.2017 Język asemblera Języki wysokiego poziomu 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. np. 48h 08h CAh 0Bh FEh ... MOV BL,8 ADD BL,B INC BL ... MOV BL,8 ADD BL,B INC BL Asembler • 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. 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). ... MOV BL,8 ADD BL,B INC BL ... Program zapisany w języku wysokiego poziomu charakteryzuje: ..., 48, 08, CA, 0B, FE, ... • 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 }; ... Kompilacja programów ..., 48, 08, CA, 0B, FE, ... ... MOV 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 MOV MOV MOV MUL ADD MOV AL,X BL,Y CL,Z CL,BL AL,CL X,AL lub MOV MOV MUL MOV ADD MOV AL,Y BL,Z AL,BL BL,X AL,BL X,AL lub MOV MUL ADD MOV AL,Z AL,Y CL,X X,AL • 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) Kompilator ... for (i=1; i<10, i++) { n=10+x*2 }; ... Przykład - algorytm Euklidesa 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 }; ... ... for (i=1; i<10, i++) { n=10+x*2 }; ... 24 - 15 = 9 Od większej liczby odejmujemy mniejszą. Liczby 24 i 15 przechodzą w 15 i 9. Ponieważ nie są one równe, wykonujemy dalej odejmowanie 15 - 9 = 6 Teraz otrzymujemy parę 9 i 6, która dalej nie składa się z liczb sobie równych, więc kontynuujemy odejmowanie. 9-6=3 Para 6 i 3 - odejmujemy dalej 6-3=3 Para 3 i 3 - otrzymaliśmy równość, więc liczba 3 jest największym wspólnym podzielnikiem liczb 24 i 15. 07.03.2017 Przykład - algorytm Euklidesa • Lista kroków – – – – – K01: K02: K03: K04: K05: Czytaj a,b Dopóki a ≠ b: wykonuj krok K03 Jeżeli a > b, to a ← a - b. Inaczej b ← b – a nwd ← a 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 mov mov cmp ecx, 24 eax, 15 ecx, eax jle sub jmp SHORT $L584 ecx, eax SHORT $L585 sub eax, ecx cmp jne xor ret ecx, eax SHORT $L591 eax, eax 0 $L591: 7e 04 2b c8 eb 02 $L584: 2b c1 $L585: 3b c8 75 f4 33 c0 c3 Algorytm Euklidesa – język Pascal 1 2 Od języka wysokiego poziomu do kodu maszynowego program Euclide; var m,n : integer; begin 3 4 end. ecx, 24 eax, 15 ecx, eax jle sub jmp SHORT $L584 ecx, eax SHORT $L585 sub eax, ecx cmp jne xor ret ecx, eax SHORT $L591 eax, eax 0 $L591: readln(m); readln(n); while m <> n if m > n then m := m – n else n := n - m; writeln(m); mov mov cmp $L584: $L585: 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 07.03.2017 Algorytm Euklidesa – Język C i Ada Język C Język ADA with Text_IO; use Text_IO; procedure Euklides is a, b : Integer; begin a := 153; b := 1326; while (a /= b) loop if (a > b) then a := a - b; else b := b - a; end if; end loop; int main(int argc, char* argv[]) { int a,b; printf("Podaj a.\n"); scanf("%d", &a); printf("Podaj b.\n"); scanf("%d", &b); while (a != b){ if (a > b) a -= b; else b -= a; } printf("NWD to: %d", a); return 0; } 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 Put_Line("Największy wspólny dzielnik (NWD) to: " & Integer'Image(b)); end; Historia języków programowania 2 COBOL (1959, USA) LISP (1959, USA) Algol 60 (1960) APL (1961, USA) FORTRAN IV (1962, USA) 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) Historia języków programowania 3 Snobol (1962, Bell Labs, USA) BASIC (1964, USA) PL/I międzynarodowy zespół publikuje specyfikację języka Algol 60 (1964, IBM, USA) Keneth Iversson publikuje specyfikację języka APL ukierunkowanego na zagadnienia matematyczne (1964, IBM, USA) publikacja specyfikacji czwartej wersji języka FORTRAN RPG LOGO (1966, 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ń publikacja specyfikacji języka RPG przeznaczonego do raportowania baz danych (skrót: Report Program Generator) język wzorowany na LISP-ie, ukierunkowany na nauczanie dzieci i osób poznających programowanie 07.03.2017 Historia języków programowania 4 Simula (1967, Norwegia) PASCAL (1968, Szwajcaria) BCPL (1969, Wlk.Brytania) Forth (1970, USA) Historia języków programowania 5 język wzorowany na Algolu 60; wprowadzenie pojęcia klasy i obiektu; ukierunkowany na symulacje (1970, XEROX, USA) Niklaus Wirth opracowuje język PASCAL do nauki programowania strukturalnego (1970, USA) język niskiego poziomu zawierający wyłącznie bardzo proste typy danych (skrót: Basic Combined Programming Language) (1970, USA) Smalltalk Icon B C Charles Moore opracowuje język wysokiego poziomu Forth stosujący odwrotną notację polską (1972, Bell Labs, USA) język wysokiego poziomu stosowany w badaniach nad sztuczną inteligencją (skrót: PROgramming LOGic) (1975, USA) Tiny BASIC PROLOG (1970, Francja) Historia języków programowania 6 BASIC (1975, USA) DSL 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 język będący poprzednikiem PostScriptu (1975, USA) ADA (1977, USA) Modula (1977, Szwajcaria) 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ść pierwszy język całkowicie obiektowy język programowania ukierunkowany na przetwarzanie tekstów i wzorców językowych 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 7 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) Perl (1987) udostępniona zostaje wersja 1.0 języka PERL opracowanego przez Larry’ego Walla i Randala Schwartza; (skrót: Practical Extract and Report Language) Java zaprezentowano język programowania i środowisko opracowywane od roku 1991 przez zespół Jamesa Goslinga w Sun Microsystems (1995, Sun, USA) C# (2000, Microsoft, USA) Microsoft prezentuje język C# dla platformy .NET będący kompilacją języków C++ i Java 07.03.2017 Dlaczego tak dużo języków programowania ? Rozwój języków programowania • Ewolucja • Osobiste preferencje • Specjalne zastosowania Obszary zastosowań • • • • • • • 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) Co czyni język popularnym ? • • • • • • • Efektywność kodu Łatwość nauki Łatwość implementacji Open Source Dostępność kompilatorów, bibliotek Ekonomia, patronat, inercja Składnia podobna do języka C 07.03.2017 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(n2-n) liczba przesunięć = 0.75(n2-n) złożoność obliczeniowa = O(n2) 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(n2) (wstawianie, wybieranie, bąbelkowe) Sprzęt 1mln op/s 100,000 op/s 10,000 op/s Czas 6 dni 2 miesiące 2 lata Zaawansowane metody sortowania O(n*log(n)) (Shell’a, przez podział, ... ) Sprzęt 1mln op/s 100,000 op/s 10,000 op/s Czas 12s 2min 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(n2) (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 1mln op/s 100,000 op/s 10,000 op/s Czas 0.5h 4.5h 2 dni (op/s – dotyczy operacji na elementach sortowanego zbioru, które mogą być złożone, a nie elementarnych operacji procesora. 07.03.2017 Przykład - Wieże Hanoi Wieże Hanoi: Rozwiązanie Stan początkowy Ruch 2 A B Ruch 1 Ruch 3 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 Wieże Hanoi - Złożoność • Dla trzech pierścieni należy wykonać 7 operacji. • W ogólnym przypadku: koszt wynosi 2N – 1 = O(2N) • Przy każdym zwiększeniu N o jeden, nakłady pracy zwiększają się dwukrotnie. Ruch 4 Ruch 5 Ruch 6 Ruch 7 Wieże Hanoi (2N) Dla N = 64 2N = 264 = 18,450,000,000,000,000,000 Dysponując komputerem mogącym wykonywać milion instrukcji na sekundę… • Wykonanie zajęłoby 584,000 lat ! • Przyrost pracy rośnie bardzo szybko! Ale może być jeszcze gorzej… 07.03.2017 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 O(•) n log n n2 n3 2n n! nn dla porównania: Algorytmy o nierozsądnej złożoności obliczeniowej mają złożoność wykładniczą i wyższą O (2N) O (N!) O (NN) 10 50 100 300 1000 33 100 1000 1024 3,6mld 10mld 282 2500 125000 16-cyfr 65-cyfr 85-cyfr 665 10,000 1,000,000 31-cyfr 161-cyfr 201-cyfr 2469 90,000 27mln 91-cyfr 9966 1,000,000 1mld (10-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 liczba protonów we wszechświecie – 126-cyfr liczba mikrosekund od powstania wszechświata – 24 cyfry Heurystyka – idea - przykład Heurystyka 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 • 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. 07.03.2017 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 wiadomo konkretnie jakich urządzeń ... Można założyć´ — takich jak my (bądź sprytniejszych od nas) • Systemy AI to systemy, które „zachowują się” jak ludzie. (Test Turinga) • Systemy AI to systemy, których budowa i działanie jest oparta o działanie mózgu. (Sieci Neuronowe) • Systemy AI to systemy, których działanie oparte jest o racjonalne zasady. (poprawne wnioskowanie) • Systemy AI to systemy, które w działaniu wykazują znamiona racjonalności. (poprawne wnioskowanie + optymalne decyzje) Systemy sztucznej inteligencji • • • • • • • Systemy ekspertowe Sieci neuronowe Systemy ewolucyjne (algorytmy genetyczne) Technologie oparte na logice rozmytej Algorytmy mrówkowe Teoria gier inne