2009-10-28 19 views
6

Kiedyś napisałem sztuczną inteligencję Tetris, która grała całkiem dobrze w Tetris. Algorytm, którego użyłem (described in this paper) jest procesem dwuetapowym.Określanie, które wejścia ważą w algorytmie ewolucyjnym

W pierwszym kroku programista decyduje się na śledzenie wejść, które są "interesujące" dla problemu. W Tetris możemy być zainteresowani śledzeniem liczby luk w rzędzie, ponieważ zminimalizowanie luk może pomóc w łatwiejszym umieszczaniu przyszłych elementów. Inna może być średnia wysokość kolumny, ponieważ może to być zły pomysł, aby podjąć ryzyko, jeśli masz zamiar stracić.

Drugim krokiem jest określenie wag powiązanych z każdym wejściem. Jest to część, w której użyłem algorytmu genetycznego. W tym przypadku wystarczy dowolny algorytm uczenia się, o ile wagi są korygowane w czasie w oparciu o wyniki. Chodzi o to, aby komputer zdecydował, w jaki sposób dane wejściowe odnoszą się do rozwiązania.

Korzystając z tych danych wejściowych i ich wag, możemy określić wartość podejmowanych działań. Na przykład, jeśli umieszczenie prostego kształtu linii do końca w prawej kolumnie wyeliminuje przerwy w 4 różnych rzędach, wówczas to działanie może uzyskać bardzo wysoki wynik, jeśli jego waga jest wysoka. Podobnie, ułożenie go płasko na górze może w rzeczywistości spowodować luki i tak, że akcja uzyska niski wynik.

Zawsze zastanawiałem się, czy istnieje sposób na zastosowanie algorytmu uczenia się do pierwszego kroku, w którym znajdziemy "interesujące" potencjalne dane wejściowe. Wydaje się, że możliwe jest napisanie algorytmu, w którym komputer najpierw dowie się, jakie dane wejściowe mogą być użyteczne, a następnie zastosuje metodę uczenia w celu zważenia tych danych wejściowych. Czy wcześniej coś takiego zrobiono? Czy jest już używany w dowolnych aplikacjach AI?

+1

+1 Próbuję zacząć w tym polu. Mam kilka domowych programów demonstracyjnych, ale nic wielkiego. Zainteresowany, aby zobaczyć, jakie odpowiedzi otrzymasz w tej sprawie. –

Odpowiedz

1

W sieciach neuronowych można wybrać "interesujące" potencjalne dane wejściowe, znajdując te, które mają najsilniejszą korelację, dodatnią lub ujemną, z klasyfikacjami, których dotyczy szkolenie. Wyobrażam sobie, że możesz robić podobnie w innych kontekstach.

+0

Co rozumiesz przez "korelację z klasyfikacją" w tym kontekście? – Kai

+0

Powiedzmy, że szkolisz sieć neuronową, aby klasyfikować wzorce jako "literę A" lub "nie literę A". Masz kilka przypadków szkoleniowych, w których masz trochę danych i wiesz, czy to jest A. Możesz je kroić i kroić na wiele sposobów, z których każda jest potencjalnym wkładem. Najlepsze potencjalne dane wejściowe to te, które wykazują silną korelację numeryczną ze stanem A lub nie-A. Jeśli potencjalne wejście nie zmienia się, jest bezużyteczne. Jeśli zmienia się losowo, jest bezużyteczne. Jeśli zmienia się w koordynacji z A-lub-nie-Aness wzoru, to złoto. – chaos

+0

Ah, widzę! Nie myślałem o używaniu wcześniej istniejących próbek (trudno to sobie wyobrazić w Tetris). W rzeczywistości myślę, że robi to recaptcha (http://recaptcha.net/learnmore.html). Nie przyszło mi to do głowy, dopóki nie przeczytam twojego przykładu. – Kai

0

Myślę, że mogę podejść do problemu, który opisujesz, wprowadzając bardziej prymitywne dane do algorytmu uczenia się. Na przykład stan gry tetris może być opisany przez listę zajętych komórek. Ciąg bitów opisujących te informacje będzie odpowiednim wprowadzeniem do tego etapu algorytmu uczenia się. szkolenie w tej kwestii wciąż stanowi wyzwanie; skąd wiesz, czy są to przydatne wyniki. Przypuszczam, że można by przetasować cały algorytm w pojedynczy obszar typu blob, w którym algorytm jest zasilany kolejnymi stanami gry, a wyjście to po prostu rozmieszczenie bloków, z wyższymi algorytmami oceny wybranymi dla przyszłych pokoleń.

Innym wyborem może być użycie dużego korpusu spektakli z innych źródeł; takie jak nagrane odtwory z ludzkich graczy lub ręcznie wykonane ai, i wybierz algorytmy, których wyniki mają silną korelację z pewnym ciekawym faktem lub innym z przyszłej gry, takich jak wynik uzyskany w ciągu 10 kolejnych ruchów.

+0

Myślę, że twoją pierwszą sugestią jest zmiana modelu, z którym problem jest reprezentowany. Kodowanie może być łatwiejsze, ale zastanawiam się, czy rzeczywiście pomoże to w nauce. Bardzo podoba mi się pomysł wykorzystania innych źródeł. – Kai

+0

Nie jestem też całkowicie zadowolony z mojej własnej odpowiedzi. Gdybym miał zgadywać, przypuszczam, że to prawdopodobnie wydłuży czas nauki o około 2 rzędy wielkości. – SingleNegationElimination

0

Tak, jest sposób.

Jeśli wybierzesz M wybranych funkcji, istnieją 2^M podzbiorów, więc jest wiele do obejrzenia. bym, że:

For each subset S 
    run your code to optimize the weights W 
    save S and the corresponding W 

Następnie dla każdej pary S-W, można uruchomić gry g dla każdej pary i zapisać wynik L dla każdej z nich. Teraz masz tabelę tak:

feature1 feature2 feature3 featureM subset_code game_number scoreL 
1   0   1   1   S1   1    10500 
1   0   1   1   S1   2    6230 
... 
0   1   1   0   S2   G + 1   30120 
0   1   1   0   S2   G + 2   25900 

Teraz można uruchomić jakiś składnik algorytmu wyboru (PCA na przykład) i zdecydować, które funkcje są warte wyjaśnić Scorel.

Wskazówka: podczas uruchamiania kodu w celu optymalizacji W, należy wysiać generator liczb losowych, tak aby każdy inny "ewoluujący mózg" był testowany na tej samej sekwencji elementów.

Mam nadzieję, że pomaga w czymś!

Powiązane problemy