890 likes | 1.14k Views
Programowanie genetyczne (Genetic Programming). Prof. Dr hab. Marek Rudnicki. Podłoże powstania GP. Trend w informatyce dążący do tego, aby określać komputerowi CO ma być zrobione, zamiast JAK to ma być zrobione.
E N D
Programowanie genetyczne(Genetic Programming) Prof. Dr hab. Marek Rudnicki
Podłoże powstania GP • Trend w informatyce dążący do tego, aby określać komputerowi CO ma być zrobione, zamiast JAK to ma być zrobione. • Pisanie bardzo złożonych programów komputerowych jest zadaniem trudnym, żmudnym i obfitującym w pomyłki programisty. • Próbą rozwiązania problemu jest programowanie genetyczne (GP).
Czym jestprogramowanie genetyczne? Programowanie genetyczne to: • metoda automatycznego generowania rozwiązania problemu (programu komputerowego) na podstawie jego wysokopoziomowego opisu. • rozszerzenie, uogólnienie algorytmów genetycznych (GA) oparte na pomyśle zastosowania struktur drzewiastych do kodowania informacji genetycznej dla poszczególnych osobników.
Pomysł GP • W 1989 roku John R. Koza wygłosił pierwszy referat na temat GP. • W roku 1992 opublikował książkę uważaną do dziś za „biblię” programowania genetycznego: Genetic Programming: On the Programming of Computers by Means of Natural Selection. • Pomysł programowania genetycznego jest chroniony patentem.
Charakterystyka GP • Algorytm ewolucyjny bardzo podobny do GA. • Osobnikami są programy komputerowe zapisane w postaci drzewa. • Poszczególne osobniki (programy) wybierane są do reprodukcji w oparciu o funkcję przystosowania. • Operatory genetyczne obejmują: mutację, rekombinację, reprodukcję i inne specyficzne dla rozwiązywanego problemu operacje.
Przykładowy prosty program * 2 + 14 x Powyższy program reprezentuje wyrażenie: (14+x)*2
Przykład nieco bardziej złożony IF < + y = x 2 x y Powyższy program można zinterpretować jako odpowiednik następującego kodu w C++: if (x+2<y) x=y;
Elementy struktury drzewiastej • terminale • elementy stanowiące liście drzewa • reprezentują stałe lub zmienne programu • przykłady: „2”, „3.14159”, „x”, „y” • funkcje • oznaczają funkcje programu • argumenty funkcji znajdują się w poddrzewach • przykłady: operacje arytmetyczne, funkcje trygonometryczne, instrukcje warunkowe
Algorytm GP • Losowo wygeneruj początkową populację programów. • Dopóki nie jest spełniony warunek zakończenia programu generuj kolejne generacje (pokolenia): • wylicz dla każdego osobnika odpowiadającą mu wartość funkcji przystosowania. • wybierz losowo operację genetyczną (reprodukcja, mutacja, rekombinacja). • wykonaj operację genetyczną na wybranych osobnikach z aktualnego pokolenia. Przy wyborze osobników stosuj funkcję przystosowania. • przenieś potomstwo do nowego pokolenia.
Mutacja punktowa + + * + * * - - - - * - * - x 1 x 1 x 1 x 1 - - x 1 x 1 - - x 1 x 1 x 1 x 1
Permutacja + + * + * * - - - - * - * - x 1 x 1 x 1 x 1 - - x 1 x 1 - - x 1 1 x x 1 x 1
Hoist + * * * - - - - * - x 1 x 1 x 1 x 1 x 1 - - x 1 x 1
Mutacja ekspansywna + + * * * * - - - - * - * - x x 1 x * x 1 - - x 1 x 1 - - 1 x 1 x 1 x 1 x 1 - - x 1 x 1
Mutacja niszcząca poddrzewo + + * * * * - - - - x - * - x 1 x 1 x 1 x 1 x 1 x 1 - - x 1 x 1
Mutacja poddrzewa + + - * * * x 1 - - * - * - x 1 x 1 - - x 1 x 1 - - x 1 x 1 x 1 x 1
Algorytm GP na diagramie źródło: www.geneticprogramming.com
Losowe generowanie drzew • Losowe generowanie drzewa polega na losowym wytworzeniu struktury reprezentującej poprawny program. • Losujemy spośród wszystkich dopuszczalnych funkcji i wszystkich dopuszczalnych terminali. • Aby nie generować nieskończenie dużych drzew z góry określamy maksymalny ich rozmiar lub głębokość.
Funkcja przystosowania • Określa jak dobrze dany program rozwiązuje postawiony przed GP problem. • W oparciu o wartość tej funkcji następuje wybór osobników do operacji genetycznych. • Prawdopodobieństwo wyboru i-tego osobnika wyraża się wzorem:
Inne metody wyboru osobników • metoda turniejowa • losowy wybór kilku (co najmniej dwóch) osobników i wybór tego spośród nich, który jest najlepiej przystosowany • metoda rankingowa • wyboru dokonujemy nie w oparciu o wartość funkcji przystosowania, ale w oparciu o miejsce w rankingu ułożonego według wartości tej funkcji • nie liczy się wartość, liczy się miejsce w rankingu
Mutacja • Operację mutacji wykonujemy w następujący sposób: • Wybieramy losowo wierzchołek drzewa. • Odcinamy z drzewa wybrany wierzchołek wraz z jego potomkami. • W miejscu usuniętego wierzchołka generujemy losowo nowe poddrzewo. • Możemy też mutować tylko pojedyncze terminale i pojedyncze funkcje.
Mutacja źródło: www.genetic-programming.com
Rekombinacja • Rekombinacja w GP odbywa się następująco: • Wybieramy losowo wierzchołki w obu drzewach. • Odcinamy od drzew macierzystych poddrzewa rozpoczynające się wybranymi wierzchołkami. • Do pierwszego drzewa w miejsce usuniętego wierzchołka wstawiamy poddrzewo wycięte z drugiego drzewa i odwrotnie. • Czasem stosuje się wersję uproszczoną, kiedy to zmienia się poddrzewo u tylko jednego z biorących udział w rozmnażaniu osobników.
Rekombinacjawersja uproszczona źródło: www.genetic-programming.com
Rekombinacja rodzice potomstwo źródło: www.geneticprogramming.com
Jeszcze o rekombinacji • Rekombinacja w GP ma następującą ciekawą własność: Rekombinacja dwóch identycznych osobników rodzicielskich z reguły daje parę potomków różniących się od rodziców. Wystarczy, aby wylosowano dwa różne wierzchołki jako punkty krzyżowania.
Reprodukcja • Reprodukcją nazywamy zwykłe skopiowanie osobnika tak, że bez zmian przechodzi on do nowego pokolenia. • Tak, jak rekombinację można uznać za odpowiednik płciowego rozmnażania się organizmów żywych, tak reprodukcję można przyrównać do procesu rozmnażania bezpłciowego.
Prawdopodobieństwooperacji genetycznych • Główną i dominującą operacją genetyczną jest rekombinacja. Powinna ona zachodzić z prawdopodobieństwem 85-90%. • Mutacja powinna być operacją zachodzącą stosunkowo rzadko. Jej prawdopodobieństwo powinno wynosić około 1%. • W pozostałych przypadkach stosujemy reprodukcję.
Architektura programu • W strukturze drzewiastej można zapamiętywać struktury typowe dla programów takie jak: • instrukcje warunkowe • pętle • funkcje zdefiniowane w samym programie (podprocedury) • Można specjalnie z myślą o tych strukturach zdefiniować i stosować dodatkowe operacje genetyczne.
Podprocedury źródło: www.genetic-programming.com
Duplikacja podprocedury • Polega na rozdzieleniu wywoływanej więcej niż raz w programie podprocedury na dwie osobne. • Utworzone w ten sposób dwie kopie będą mogły się różnicować (specjalizować) w kolejnych operacjach genetycznych. • Każda kopia podprocedury otrzymuje osobną nazwę.
Duplikacja podprocedury źródło: www.genetic-programming.com
Duplikacjaargumentów podprocedury • Polega na zwiększeniu liczby argumentów przyjmowanych przez podprocedurę poprzez zduplikowanie jednego z nich. • W definicji funkcji losowo rozdziela się wystąpienia zmiennej między starą i nową kopię argumentu. • W wywołaniach procedury również duplikujemy argumenty.
Duplikacjaargumentów podprocedury źródło: www.genetic-programming.com
Utworzenie podprocedury • Tworzymy podprocedurę poprzez wyodrębnienie sekwencji operacji z wybranej części drzewa. • Podprocedurze nadajemy unikalną nazwę. • Drzewo modyfikujemy tak, aby wynik wykonania programu przed dokonaniem zmiany zgadzał się z wynikiem po jej dokonaniu.
Utworzenie podprocedury źródło: www.genetic-programming.com
Usuwanie podproceduri usuwanie ich argumentów • Operacje odwrotne do duplikacji podprocedur i duplikacji argumentów podprocedur. • Prowadzą do zmniejszenia złożoności struktury programu.
Usuwanie podprocedury źródło: www.genetic-programming.com
Usuwanieargumentów podprocedury źródło: www.genetic-programming.com
Przykład: GP w języku C • Regresja symboliczna
Przykładowe wyniki • Przeprowadzono 50 generacji, populacja liczyła 500 osobników. • Przykładowy genotyp 1100 0010 1000 0111 1001 0010 1101 1001 0111 1100 0000 1011 1001 1110 1001 1010 1101 0011 1100 1111 0101 1010 0110 1110 0001 • Ciąg symboli uproszczonych T*(a)*R)aE+C)E)SRDT)vSqE* • Ciąg ten jest błędny składniowo i należy go poprawić {T((a)*R(a+m)+(S(D((v+q+D} • Ostatecznie mamy {T((a)*R(a+m))+(S(D((v+q+D(m)))))}
Przykład • Edycja prowadzi do wyrażenia double ind(double m, double v, double a) {return T((a)*R(a+m))+(S(D((v+q+D(m))))); } • Kompilator C generuje kod wynikowy • Kod wynikowy zawiera końcowy fenotyp rozkodowany z genotypu
GP a twierdzenie o schematach • Podobieństwo GP do GA sugeruje możliwość dowodu poprawności funkcjonowania algorytmu GP w oparciu o zmodyfikowane twierdzenie o schematach. • Mimo wielu ciekawych opracowań (O’Reilly & Oppacher – 1995, Rosca & Ballard – 1997) próby zdefiniowania schematu dla GP analogicznie jak dla GA natrafiają na duże trudności związane z dynamiką struktury programu zapamiętanej w drzewie.
GP gra w kółko i krzyżyk • Peter J. Angeline i Jordan B. Pollack wykonali eksperyment ucząc komputer gry w kółko i krzyżyk opierając się na algorytmie programowania genetycznego. • Eksperyment miał sprawdzić możliwości GP, w którym Angeline i Pollack zastosowali własne usprawnienia. Skorzystali z systemu obsługi podprocedur, dzięki czemu w istotny sposób ograniczyli rozmiary generowanych drzew.
GP gra w kółko i krzyżyk • Wygenerowano 200 pokoleń po 1000 osobników w każdym pokoleniu. • Funkcję dopasowania określono w ten sposób, że wygenerowane programy rozgrywały ze sobą partie i w zależności od wyniku otrzymywały odpowiednią liczbę punktów. • Znaleziony w wyniku eksperymentu program nie przegrywał nawet z zewnętrznym ekspertem.
GP gra w kółko i krzyżyk • Rozmiar drzewa • 60 wierzchołków • 13 poziomów głębokości • 15 podprocedur w osobnych drzewach • Rozmiar drzewa po rozwinięciu podprocedur • 477 wierzchołków • 39 poziomów głębokości • dwie podprocedury były wywoływane aż dziewięciokrotnie!
Do czego można stosować GP? • Przykładowe możliwe zastosowania GP: • klasyfikacja • sterowanie • aproksymacja funkcji • optymalizacja • całkowanie i różniczkowanie symboliczne • wiele innych...