Projekt z Algorytmów Genetycznych 2007/2008 Założenia
Transkrypt
Projekt z Algorytmów Genetycznych 2007/2008 Założenia
Projekt z Algorytmów Genetycznych 2007/2008 wersja nr 5 ZałoŜenia podstawowe Zadanie składać się będzie z 300 etapów. KaŜdy etap polegać będzie na rozwiązaniu pojedynczego problemu znalezienia drogi robota z punktu A do punktu B. Dane kaŜdego problemu będą zapisane w pliku w postaci macierzy M wierszy na N kolumn. Pierwszy wiersz pliku zawierać będzie liczbę wierszy, a drugi – liczbę kolumn. Elementy macierzy mają następujące znaczenie: 1 – 9 cyfry oznaczające trudność pokonania odcinka, wpływają na czas przejścia drogi (kwadratowo). Na przykład fragment drogi: 143 z uwzględnieniem trudności pokonania odcinka ma długość 1*1+4*4+3*3=26. A – start B – meta Przykład: 9 20 11111111111111111111 11111111111111111111 1A111123211111111111 11111123211111111111 11111123211111911111 11111111111115911111 11111111111115911111 111111111111159111B1 11111111111111111111 Program powinien wczytać plik z danymi zadania na standardowe wejście (scanf). Jako rezultat program powinien wygenerować na standardowe wyjście (printf) rozwiązanie kaŜdego etapu. Zawarte ono będzie w trzech wierszach, kolejno: czas zegara systemowego liczony tuŜ przed odczytem danych wejściowych, trasa robota w postaci sekwencji ruchów, czas zegara systemowego liczony tuŜ po wygenerowaniu trasy. W sekwencji ruchów dozwolone są następujące znaki: 1 – do góry 2 – w prawo 3 – do dołu 4 – w lewo Programy będą uruchamiane przez skrypt nadzorujący za pomocą komendy typu cat testy/xxx.in | bin/kowalski >> kowalski.out gdzie testy/xxx.in – plik z etapem nr xxx, bin/kowalski – program uczestnika o nazwisku kowalski, kowalski.out – plik z wynikami (powinien zawierać 300x3=900 wierszy). Czas zegara powinien być wygenerowany za pomocą procedury: #include <time.h> int print_time (void) { clock_t t; double cpu_time_used; t = clock(); cpu_time_used = ((double) t) / CLOCKS_PER_SEC; // wersja printf dla C // printf("%.2lf\n", cpu_time_used); // wersja cout dla C++ cout << cpu_time_used << endl; return 0; }; Wersja dla Javy: public void printTime(){ System.out.printf("%.3f\n", System.currentTimeMillis()/1000.0); } Reguły turnieju Turniej rozgrywany będzie w dwóch kategoriach: dla programów napisanych w języku C/C++ oraz dla progamów w języku Java. Programy powinny dać się skompilować w pracowni komputerowej w pokoju 231GF. W przypadku liczby uczestników (w danej kategorii) większej od liczby dostępnych komputerów, uczestnicy podzieleni na dwie (trzy) grupy rozegrają eliminacje. Cztery (trzy) najlepsze osoby z kaŜdej grupy awansują do finału. Odbędą się trzy tury, w których kaŜdy uczestnik wylosuje komputer i odbędzie się sesja obliczeniowa. Programy oceniane będą następująco: Po kaŜdym etapie sporządzone zostaną dwa rankingi: A) najkrótszych dróg i B) najkrótszych czasów obliczeń. W rankingu A program, który poda najdłuŜszą, ewentualnie błędną drogę uzyska 1 pkt. Kolejny lepszy program uzyska 2 pkt, itd. Podobnie w rankingu B, najwolniejszy program uzyska 1 pkt, najszybszy n pkt, gdzie n-liczba uczestników. Całkowita nota programu w pojedynczym etapie liczona będzie następująco: nota = 0.8 * liczba punktów w rankingu A + 0.2 * liczba punktów w rankingu B BieŜące wyniki będzie moŜna śledzić na ekranie komputera oceniającego. Reguły programów 1. Program nie moŜe korzystać z metod enumeracyjnych. Hybrydowe AG są niedozwolone (w razie wątpliwości proszę o odpowiednio wczesne konsultowanie się z jury). 2. Istnieje pełna dowolność konstrukcji algorytmów genetycznych (metoda kodowania, liczebność populacji, liczba pokoleń) 3. Trasa przechodząca poza planszą oznacza etap nieukończony. Podpowiedzi 1. Rozmiar liniowy macierzy wejściowej ∈ [20,500]. 2. Po kaŜdych 50 etapach nastąpi ostra zmiana cech zadania (duŜa zmiana rozmiaru macierzy, liczby i złoŜoności przeszkód). 3. Aby najlepiej dopasować stosunek szybkości programu do jakości (tak, by uzyskać jak najoptymalniejszą notę), zaleca się porównanie ze sobą kilku wariantów własnego programu i wybranie do turnieju najlepszego z nich. Nagrody: I miejsce – 15+2 punktów do oceny z przedmiotu. II miejsce – 15+1 III miejsce – 15 IV miejsce – 14 V miejsce – 13 VI miejsce – 12 VII miejsce – 11 VIII miejsce – 10 IX miejsce – 9 X miejsce i dalsze – 8 Program, który nie ukończy więcej niŜ połowy etapów, uzyska 0 pkt. Jednoosobowe jury ustanowi trzy nagrody, odpowiednio +3 pkt, +2 pkt i +1 pkt, dla programów, w których zaimplementowano najciekawsze rozwiązania.