Spiking Neural Network driving a car in 2D environment

This time I would like to present one of my projects that I did as an assignment for “New trends in neural calculations” and “Soft Computing”. The objective of the assignment was to create an application that solves some problem using advanced type of neural network trained by a differential evolution algorithm. As the topic says, I chose to create a simulation of a car in 2D environment with top-down view which was driven by a driver based on a simplified spiking neural network and trained by a differential evolution algorithm. The chosen problem was based on a paper Evolutionary Spiking Neural Networks as Racing Car Controllers by Elias E. Yee and Jason Teo1 in which they did the same thing but in 3D environment and with more sensors.

SNN application windowThe application is based on the SDL2 and Box2D3 as a base components. SDL is used to handle key events and to initialize the context of an OpenGL with a window. Box2D is used to create physics environment in which the car will move. To simulate the car I used a ready-made solution that implements top-down car4 which matched my needs perfectly. Other elements like implementation of spiking neural network, differential evolution, plots, sensors and the race track I wrote by myself. I plan to describe them in details in further posts.

The final application is presented in the attached picture. It is controlled from main window but all informations (about current mode, keys, time) are displayed in console window. Application runtime is divided into two modes. The first is used to test the simulation with arrows and the second is used to control the neural network driver training and the third to see the results of that training.

The results of the project are quite surprising. Although the implementation of spiking neural network was as simple as possible, it managed to complete the S-track presented on the screen in reasonable time (~8s), after 3468 generations of differential evolution.

The source code is available at github and binaries are here.

  1. Yee E. and Teo J. 2011. Evolutionary Spiking Neural Networks as Racing Car Controllers.  11th International Conference on Hybrid Intelligent Systems (HIS 2011), pages 411-416, Melaka, Malaysia, December 2011. []
  2. http://www.libsdl.org/ []
  3. http://box2d.org/ []
  4. http://www.iforce2d.net/b2dtut/top-down-car []

Prezentacja na historię pt. “Holocaust”

Czas nadszedł, jak obiecałem (przynajmniej sobie w myślach), umieszczam prezentacje wraz z kodem źródłowym silnika prezentacji. Prezentacja była robiona w grupie, ja zająłem się silnikiem, kolega Konrad Polak dopieścił grafikę, a reszta dbała o informacje :).

Teraz troszkę o silniku. Silnik bazuje na SDL, filmiki wyświetlam z pomocą DirectShow, muzykę odtwarzam dzięki IrrKlang (Nie DS, ponieważ z IrrKlang miałem gotowe). Silnik składa się z 3 części:

  • Core: odpowiedzialny za obsługę scen, obsługę zdarzeń
  • Scene: układa scenę z poszczególnych kontrolek
  • Controls: klasa bazowa, z której dziedziczą poszczególne kontrolki

Ogólnie uważam, że dość dobrze zaprojektowałem ten silnik, jeśli ktoś miałby rady to chętnie wysłucham ( lub przeczytam).

Jak mówiłem z projektem zamieszczam kod, jeśli ktoś jest zainteresowany.

Download

PS. W lewym i prawym dolnym rogu są strzałki, wystarczy najechać :).

// Download się zagubił ;(

Save’y

Aktualnie pracuję nad zapisywaniem stanu gry w RPGcore. Po wielu trudach udało się skodzić zapisywanie stanu mapy, dzięki czemu po zmianie mapy jej zawartość pozostanie taka sama. Po wyjściu z gry save’y mapy automatycznie znikają. Planuję tworzenie autosave’a.

Następnym etapem jest zapisywanie statystyk i ekwipunku gracza do pliku. Ostatni etap będzie polegał na umożliwieniu graczowi zapisywanie stanu gry. Po naciśnięciu klawisza odpowiadającego za save. Plik gracza będzie łączony z plikami mapy, by w czasie ładowania rozdzielić się i wczytać.

Dialogi finito

Zakończyłem pisanie dialogów do RPGcore, teraz będę się zabierał za save i load. Mam nadzieje, że mój pomysł wypali.

Polega on na tym, że w momencie zmiany lokacji zapisuje się wszystkie anormalności do pliku, a gdy gracz kliknie klawisz save’a te pliki są łączone w 1 duży. Load będzie to dzielił plik na poszczególne mniejsze pliki, które będą uwzględniane przy ładowaniu mapy.

Dużo nowości

Dawno tu nie zaglądałem, nie wiem czemu, pewnie nie chciało mi się, ale skoro już tu jestem, mogę zaprezentować nowości jakich doczekał sie mój RPG. Zacznę listą:

1. Każdy dostępny rodzaj armoru: hełm, naszyjnik, pierścienie, buty oraz pancerz.
2. Różne typy broni: miecze dwuręczne, jednoręczne, kusze, łuki oraz czary (niewiele bo 2 rodzaje)ofensywne i leczące.
3. Statystki bohatera, dzięki nim można podejrzeć aktualny rozwój gracza. Możliwe jest zdobywanie poziomów po zdobyciu punktów doświadczenia z zabijania potworów. Na każdym poziomie dostajemy po 4 punkty atrybutów i skilli do dowolnego rozdzielenia
4. Ekwipunek denata, każda zabita postać będzie leżeć na ziemi dopóki nie zmienimy mapy, po tym ciało znika, lecz dopóki ciało jest, dopóty możemy go przeszukać i zabrać przedmioty.
5. Dialogi, jeżeli postać jest nieagresywna to jest możliwość porozmawiania z nią (pod warunkiem, że istnieje plik z dialogami dla tego npca). Aktualnie postać może nam wręczyć przedmiot jeżeli go ma przy sobie (istnieje opcja sprawdzenia czy ma przedmiot)
6. Strzelając z broni dalekiego zasięgu możemy ujrzeć dolatujący do przeciwnika pocisk, który ma ustalony zasięg 8 kratek, jeżeli nie trafi w nic to znika. Pociski reagują na kolizje, jeżeli wlecą w coś w co postacie nie mogą normalnie wejść to znika.

Jak widać wiele się zmieniło, ale jeszcze trochę zostało do napisania aktualna lista TODO w uproszczeniu wygląda tak:
1. Zmodyfikować AI npców, aby mogli korzystać z broni dalekiego zasięgu.
2. Rozbudować dialogi.
3. Zapisywanie stanu gry.
4. Jakieś menu.

[=====>.60%]

Dorzuciłem przedmioty, ekwipunek. Oczywiście jest GUI na to, dzięki, któremu można przejrzeć ekwipunek(chwilowo bez przesuwania), można przenosić miksturki na paski i z powrotem. Oraz można używać (jak narazie tylko) miksturek HP i MP

RPG ciąg dalszy

Dodałem możliwość dodawania własnych NPC, które poruszają się za graczem (zombie AI), maja przy tym animacje taką jak postać gracza, a poza tym nic wielkiego nie robią

Postęp pracy: [====>..50%]

Następnym etapem pracy jest, dodanie licznych statystyk dla postaci oraz możliwość atakowania NPCa.

Silnik RPG

Pisanie silniczka jakoś leci, aktualnie w dostępnym demie można:
– stworzyć własną mapkę
– stworzyć własne obiekty, które odpowiednio w pliku .dat opisać będą miały swoje kolizje
– poruszać się po mapce (ludzik ma animacje i różne pozycje stania)
– zmieniać mapę
Postęp pisania:
[==>….35%]

RPG ciag dalszy

Napisałem już klasę silnika w części oraz stworzyłem prowizoryczna klasę postaci. Gra się uruchamia, można poruszać się po trawie po wodzie nie.
RPGcore
Program: Gra.exe

Gra RPG

Chciałbym przedstawić mój następny projekt. Jest to gra RPG, z wyglądu podobna będzie do Tibii, oparta na SDL. Niestety nie mam pomysłu na fabułę, dlatego dodam ją na końcu. Jest to projekt na dłuższy termin i jest sporo trudniejszy od poprzedniego(Arkanoida). Ekran gry będzie składał się z pojedynczych kosteczek 25×25 pixeli. W założeniach gra będzie mogła wczytywać pliki mapy, dialogów, części mapy.

Gra jest w fazie projektowania, ale już zacząłem pisać klasę odpowiadającą za mapę.