Kodowanie genetyczne

Celem projektu było napisanie programu kodującego i dekodującego chromosomu, który służy do przechowywania liczby rzeczywistej. Przy realizacji projektu należało rozwiązać problem obliczania wymaganej długości chromosomu. Kodowanie wykorzystane w projekcie, jest bardzo istotnym etapem projektowania algorytmu genetycznego. Sposób zakodowania w chromosomie informacji o proponowanym rozwiązaniu wydatnie wpływa na szybkość i jakość znajdowanych wyników. Są dwa sposoby kodowania chromosomu: wektorem genów, z których każdy z nich może być jedno- lub wielobitową liczbą całkowitą, bądź też liczbą rzeczywistą i za pomocą drzewiastych struktur danych. W wyżej wymienionym projekcie został wykorzystany ten pierwszy.

Zaraz po uruchomieniu programu pojawia się menu, poprzez które następuje pierwsza interakcja użytkownika z komputerem. Do wyboru są trzy opcje:
1.       Kodowanie
2.       Dekodowanie
3.       Wyjście

Wszystko się powtarza w nieskończonej pętli while, która przy każdym obiegu czeka na wprowadzenie przez użytkownika cyfry z klawiatury i w zależności od podanej cyfry wywołuje konkretną funkcję, bądź przerywa pętlę i kończy program.

Wszystkie metody i zmienne zawarte zostały w głównej klasie Encoding. Klasa ta zawiera trzy publiczne metody (poza konstruktorami). Dwie służą do kodowania i dekodowania, a jedna do prezentacji otrzymanego chromosomu.

Obliczanie długości chromosomu jest pierwszym problemem, który należy rozwiązać przed przystąpieniem do dalszych etapów. Zadanie to można rozwiązać na dwa sposoby: policzyć logarytm z liczby: log2(dp*10d) = dch, lub tak jak to zostało zrobione w programie sprawdzić za pomocą funkcji przeliczającej liczbę dziesiętną na binarną, na ilu bitach musi zostać zakodowana liczba możliwych liczb mieszczących się w przedziale, przy zadanej precyzji. Do tego celu została wykorzystana prywatna metoda dec2bin(int x, int &) wywoływana przy powoływaniu obiektu do życia w konstruktorze, która przyjmuje dwa argumenty: pierwszy to liczbę do przeliczenia, drugi argument przez referencję, który jest licznikiem wymaganych bitów i zarazem długości chromosomu.

Kodowanie – po wybraniu tej opcji, użytkownik proszony jest o wprowadzenie potrzebnych danych. Samym procesem kodowania zajmuje się metoda encrypt(). Wykorzystuje ona wzór:

x = ( k – od ) * (2dch – 1 )/ dp

do zakodowania chromosomu, a następnie przybliża otrzymany wynik instrukcjami:

if( ( x –    (int)x ) < 0.5 )    X = x;

else X = (int)x + 1;

Jest to zabieg niezbędny ponieważ samo rzutowanie liczby typu double na integer, obciełoby tylko część ułamkową liczby.

Dekodowanie – podobnie jak wyżej, po wybraniu tej opcji użytkownik proszony jest o wprowadzenie potrzebnych danych, wraz z chromosomem do zdekodowania. Następnie metoda dencrypt() używając wzoru:

k = od + x * dp / (2dch – 1 )

odkodowuje chromosom.

Dokumentacja
Kod źródłowy
treść zadania

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s