Dobór
optymalnego składu floty w grze 'Ogame'
Paweł
Kalinowski
25.06.2012
Raport z projektu wykonanego na
zaliczenie przedmiotu Sztuczna Inteligencja
Searching for the optimal fleet structure in 'Ogame' - strategic game
Paweł
Kalinowski
25.06.2012
The project described in this report has
been completed to fulfill the requirements for the course: Artificial
Intelligence
The author searched for optimal number of ships of
given types for a „Ogame” game wars.
The
method used is attachin constrained integer optimisaton to
self-adjusted battle simulator.
Criteria were consulted with domain-experts through official
forums.
The simulated function is irregular and manual analisis were
generally unsuccessful.
This project is the first attempt to perform the optimization in
automatic way, so get attention of the community.
Results are satisfying – the degree of improval varies, but it is
always present.
Opis
zadania
Celem
zadania było stworzenie systemu, który poprzez odpowiedni ciąg
symulacji znajdzie “optymalny” skład floty do ataku na zadany
cel w grze OGame.
“OGame –
internetowa gra strategiczna z rodzaju tzw. massively multiplayer
online strategic game (MMOSG). [...]
Głównym
zadaniem jest kontrola nad jak największą częścią wszechświata,
zbieranie i handel surowcami, rozbudowywanie swojego imperium, postęp
technologiczny, walka i układy z innymi graczami, oraz osiągnięcie
jak najwyższego miejsca w rankingu najlepszych graczy danego
universum.[...]
sfera militarna – dzieli
się ona zarówno na obronę, gdzie można produkować działa lub
systemy defensywne, jak i systemy ofensywne takie jak statki bojowe,
kolonizacyjne, sondy szpiegowskie oraz transportowe itp. [...] Gdy
gracz dysponuje flotą, może zaatakować planetę innego gracza.
[...] . Jeśli gracz atakujący zdoła przełamać obronę
przeciwnika, na jego statki (zależnie od ich łącznej ładowności)
zabierana jest maksymalnie połowa surowców znajdujących się na
planecie przeciwnika. Walki odbywają się natychmiastowo (kończą
się w momencie, gdy flota dociera do docelowej planety).”
@http://pl.wikipedia.org/wiki/OGame
W
grze występują 22 typy jednostek, z czego 8 to statki militarne, a
1 to tanie sondy szpiegowskie , które mogą służyć jako “mięso
armatnie”. Algorytm przeprowadzania bitew jest ogólnodostępny,
ale skomplikowany, a przy tym zawiera element losowy. Przy założeniu
braku rażącej dysproporcji sił, jedynym sposobem na oszacowanie
wyniku jest przeprowadzenie symulacji całej bitwy (runda po
rundzie).
Narzędzia do wykonywania symulacji są dostępne, ale
żadne z nich nie oferuje interfejsu innego niż graficzny.
Z racji innowacyjności projekt wzbudził spore zainteresowanie
społeczności graczy OGame z kilku krajów . Wcześniej nie istniał
automatyzowalny program do symulacji, funkcja celu jest nieliniowa a
przestrzeń do przeszukania ogromna.
Opis zastosowanej
metody rozwiązania problemu
Kryterium optymalności to
minimalizacja funkcji {koszty produkcji + straty w trakcie bitwy +
zużyte paliwo} przy warunku 100% szans na wygraną.
Po utworzeniu
takiej funkcji celu (wymagało to modyfikacji silnika symulacji)
użyto biblioteki NOMAD, aby przeprowadzenić 9-wymiarową
optymalizację funkcji z ograniczeniami. Argumentami były liczby
naturalne, odpowiadające liczbie statków.
Implementacja
Z programu csim wyodrębniono silnik symulacji bitew, stworzono potrzebne interfejsy wejścia/wyjścia: interfejs linii komend oraz interfejs programowy (funkcja biblioteczna dzielonej biblioteki).
Korzystając z biblioteki NOMAD i stworzonej biblioteki (punkt 1.) napisano program (w C++), który wczytuje dane obrońcy i dodatkowe parametry (np dostępny budżet) i znajduje “optymalną” flotę do ataku.
Skuteczność tak wyznaczonych flot badano na bazach danych flot: udostępnionej przez OmarHawk i samodzielnie ściągniętej z board.ogame.pl.
Program działa w dwóch trybach:
* konsolowym (dane jako argumenty wywołania, wynik wypisany na standardowe wyjście)
* automatycznym (dane wczytywane z input.txt, wyniki wypisywane do output.txt)
Kod został napisany w sposób przenośny, poza Linuksem działa również na systemie Windows (kompilowany za pomocą MinGW).
Ocena wyników
Pierwsza analizowana sytuacja: dużo struktur obronnych, brak statków:
inputDefender 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8000 3500 150 100 200 80 1 1
Wartość obrony wynosi
costD:5.0e+07
Rozwiązanie uznane przez program za optymalne zostało porównane z kilkoma innymi, składającymi się jedynie z jednego typu statków.
Wyniki:
Ich statystyki (w ostatniej kolumnie minimalizowana funkcja,
we wcześniejszych składniki: +,-,+,+)
Jak widać znalezione rozwiązanie jest lepsze wg funkcji celu i większości jej składowych, nawet od floty samych bombowców, mimo że są to okręty dedykowane do niszczenia obrony.
Druga analizowana sytuacja: potężna i zrównoważona flota
inputDefender 10 10 10 0 225 21000 10500 5250 2625 0 0 415 73 0 203 12 537 0 0 0 0 0 0 0 0
costD:8.8e+08
Tutaj rozwiązania zawierającego <10e6 myśliwców nie było. Zarówno gwiazdy śmierci jak i pancerniki są przeznaczone do walki z obcymi okrętami, ale jak widać odpowiednia mieszanka różnych typów jest korzystna.
Przeanalizowano więcej konfiguracji przeciwników i we wszystkich przypadkach program wskazał nieco lepsze rozwiązanie niż najlepsze z układanych przez ludzi.
Wnioski
Osiągnięte wyniki są zadowalające. Metoda
sprawdziła się, oferując poprawę wyników, a przede wszystkim
dużą oszczędność czasu - częstą praktyką wśród graczy jest
wykonywanie kilku symulacji (każdorazowo konfigurowanych ręcznie) w
celu wyboru najkorzystniejszego wariantu.
Uwagi
Autor dobrze zna i rozumie wszystkie zasady gry, ale grając skupiał
się na innych aspektach - posiada jedynie ograniczoną wiedzę
ekspercką z dziedziny projektowania składu flot.
W celu
uzyskania tej wiedzy zwrócił się do społeczności graczy poprzez
oficjalne fora: board.ogame.pl i board.ogame.org.
Wersja alfa
została upubliczniona 20.06.2012, w ciągu niecałego tygodnia
program (wciąż niedokończony) osiągnął ponad 150 ściągnięć,
a łącznie dotyczące go tematy zanotowały ~70 wypowiedzi i ~2000
wejść.
Pod wpływem sugestii graczy zostało wprowadzone wiele
zmian. Większość komentarzy dotyczyła możliwości konfiguracji i
ograniczania rozmaitych wartości, a część sugestii odnosiła się
do interfejsu.
Spostrzeżenie, że ignorowanie ilości spalanego
paliwa jest nierealistycznym założeniem wymusiła utworzenie
dodatkowego modułu odpowiedzialnego za obliczenia odległości i
spalania (~50 dodatkowach linii kodu obliczeń oraz konieczność
dodania dużej ilości stałych opisujących statki).
W dniu składania raportu projekt jest wciąż rozwijany, ale zmiany
dotyczą głównie przystępności dla użytkowników, a obliczenia
nie podlegają zmianom.
Wykorzystane narzędzia/materiały
Fragmenty kodu csim 1.17; licencja GPL2 , Copyright (C) by Dmitry E. Oboukhov, strona autora już nie istnieje, ale program/kod są dostępne w repozytoriach Debiana jako ogamesim
Biblioteka
NOMAD (Nonsmooth
Optimization by Mesh Adaptive Direct Search), licencja LGPL,
Samodzielnie napisany w tym celu program optifleet (udostępniony
publicznie w serwisie sourceforge)
Silnik programu “SpeedSim”, źródło kodu odpowiedzialnego za obliczenia dotyczące paliwa/odległości
Dump tabeli 'reports' bazy danych SQL programu galaxytool, otrzymany dzięki uprzejmości Omar_Hawk (autora programu) – duży zbiór danych o flotach/obronach
Samodzielnie sparsowane (bash,grep,sed,wget,awk) raporty bitewne ze strony http://board.ogame.pl/board790-z-ycia-uniwers-w/board801-starcia-tytan-w-raporty-wojenne/
Analizę, zrównoleglanie obliczeń i przetwarzanie danych wykonano w pakiecie R
Inne analizy dotyczące konstrukcji flot
Tematy na forach board.ogame.pl oraz board.ogame.org, dające ogólną orientację w temacie
http://ogame.wikia.com/wiki/Ogame_Combat_Chain
stwierdza że relacja flot przypomina “Papier-Kamień-Nożyce”.
Wzajemną podatność statków (wyniki bitw flot jednolitego typu i
podobnej wartości) można opisać w uproszczeniu jako:
Fighters
> Destroyers > DeathStars > Battlecruisers > Battleships
> Cruisers > Fighters
http://web.archive.org/web/20100329141042/http://www.ogametips.com/4/fleets-and-ships---overview
– autor próbuje matematycznie wyznaczyć zunifikowaną
wartość bojową poszczególnych typów statków(przeskalowaną do
kosztu).
Wynik (Light Fighter/Heavy Fighter/Cruiser/Battle
Ship/Bomber/Destroyer/Death Star):
3.465/3.485/3.101/3.821/2.764/3.112/3.625.
Sugeruje to
porównywalną użyteczność, ale ignoruje “Szybkie Działa”,
czyli podstawę przewagi jednego typu statku nad innym.
http://board.ogame.org/board703-miscellaneous/board156-archive-version-2-0/board705-help-questions-archive/377179-exact-battle-algorithm/ ; www.speedsim.net/stuff/battle_algorithm.doc – szczegóły algorytmu obliczania wyniku bitwy (symulator był używany jako “czarna skrzynka”, ale dobrze rozumieć jak działa)