„Sztuczna inteligencja w grach z oponentem”

advertisement
„Sztuczna inteligencja w grach z oponentem”
Autor: Michał Jaworski
Data opracowania: 13-04-2017
Wstęp:
W moim referacie chciałbym skupić się na grach video, które są najbardziej popularne
w dzisiejszych czasach, a mianowicie na grach z grafiką trójwymiarową. Gry tego typu
tworzone są głównie z myślą o rozrywce gracza. Składają się z kilku elementów: grafiki,
dźwięku, scenariusza, czyli opowiadanej historii oraz sztucznej inteligencji. Chciałbym
dzisiaj skupić się na ostatnim z wymienionych wyżej elementów.
Na wstępie chciałbym zwrócić uwagę na pewnego rodzaju nieścisłość, z którą się
spotkałem, tworząc ten referat: istnieje znaczna różnica między powszechnie znaną dziedziną
sztucznej inteligencji, a tym, czym twórcy gier nią nazywają. Co prawda czasami
wykorzystuje się techniki sztucznej inteligencji, ze względu jednak na prędkość działania
i prostotę programowania częściej stosuje się proste algorytmy, wciąż mylnie nazywane
sztuczną inteligencją.
Sztuczna inteligencja w grach komputerowych z oponentem to z reguły nic innego, jak
techniki sterujące zachowaniem pewnych jednostek. Głównym ich założeniem jest, aby gracz
czerpał przyjemność z rywalizowania z zaprogramowanym przeciwnikiem, więc algorytmy
kierujące oponentem powinny symulować do pewnego stopnia zachowania ludzkie, łącznie
z popełnianiem błędów podobnych do tych, które popełnia przeciętny gracz.
Ja jednak chciałbym powiedzieć o algorytmie, który odchodzi od tej reguły, a jest
wykorzystywany w większości dzisiejszych gier komputerowych.
A*:
A* jest algorytmem wywodzącym się ze sztucznej inteligencji, służącym do wyznaczenia
najtańszej drogi między dwoma wierzchołkami grafu ważonego. Jest to algorytm zupełny,
czyli znajdujący najlepsze rozwiązanie, a nie przybliżone.
W grach komputerowych używany jest dość często, gdy mamy do czynienia
z przeciwnikiem poruszającym się w przestrzeni dwuwymiarowej lub trójwymiarowej. Po
wyznaczeniu najlepszej pod względem kosztu drogi od punktu położenia postaci przeciwnika
do bieżącej pozycji gracza, bądź innego elementu przedstawionego świata, należy przydzielić
ją algorytmowi odpowiedzialnemu za poruszanie się oponenta. Dzięki temu przeciwnicy są
w stanie wybrać najkrótszą drogę, omijając tym samym napotkane przeszkody.
Graf ważony to struktura danych składająca się ze zbioru wierzchołków i zbioru
krawędzi, która dodatkowo posiada informacje na temat wagi każdego elementu tych
zbiorów. W przestrzeni trójwymiarowej, podobnie jak w rzeczywistości, pokonanie pewnej
drogi wiąże się z jakimś kosztem. Wierzchołki posiadają wagi zależne od odległości dzielącej
je od celu końcowego, krawędzie zaś koszt związany z przejściem między wierzchołkami.
Celem algorytmu jest dobór kolejnych wierzchołków grafu w taki sposób, żeby każda
kolejna funkcja h(x) była niewiększa od poprzednio wybranej, gdzie x to dany wierzchołek.
Dla każdego grafu liczymy sumę wyrażoną wzorem:
f(x) = g(x) + h(x) gdzie:
g(x) – to suma kosztów związanych z przejściem z wierzchołka początkowego do
wierzchołka bieżącego.
h(x) – to prognozowana odległość od danego wierzchołka do wierzchołka końcowego.
Funkcja ta wykorzystuje heurezę, która ustala bezwzględnie najkrótszą drogę.
Ze względu na nieskończoną ilość punktów w układzie kartezjańskim, implementując
algorytm do gry, należy stworzyć graf o stałej długości krawędzi i ilości wierzchołków.
Wartość funkcji h(x) prawie zawsze liczy się ze wzoru na odległość między dwoma
punktami w układzie współrzędnych:
Powyższe grafiki przedstawiają prosty przykład zobrazowany za pomocą dwuwymiarowej
siatki. Na niebiesko zaznaczyłem przewidywane odległości wierzchołków od punktu
końcowego o współrzędnych x = 8, y = -4 i z = 0.
Obraz po lewej pokazuje źle dobraną drogę. Czerwonym kolorem wypisane są kolejno
f(x) wybranych wierzchołków. Z wierzchołka o współrzędnych (0, -4, 0) nie da wybrać się
punktu x+1, którego funkcja h(x+1) będzie niewiększa od tej samej funkcji tego wierzchołka.
W tym momencie algorytm powinien cofnąć się do poprzedniego wierzchołka i wybrać drugi
najbliższy wierzchołek. I tak, aż do znalezienia najlepszej drogi.
Obraz po prawej pokazuje najtańszą drogę znalezioną przez algorytm. Jak widać
odległość od punktu końcowego nie rośnie, co daje gwarancję poprawnego rozwiązania.
Ostateczna wartość funkcji f(x) jest mniejsza od wartości obliczonej w pierwszym
przykładzie. Ilość koniecznych operacji uzależniona jest od ukształtowania terenu, rodzaju
i mnogości przeszkód, które trzeba ominąć i ilości badanych wierzchołków. Znając najkrótszą
drogę możemy wykorzystać ją do zmiany położenia oponenta.
W podobny sposób można wykorzystać ten algorytm do szacowania korzystności
podejmowanych przez przeciwnika decyzji. Jest to szczególnie przydatne w automatach
skończonych sterujących zachowaniem oponenta. Wtedy nie brany tylko i wyłącznie koszt
związany z przebyciem jakiejś odległości, lecz także zysk. Dzięki implementacji algorytmu
A* do takiego automatu, przeciwnik wybiera najkorzystniejszą dla niego drogę zachowań.
Podsumowanie:
Chociaż twórcy gier komputerowych często mylnie nazywają algorytmy sterujące
zachowaniem przeciwnika sztuczną inteligencją, to pewne techniki sztucznej inteligencji są
stosowane w tej dziedzinie. Ciężko dowieść skąd wzięła się ta nieścisłość.
Najprawdopodobniej wywodzi się to z potocznego nazewnictwa algorytmów zarządzających
zachowaniem postaci z gier, które mają w pewien sposób symulować reakcje i decyzje, które
podejmuje człowiek.
Download