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.