Mam wielką prośbę. Napisałem sobie język do Sztucznej Inteligencji o nazwie Perkun i nie mam z kim o tym pogadać. Prosiłbym o ocenę.
Język można sobie ściągnąć z https://sourceforge.net/projects/perkun/.
Dla użytkowników Windows mam installer:http://www.pawelbiernacki.net/perkun.msi.
Mam też grę, która jest oparta na Perkunie. To słaba gra ale dobrze prezentuje jak można korzystać z Perkuna jako z biblioteki C++ (czyli jak zagnieżdżać go we własnych programach). Tą grę można ściągnąć z https://sourceforge.net/projects/perkunwars/.
Sercem Perkuna jest (mój) algorytm optymalizacji oparty na tzw. zmiennych ukrytych. Perkun buduje drzewo gry, trochę jak minimax, tylko że w świecie Perkuna nie mamy pełnej informacji o stanie gry, środowisko jest stochastyczne i jest tylko jeden gracz.
Może wyjaśnię na przykładzie w jaki sposób Perkun działa. Ściągnijcie sobie i rozpakujcie plik http://www.pawelbiernacki.net/programmer.zip. W środku są trzy pliki, najważniejsza jest specyfikacja w Perkunie o nazwie programmer_final.perkun. Można go uruchomić:
perkun programmer_final.perkun
Wejdziemy wtedy do trybu interaktywnego. W tej akurat specyfikacji mamy do czynienia z prymitywnym językiem, w którym istnieją tylko dwie możliwe instrukcje: instruction_if_then, instruction_print. Program, który piszemy składa się jedynie z dwóch komend. Istnieją więc cztery możliwe programy:
instruction_if_then, instruction_if_then
instruction_if_then, instruction_print
instruction_print, instruction_if_then
instruction_print, instruction_print
Nie przejmujcie się semantyką tych programów, nazwy instrukcji są tylko tak dla ustalenia uwagi.
W każdym kroku na wejście należy wpisać wartości zmiennych wejściowych (dwóch) reprezentujących aktualny program a następnie wartość zmiennej "it_works", która może być "none", "true" lub "false". Na przykład można zacząć od:
perkun> instruction_print instruction_print none
Perkun ma w tej specyfikacji dwie zmienne wyjściowe, których wartość będzie ustawiał tak, żeby "wygrać", tj. doprowadzić Was do wstukania jako "it_works" wartości true. Czasem się zdarzy, że zażyczy sobie wykonania programu (execute_the_program). Wtedy spodziewa się jako "it_works" albo true albo false. W pozostałych wypadkach "it_works" powinno być none. Jeżeli zażyczy sobie change_instruction_to_if_then albo change_instruction_to_print, wówczas w następnej iteracji należy odpowiednio zmienić wejście na instruction_if_then albo instruction_print. Druga zmienna wyjściowa steruje tym, co należy zmienić.
W tym przykładzie Perkun przechodzi przez wszystkie możliwe "programy" i prosi o ich wykonanie. Możecie oczywiście dla każdego dać false. Jeżeli dla któregoś dacie true wówczas Perkun nabierze przekonania, że ten właśnie program jest poprawny i będzie w kółko prosił o jego wykonanie.
W katalogu perkun-0.1.7/examples znajdziecie więcej przykładów Perkuna, m.in. pochodzące z tej gry (Perkun Wars) pliki example2_dorban.perkun
example3_pregor.perkun. To jest może bardziej przemawiające do wyobraźni. Wyobraźcie sobie, że są trzy miasta - Wyzima, Novigrad i Shadizar. W jednym z nich jest wampir. Dorban to jeden z bohaterów kontrolowany przez Perkuna (jeden z NPC). Jest on wiedźminem i poluje na wampira. Uruchomcie:
perkun example2_dorban.perkun
Przejdziemy do trybu interaktywnego. Pierwsza zmienna wejściowa to lokalizacja (miasto poprzedzone napisem "place_"). Druga zmienna wejściowa mówi, czy widzimy wampira. Wstukajcie "place_Wyzima false". Perkun zdecyduje, że Dorban ma iść do Shadizaru. Wstukajcie teraz "place_Shadizar false". Kolejna decyzja - idź do Novigradu (Perkun jest teraz przekonany, że wampir jest właśnie tam). Wstukajcie "place_Novigrad true". Decyzja będzie teraz brzmiała "nic nie rób" (do_nothing). Z kolei w pliku example3_pregor.perkun mamy specyfikację dla NPC, który unika wampira. Różni się ona głównie tzw. funkcją odpłaty (payoff).
To tyle na razie, mam nadzieję, że kogoś zainteresowałem. Ten algorytm to moje odkrycie, nie mam na niego dowodu, ale wydaje się, że działa. Gdyby ktoś był zainteresowany samym algorytmem - jest w pliku src/optimizer.cc.