PO2017: Wejściówka na lab.9

Zaprojektuj klasę, reprezentującą figurę na płaszczyźnie: trapez równoramienny.

Zaproponuj zestaw pól dla tej klasy, pozwalający na jednoznaczne określenie jej położenia na płaszczyźnie względem początku układu współrzędnych oraz jednoznacznie określający jej rozmiary (np. długości boków, podstawy, itd.). Dla uproszczenia przyjmij, że trapez jest zawsze rysowany w określonej pozycji, np. podstawą równolegle do osi X. Projektując zestaw pól postaraj się zminimalizować ich liczbę. Np. gdyby to dotyczyło kwadratu, to do określenia położenia wystarczą współrzędne jednego z wierzchołków, np. lewy-dolny, a do określenia rozmiarów – długość jednego boku. Za pomocą tych wartości jesteśmy już w stanie łatwo wyznaczyć w kwadracie współrzędne wszystkich pozostałych wierzchołków oraz długości pozostałych boków.

Zbiór pól reprezentujących położenie trapezu powinien być rozłączny ze zbiorem pól reprezentujących jego rozmiary, tak aby ewentualne operacje zmiany położenia nie obejmowały modyfikacji pól rozmiaru, a np. skalowanie nie modyfikowało pól położenia.

Wszystkie pola mają być niedostępne z zewnątrz (zadeklarowane jako private).

Do klasy dodaj trzy metody zadeklarowane jako publiczne:

  1. Pierwsza – ma ustalać położenie i rozmiary figury, tj. modyfikować wartości pól opisujących położenie i rozmiar. Nowe wartości dla pól powinny być podawane w argumentach wywołania metody. Metoda powinna kontrolować poprawność wartości podawanych w argumentach wywołania i jeżeli są nieprawidłowe (np. ujemne długości boków) powinna je zastępować bezpiecznymi wartościami domyślnymi.
  2. Druga – powinna wypisywać wartości wszystkich pól figury w oknie konsoli oraz dodatkowo wypisywać aktualne współrzędne wszystkich jej wierzchołków wyliczone na podstawie wartości pól.
  3. Trzecia – powinna wyrażać przekształcenie symetrii osiowej względem prostej opisanej równaniem x=n, tj. jako argument powinna przyjmować wartość rzeczywistą n, a w swoim działaniu powinna przeliczyć wszystkie wartości tych i tylko tych pól, które są odpowiedzialne za położenie tak, aby w rezultacie tego działania przyjęły one wartości określające położenie figury po przekształceniu.

Napisz program, który w funkcji main deklaruje obiekt typu trapez, po czym:

  1. inicjalizuje go wartościami pobranymi od użytkownika, tak aby powstał prawidłowy trapez, korzystając z metody nr 1,
  2. wywołuje na rzecz tego obiektu metodę nr 2 wypisującą wszystkie pola i współrzędne w oknie konsoli,
  3. prosi użytkownika o podanie argumentu dla metody symetrii osiowej i wywołuje na rzecz tego obiektu metodę nr 3,
  4. ponownie wywołuje na rzecz tego obiektu metodę wypisującą wszystkie pola i współrzędne w oknie konsoli, aby zobaczyć nowe położenie figury,
  5. ponownie wywołuje na rzecz tego obiektu metodę symetrii osiowej z tym samym argumentem co poprzednio,
  6. a na koniec jeszcze raz wywołuje metodę wypisującą wszystkie pola i współrzędne w oknie konsoli, aby sprawdzić, czy figura wróciła na swoje miejsce.

BBOB – przypomnienie

Przypominam, że jutro rano czekam na dokument od Państwa z wynikami testowego uruchomienia waszych algorytmów w środowisku BBOB. Są to wyniki wstępne, które nie będą podlegały ocenie ani porównaniom, ale będą dowodem na to, że poprawnie zaimplementowaliście wasz algorytm, oraz że ten algorytm rzeczywiście szuka optimów w testowym środowisku.

Zwracam Państwa uwagę na reguły wywoływania funkcji ewaluacyjnej w waszych programach, a szczególnie na unikanie zbędnych wywołań (np. automatycznego wywoływania przy selekcji osobników, tworzeniu kopii osobnika, albo po krzyżowaniu a przed mutacją, kiedy wiadomo, że postać rozwiązania może jeszcze i tak ulec zmianie), żeby bez potrzeby nie tracić przyznanego budżetu. Aby tego uniknąć należy klasę reprezentującą osobnika wyposażyć w pole przechowujące jego wartość i aktualizować to pole tylko wtedy, kiedy rzeczywiście jest potrzebna bieżąca wartość rozwiązania a doszło wcześniej do modyfikacji genotypu.

Dokument, na który czekam, musi być podpisany – w tym celu należy napisać swoje imiona i nazwiska w miejscu tuż pod tytułem, np.: \author{Krzysztof Trojanowski i Adam Nowak}. Proszę też usunąć znak procent w linijce z tekstem % \section{Algorithm Presentation} i poniżej zamieścić krótki opis tego, jak działa wasz algorytm. Żeby w dokumencie poprawnie wyświetlały się polskie litery, w sekcji PREAMBLE na początku pliku należy dopisać dwie linijki: \usepackage{polski} i \usepackage[utf8]{inputenc}.

BBOB – terminarz rozliczeń

Informuję, że wszystkie zespoły przesłały mi poprawny dokument z wynikami testowego działania środowiska BBOB.

We wtorek, 25 kwietnia odbędzie się kolokwium nr 1, tj. odbędą się publiczne prezentacje (z wykorzystaniem projektora) uzyskanych wyników, wraz z ich omówieniem i dyskusją. W związku z tym obecność wszystkich zespołów w pełnym składzie jest obowiązkowa. Im lepszy będzie wynik algorytmu strategii ewolucyjnych, tym wyższa ocena z pierwszego kolokwium. Aby zostać dopuszczonym do prezentacji, należy najpóźniej w piątek, 21.04 rano, wysłać mi mailem wersję dokumentu z wstępnymi wynikami algorytmu. Opóźnienie będzie skutkowało obniżeniem oceny. Przesłanie mi tego dokumentu zbyt późno, tj. w poniedziałek, 24.04, może skutkować niedopuszczeniem do prezentacji.

BBOB, pierwsze podejście

Ponieważ większości udało się zrealizować zadanie, a tym, którym się nie udało, brakuje niewiele, proponuję przedłużenie terminu do dziś (pon., 10.04) do godz. 20:00.

Przypominam, że aby uzyskać końcowy dokument pdf, należy (zgodnie z opisem w http://coco.lri.fr/downloads/download15.02/bbobdocexperiment.pdf):

  1. wygenerować podstawową strukturę folderów na dane wynikowe (uruchomić pyton’owski skrypt „createfolders.py”), skompilować program, uruchomić i poczekać aż zakończy działanie,
  2. uruchomić skrypt „rungeneric1.py mydata”, gdzie „mydata” to nazwa folderu, w którym znajdują się wszystkie pozostałe podfoldery z plikami wynikowymi (ten skrypt wygeneruje rysunki pdf z wykresami do folderu „ppdata”),
  3. skopiować plik latex’owy (z archiwum: http://coco.lri.fr/downloads/download15.02/bbobexp15.02.tar.gz) „template1generic.tex” („templateBBOBarticle,tex” też może być) do folderu, w którym znajduje się folder „ppdata”, albo skopiować gdziekolwiek, po czym odpowiednio ustawić w pliku „template1generic.tex” ścieżkę dostępu do folderów z rysunkami w linijce cytowanej poniżej:
    \newcommand{\bbobdatapath}{ppdata/} % default output folder of rungeneric.py
  4. skompilować plik latex poleceniem „pdflatex template1generic”

Aby w/w kroki zakończyły się powodzeniem, należy na komputerze zainstalować:

  1. środowisko do kompilacji kodu programu
  2. środowisko python https://www.python.org/
  3. środowisko latex np. https://miktex.org/
  4. przyda się też GUI do Miktex’a, np. http://www.winedt.com/ (wersja 30-dniowa, w zupełności wystarczy), żeby nie trzeba było wywoływać latexa z linii poleceń i żeby łatwiej było edytować plik latex „template1generic”.

Miktex po instalacji dysponuje tylko minimalnym zbiorem bibliotek, ale w razie potrzeby sam pobiera z sieci te, których nie zainstalował (o ile go firewall nie powstrzyma). Gdyby nie pobierał, albo pobierał powoli, trzeba uruchomić „Maintenance|Miktex Package Manager” i wskazać inne „repository” (serwer z bibliotekami latexa do pobrania) w liście dostępnych.

Jakbym czegoś nie doszczegółowił w objaśnieniach powyżej, proszę pytać.

PO2017: Wejściówka na lab.8

Napisz program, który pobiera od użytkownika jego nick oraz niewielką liczbę naturalną. Umieść w kodzie asercję, która sprawdza czy liczba jest rzeczywiście naturalna. Następnie program przystępuje do testu zręczności użytkownika: losuje znak alfanumeryczny występujący na klawiaturze (nie losuje znaków interpunkcyjnych, matematycznych i pozostałych „symboli”) i wypisuje go w oknie konsoli, po czym oczekuje na naciśnięcie przez użytkownika klawisza odpowiadającego wypisanemu znakowi. Wtedy natychmiast wypisuje następny znak i ponownie czeka na reakcję użytkownika. Jeżeli użytkownik się pomylił, również natychmiast wypisuje następny znak. Program wykonuje test tyle razy, ile wynosiła pobrana liczba naturalna.

Po zakończeniu testu wyświetlany jest czas trwania testu (liczony od wypisania pierwszej litery aż do ostatniej odpowiedzi użytkownika) i liczba trafnych odpowiedzi. Do pomiaru czasu użyj funkcji time i difftime. Dodatkowo zostaje otwarty plik txt o nazwie takiej jak podany nick, tj. „nick.txt” i do niego w kolejnym wierszu są dopisywane uzyskane wyniki (czas i liczba trafień). Jeżeli takiego pliku jeszcze nie ma, program wypisuje w oknie konsoli komunikat o tym, że taki plik jest właśnie zakładany. W komunikacie podana jest pełna ścieżka do folderu, w którym plik zostanie utworzony wraz z jego nazwą. Hint: pełną ścieżkę do bieżącego folderu można pobrać z argv[0].

Każda akcja jest odnotowywana w pliku „log.txt”: pobranie nicka i liczby naturalnej, wypisanie litery na ekranie, odpowiedź użytkownika (wraz z informacją, czy była poprawna). Każdy wpis w pliku „log.txt” zaczyna się od daty i czasu dokonania wpisu z dokładnością do sekund. Następnie wypisywany jest komunikat o zdarzeniu. Plik „log.txt” należy otwierać tak, aby nie stracić jego dotychczasowej zawartości i aby nowe informacje były dołączane na końcu.

Uwagi:

  1. Zaproponuj własny sposób sprawdzenia, czy plik o podanej nazwie istnieje. Następnie napisz funkcję, która jako argument wywołania przyjmuje nazwę pliku, a zwraca wartość zero, jeżeli pliku nie ma, oraz 1 – jeżeli istnieje. Użyj tej funkcji do sprawdzenia, czy plik „nick.txt” istnieje.
  2. Do sprawdzania błędów związanych z dostępem do pliku „log.txt” wykorzystaj stałą errno, a do generowania komunikatów – funkcje strerror i perror. Wszelkie komunikaty o sytuacjach błędnych, jakie wystąpiły w trakcie pracy programu związane np. z dostępem do plików, wysyłaj do standardowego strumienia dla komunikatów o błędach stderr. Hint: aby wygenerować np. błąd 13 (brak prawa dostępu do pliku) wystarczy wcześniej otworzyć plik za pomocą edytora typu MS Word albo OpenOffice Writer i pozostawić otwartym. Wtedy próba otwarcia tego pliku w trybie „w”, „a” lub „a+” przez nasz program powinna zakończyć się niepowodzeniem.