------------- 4 szoty, pierwsze dwa majâ iôê, drugie dwa to WZORY dla obrazków do wykonania przez dziaî graficzny ------------------ STEROWANIE. PSIA KRZYWA Rozwój wspóîczesnej elektroniki i cybernetyki nasuwa pytanie: czy i w jakim stopniu komputer jest w stanie dorównaê mózgowi czîowieka lub go przewyûszyê. Chociaû komputery liczâ nieporównywalnie szybciej od nas, odpowiedú na to pytanie jest i dîugo bëdzie negatywna. Bolesîaw Szczerba Wyobraúmy sobie prostâ sytuacjë: rzut kamieniem w okno sâsiada. Ile skomplikowanych obliczeï musiaîby wykonaê komputer, aby okreôliê trajektorië lotu -- uwzglëdnienie ciëûaru kamienia, odlegîoôci, siîy i kierunku wiatru, oporów powietrza czy wreszcie grawitacji. A my po prostu podnosimy kamieï i rzucamy... Dlaczego nie musimy sië troszczyê o odpowiednie obliczenia? Po prostu kiedyô juû rzucaliômy kamieniem i NAUCZYLIÔMY SIË tego. Teraz jedynie przywoîujemy do pamiëci wyuczony kiedyô program. Ale to nie jest program na podobieïstwo programu komputerowego. Jest to algorytm otwarty, umoûliwiajâcy podejmowanie decyzji na bieûâco, uwzglëdnienie róûnych czynników czy wreszcie umoûliwiajâcy jego modyfikacjë w trakcie jego przebiegu. To wîaônie powoduje, ûe mózg czîowieka dîugo jeszcze bëdzie niedoôcignionym wzorem dla komputerów i oprogramowania. To wîaônie w nim zachodzâ wszystkie procesy podejmowania decyzji i uczenia sië na bîëdach. Nazywamy je adaptacyjnymi procesami sterowania. Dziëki nim potrafimy reagowaê na nieoczekiwane zdarzenia i podejmowaê optymalne decyzje. Oczywiôcie sposób, w jaki pracuje nasz mózg, od dawna stanowi wyzwanie dla naukowców (któû nie sîyszaî o sztucznej inteligencji), którzy próbujâ ludzkie myôlenie upchnâê w szablony algorytmów postëpowania. Caîy czas prowadzone sâ próby stworzenia algorytmów, które zastosowane w komputerach umoûliwiîyby uczenie sië, podejmowanie decyzji oraz sterowanie róûnymi procesami. Dziëki osiâgniëciom w tej dziedzinie staîy sië moûliwe np. loty w kosmos. Tam czîowiek jest zbyt wolny, aby podejmowaê decyzje, od których moûe zaleûeê ûycie zaîogi. To musi robiê komputer. Musi on sterowaê wieloma procesami na raz i byê przygotowany do natychmiastowej reakcji na OCZEKIWANE sytuacje. Niestety, na razie tylko oczekiwane lub przynajmniej czëôciowo przewidywalne. W nieoczekiwanych sytuacjach, na które program komputerowy nie jest przygotowany, czîowiek musi decyzje podejmowaê sam. I to (choê oczywiôcie nie tylko) stanowi o jego wyûszoôci. Oczywiôcie nie tylko my, ludzie, jesteômy tak cudownie wyposaûeni. Ewolucja wyposaûyîa teû zwierzëta w zdolnoôê podejmowania decyzji. Podobnie jak my potrafiâ one oceniaê sytuacjë, uczyê sië na bîëdach i podejmowaê decyzje w czasie rzeczywistym, tzn. wielokrotnie podczas danego procesu sterowania, nanoszâc poprawki do jego przebiegu. W wielu sytuacjach radzâ sobie z tym nawet lepiej (o wiele lepiej) od nas. Te niesamowite wrëcz czasem zdolnoôci okreôlamy jako instynkt. Jako przykîad procesu sterowania moûna przytoczyê nastëpujâcâ historyjkë. Jest sobie pies i zajâc. W pewnym momencie pies dostrzega zajâca i rzuca sië za nim w poôcig. Zajâc oczywiôcie nie jest gîupi i zaczyna uciekaê. Po jakim czasie pies dogoni zajâca i po jakiej trajektorii musi sië poruszaê w pogoni za celem, jeûeli znana jest prëdkoôê psa i zajâca i ich poczâtkowe poîoûenie? Problem ten jest oczywiôcie rozwiâzywany analitycznie, czyli za pomocâ równaï matematycznych, z których moûna wyznaczyê dokîadnâ trajektorië poôcigu, jak i czas jego ukoïczenia. Jednak sposób otrzymania rozwiâzania, jak i samo równanie krzywej, jest niedostëpny i nieatrakcyjny dla kogoô nie obeznanego z wyûszâ matematykâ, i sâdzë, ûe raczej nie zainteresuje Czytelnika. Poza tym naczelny surowo zakazaî mi wszelkich teoretycznych wywodów. Poniewaû nasz znajomy pies ani trochë nie zna sië na równaniach, a jednak bez problemu dogoni zajâca, spróbujmy zastanowiê sië nad jego postëpowaniem podczas poôcigu. Zastanówmy sië, jakie wielkoôci parametryzujâ nam caîy proces. Niewâtpliwie bëdâ to prëdkoôci poôcigu i ucieczki. Na pewno znaczenie ma teû poczâtkowe poîoûenie psa i zajâca. Ale jest jeszcze jedna waûna wielkoôê: czas reakcji psa na zmianë poîoûenia zajâca, czyli czas, po którym pies jest w stanie zauwaûyê znaczâcâ zmianë poîoûenia celu, na tyle znaczâcâ, ûe podejmie decyzjë zmiany kursu. Oznaczmy sobie ten czas przez >t0<. Pies znajduje sië w punkcie >P0< w odlegîoôci >b< od myôliwego >M< (rys. 1). Zajâc znajduje sië w punkcie >Z0< w odlegîoôci >a< od myôliwego. Jak postâpi pies po ujrzeniu zajâca? Oczywiôcie zacznie biec w jego kierunku. Zaîóûmy dla uproszczenia, ûe prëdkoôci psa i zajâca sâ staîe i wynoszâ odpowiednio >vp< i >vz<, zajâc zaô ucieka po linii prostej. Nasz pies biegnie tak dîugo, aû stwierdzi, ûe zajâc oddaliî sië od poczâtkowego poîoûenia na tyle, ûe trzeba zmieniê kurs. Ma to miejsce, gdy pies jest juû w punkcie >P1<, a zajâc w punkcie >Z1<. Pies przebyî wiëc odcinek >P0P1<, a zajâc odcinek >Z0Z1<. Poniewaû odcinki te przebyte zostaîy w czasie równym czasowi reakcji psa, ich dîugoôci wynoszâ odpowiednio >vp*t0< oraz >vz*t0<. Wtedy dopiero pies bierze poprawkë na nowe poîoûenie zajâca i biegnie dalej do punktu >P2<, przebywajâc takâ samâ drogë, jak poprzednio. Tu znowu stwierdza, ûe zajâc jest trochë dalej -- bierze wiëc kolejnâ poprawkë. I tak w kóîko, aû osiâgnie cel. Warto jeszcze zaznaczyê, ûe ostatni przebyty odcinek nie musi mieê wcale dîugoôci >vp*t0<, tylko moûe mieê mniejszâ -- pies moûe dopaôê zajâca w ostatniej fazie poôcigu w czasie krótszym od swojego czasu reakcji. Przypatrzmy sië dokîadnie rysunkowi. Tak na prawdë, to pies nie biegnie po krzywej, tylko po ÎAMANEJ, o dîugoôci tworzâcego jâ odcinka równej >vp*t0<. Albo inaczej: do czasu zauwaûenia zmiany poîoûenia celu pies porusza sië po odcinku o dîugoôci wîaônie >vp*t0<. Zajâc wyrywa przed siebie caîy czas, poruszajâc sië po prostej i w czasie >t0< przebywajâc drogë równâ >vz*t0<. Zastanówmy sië teraz, ile moûe wynosiê czas reakcji psa. Jeôli czas ten wynosiîby np. 10 sekund, to wtedy trajektoria ruchu autentycznie byîaby îamanâ, bo do czasu reakcji na nowe poîoûenie celu pies przebiegîby kilkanaôcie metrów. Ale nasz znajomy nie jest anemikiem -- ten czas to w rzeczywistoôci uîamek sekundy -- powiedzmy 0.1 sekundy lub mniej! W tym czasie pies nie przebiegnie wiëcej niû póî metra i w ten sposób îamana skîada sië z duûej liczby bardzo krótkich odcinków -- tym krótszych, im szybciej pies reaguje na zmiany poîoûenia zajâca. Moûna wiëc ômiaîo powiedzieê, ûe pies porusza sië po krzywej. Matematycy nadali jej nazwë "psia krzywa", a problem doczekaî sië peînych honorów zagadnienia matematycznego. Jak juû wspomniaîem, rachunkowe rozwiâzanie problemu nie naleûy do prostych, ale przedstawionâ sytuacjë moûna bez problemu zasymulowaê na komputerze. Bëdzie to oczywiôcie Amiga, a uûytym jëzykiem programowania bëdzie C. Przepraszam wszystkich fanów AMOS-a, ale ja AMOS-a nie lubië (dlaczego, o tym moûe innym razem). Osobiôcie preferujë C, gîównie ze wzglëdu na jego prostotë i uniwersalnoôê. Poza tym, jeôli sië uwaûa, ûeby nie wleúê bezpoôrednio w system, to kody úródîowe w tym jëzyku moûna przenosiê bez problemów (ewentualnie z niewielkimi poprawkami) miëdzy Amigâ i pecetem. Poza tym kompilator C jest dostëpny w wersji dla Amigi i z jego zdobyciem nie ma ûadnych problemów (moûe inaczej: nie sâ to problemy wiëksze niû w wypadku jego niebieskiego odpowiednika...). Jest tego caîa kupa -- od komercyjnych (SAS, Aztec) do shareware (DICE) i podobno public domain. Poniûej lub powyûej (zaleûy, gdzie wydrukujâ) przedstawiam kompletny listing programu, symulujâcego omówiony proces sterowania. Zakîadam, ûe: 1. Czytelnik ma dostëp do kompilatora C. Proponujë SAS/C co najmniej w wersji 5.10, a najlepiej 6.5. Uûycie innych kompilatorów jest oczywiôcie moûliwe, jednak nie przetestowane przeze mnie. Mogâ sië wiëc pojawiê (niegroúne zazwyczaj) ostrzeûenia. Wiâûe sië to najczëôciej nie tyle z samym programem, ile z konwersjâ typów oraz ustawieniem ôrodowiska. Niech nikt sië nie dziwi, ûe mu moje programy nie dziaîajâ, jak np. nie ustawi MATH=STANDARD w preferencjach. 2. Czytelnik ma podstawowâ wiedzë dotyczâcâ programowania i wie, co to sâ pëtle (choêby z BASIC-a FOR ... NEXT) czy instrukcje warunkowe (IF). 3. Czytelnik ma pojëcie o C, wiëc nie bëdë tîumaczyî, co robiâ nawiasy z dwoma ôrednikami przy 'for', albo po co dwa plusy koîo siebie. Poniûej podajë zawartoôê pliku SCOPTIONS dla kompilatora SAS/C 6.5. MATH=STANDARD ERRORREXX OPTIMIZE LINK OPTIMIZERTIME Jeûeli masz procesor, np. MC68020 (EC lub peîny), moûesz wpisaê jeszcze dodatkowâ linië: CPU=68020 Podajesz oczywiôcie ten, który posiadasz (MC68010, 68020, 68030 lub 68040). Schemat algorytmu w zasadzie omówiîem -- dla peînej kultury przedstawiam go na rysunku 2. Przejdúmy do samego programu. Jest on niesamowicie uproszczony, wynika to jednak tylko z ograniczonego miejsca, jakim dysponujë. Na uwagë zasîuguje przede wszystkim fakt, ûe przed postawieniem punktu na ekranie trzeba odpowiednio przekonwertowaê wspóîrzëdne. Ukîad wspóîrzëdnych ekranu róûni sië bowiem od ukîadu kartezjaïskiego. Niezbëdnâ konwersjë przeprowadzajâ funkcje x() oraz y(). Sama symulacja polega na rysowaniu odcinków o odpowiedniej dîugoôci, ustawionych w odpowiednim kierunku. Trzeba stworzyê funkcjë, która narysuje nam odcinek o zadanej dîugoôci (równej vp*t0), o jednym koïcu w punkcie aktualnego poîoûenia psa. Odcinek musi byê oczywiôcie skierowany w stronë aktualnego poîoûenia zajâca. Wspóîrzëdne drugiego punktu trzeba policzyê i poîâczyê odcinkiem z aktualnym poîoûeniem psa. Jak policzyê wspóîrzëdne drugiego punktu? Twierdzenie Pitagorasa * twierdzenie Talesa * rachunek wektorowy z I klasy liceum. W ostatecznoôci popatrz na listing programu. Robi to funkcja odcinekP(). Analogiczna funkcja dotyczâca zajâca to funkcja odcinekZ(), z tym ûe jest ona o tyle prostsza, ûe rysowane odcinki sâ caîy czas równolegîe. W wypadku stwierdzenia, ûe dîugoôê odcinka (vp*t0, czyli dîugoôê tworzâcej îamanâ) jest wiëksza niû odlegîoôê psa od zajâca, rysowany jest odcinek krótszy, îâczâcy bezpoôrednio punkty ich poîoûeï. Serce algorytmu to pëtla. Jest ona powtarzana tak dîugo, aû pies dogoni zajâca lub wylezie za ekran. Warto równieû zaznaczyê, ûe nic nie stoi na przeszkodzie, aby jeszcze zajâc goniî np. za ûabâ, ale byîaby heca, pies goni zajâca, zajâc ûabë, a ûaba wyrywa przed siebie. Funkcjë odcinekZ() trzeba by wówczas przerobiê na podobieïstowo funkcji odcinekP() z tym, ûe trzeba celowaê w ûabë, która przejmuje dotychczasowâ rolë zajâca. Dodatkowo trzeba stworzyê funkcjë odcinekÛ(), przejmujâcâ dotychczasowâ rolë funkcji odcinekZ(). Zajâc nie startuje, oczywiôcie, wtedy z osi X (tzn. moûe, ale nie bëdzie zabawy, bo bëdzie goniî ûabë po prostej). Modyfikacja programu to 3 minuty, z czego 2 na kompilacjë. Na rysunkach 3. i 4. przedstawiam przykîadowe krzywe i parametry wywoîania. Zwróê uwagë, ûe na rysunku 3. wyraúnie widaê, iû w ostatniej fazie poôcigu pies wîaôciwie wlazî zajâcowi na ogon i koïcówkë przebyî, goniâc go po prostej. Wyraúniej to widaê, gdy prëdkoôê psa jest nieznacznie tylko wiëksza od prëdkoôci zajâca. Na rysunku 4. pies dogoniî zajâca szybciej, gdyû zajâc byî bliûej niû poprzednio. A moûe znajdâ sië odwaûni, gotowi wziâê swojâ Amy i zaprezentowaê program na lekcji matematyki czy informatyki w liceum? To nic nie kosztuje, a moûna chyba w ten sposób urozmaiciê trochë wiejâce nudâ lekcje matematyki czy zrobiê zajëcia z informatyki na komputerze, a nie na Meritum czy pececie z herculesem, stawiajâc na ekranie punkty o wielkoôci ziarna grochu. Napiszcie, co o tym sâdzicie. A teraz zadanie domowe, zwiâzane z treôciâ artykuîu. Wyobraúmy sobie N-kât foremny o boku >a< (np. 5-kât foremny lub 100-kât foremny). W kaûdym wierzchoîku umieszczona jest rakieta samonaprowadzajâca wycelowana w sâsiada. Wystrzelamy wszystkie rakiety jednoczeônie -- kaûda ma znanâ prëdkoôê >v<. W jakim miejscu (he, he) i po jakim czasie (juû nie he, he) rakiety sië zderzâ? Zadanie, wbrew pozorom, moûliwe do rozwiâzania na poziomie liceum. Tyle. --------------czy to podajemy? tak.------ Bolesîaw Szczerba e-mail: zfjmgr@usctoux1.cto.us.edu.pl