Katedra Inżynierii Wiedzy Wykład 11
O czym dzisiaj? labirynty, dużo labiryntów; automaty komórkowe; algorytmy do budowy labiryntów; algorytmy do szukania wyjścia z labiryntów; Blueprints i drzewa zachowań w Unreal Engine 4.
Rysunek: Prosty labirynt 2D źródło: http://www.nanotec7.com
Rysunek: Labirynt a graf źródło: http://eduinf.waw.pl
Rysunek: Przykłady grafów: a graf skierowany ; b graf nieskierowany Graf prosty G składa się z niepustego zbioru skończonego V (G), którego elementy określane są jako wierzchołki (lub węzły), i skończonego zbioru E(G) nieuporządkowanych par elementów ze zbioru V (G) nazywanych krawędziami.
Definicje Krawędź incydentna jest krawędzią grafu nieskierowanego. Stopień wierzchołka w grafie nieskierowanym to liczba incydentnych z nim krawędzi. Trasą w danym grafie G nazywamy skończony ciąg krawędzi postaci < v 0, v 1,..., v k >, gdzie każde dwie kolejna krawędzie są sąsiednie albo identyczne. Wierzchołek v 0 wierzchołek początkowy; v k wierzchołek końcowy. Długością trasy nazywamy liczbę krawędzi na trasie. Ścieżka długości k, z wierzchołka u do wierzchołka u w grafie G = (V, E) jest ciągiem wierzchołków < v 0, v 1,..., v k > takich, że u = v 0, u = v k. Droga to ścieżka, w której wierzchołek początkowy i końcowy są równe v 0 = v k. Ścieżka zamknięta zawierająca co najmniej jedną krawędź nazywana jest cyklem. Cykl nazywany jest prostym, jeśli dodatkowo v 1, v 2,..., v k są różne. Pętla jest cyklem o długości 1. Dwie ścieżki tworzą ten sam cykl, jeśli istnieje liczba całkowita j, taka, że v i = v (i+j)mod k, dla i = 0, 1,..., k 1. Graf spójny to graf, w którym każda para wierzchołków połączona jest drogą.
Minimalne drzewo rozpinające minimalne drzewo rozpinające a problem komiwojażera; przy liczbie wierzchołków równej n mamy n 1 krawędzi łączących te wierzchołki; minimalne drzewo rozpinające uwzględnia wagi ustalone na poszczególnych krawędziach; każde rozgałęzienie w labiryncie może być traktowane jako wierzchołek w grafie; przy założeniu, że wagi są generowane losowo na podstawie drzewa możemy wygenerować ścieżkę przejścia w labiryncie, a następnie dodać dodatkowe elementy (dodatkowe ściany); zakładając, że dla całego labiryntu możemy wyznaczyć zbiór wszystkich wierzechołków: wystarczy przy pomocy dowolnego algorymu wyznaczyć minimalne drzewo rozpinające i rozpocząć przejście od wierzchołka najbliżej punktu startu.
Algorytm Kruskala 1 posortuj wszystkie krawędzie; 2 wybierz krawędź o minimalnej wadze; 3 jeżeli po dodaniu krawędzi nie ma cyklu w grafie uwzględnij tę krawędź do częściowego rozwiązania; w przeciwnym wypadku usuń krawędź; 4 powrót do kroku drugiego tak długo, jak liczba krawędzi w drzewie jest mniejsza od V 1, gdzie V to liczba wierzchołków. Generowanie labiryntu ustal rozmiar labiryntu oraz zbiór zawierający wszystkie krawędzie, czyli połączenia pomiędzy dwoma sąsiadującymi kratkami w mapie labiryntu; wybierając losowo dwa takie zbiory usuwamy łączącą je ścianę czyli zmniejszamy zbiór początkowy o jeden; powtarzając wcześniejszy krok usuwamy ściany tak długo, aż zostanie nam tylko jeden zbiór czyli nas algorytm.
Rysunek: Przemieszczanie przeciwnika w labiryncie Creeper world
Rysunek: Przemieszczanie przeciwnika w labiryncie; źródło: youtube.com
Rysunek: Algorytm optymalizacji stadnej cząsteczek poruszanie się
Automaty komórkowe (Cellular automata) dyskretny model składający się z siatki o określonej wielkości; liczba wymiarów może być dowolna (najpopularniejsze to 2D); każdy element siatki zwany dalej komórką posiada listę sąsiadów; w czasie t = 0 początkowe stany komórek są ustalone; w każdym kolejnym odczycie t = i, i > 0 wszystkie komórki aktualizowane są zgodnie z pewną określoną regułą; Ciekawostka: algorytm ten opracował wspólnie z von Neumannem Stanisław Ulam. Do czego może się przydać? budowa labiryntu; symulowanie działania społeczności postaci niezależnych w grze (wrócimy do tego przy okazji Blueprints w Unreal Engine).
Rysunek: Reguły dla prostego automatu komórkowego Źródło: http://mathworld.wolfram.com
Rysunek: Prosty automat komórkowy Źródło: https://plato.stanford.edu
Rysunek: Wejściowy rozkład pomieszczeń Źródło: http://https://gamedevelopment.tutsplus.com
Reguły w automacie komórkowym jeżeli komórka ma mniej niż dwóch żywych sąsiadów ginie; jeżeli komórka ma więcej niż trzech żywych sąsiadów ginie; jeżeli komórka ma dwóch lub trzech żywych sąsiadów - żyje dalej; jeżeli martwa komórka ma dokładnie trzech żyjących sąsiadów zaczyna żyć. Rysunek: Wyjściowy rozkład pomieszczeń Źródło: http://https://gamedevelopment.tutsplus.com
Game of Life John Conway, 1970r - opracowanie założeń gry; reguły gry podobne jak w przypadku automatów komórkowych; struktury: stałe (stabilne nie zmieniają się bez względu na czas); oscylatory (zmieniające się okresowo); niestałe (zmieniają się nie powracając do stanu pierwotnego); mechanizm symulowania działania społeczności w strategii może bazować właśnie na grze w życie.
Rysunek: Gra w życie przykład Źródło: http://https://gamedevelopment.tutsplus.com
Unreal Engine Blueprints obiekty z interfejsem na bazie węzłów; upraszczając: wizualne dodatki skryptowe; elementy rozgrywki tworzone są poprzez łączenie wydarzeń, funkcji i zmiennych każdy poziom ma swój własny blueprint możliwość odwoływania się i manipulowania aktorami na scenie. System skryptowania wizualnego blueprint ustalanie zasad gry i mechaniki; przygotowanie różnych wariantów modeli i materiałów; modyfikacja postaci; prototypowanie nowej perspektywy kamery; zmiana sterowania gracza;
Rysunek: Przykład blueprints Unreal Engine 4
Automaty komórkowe a drzewa zachowań narzędzie do tworzenia sztucznej inteligencji w Unreal Engine; na wierzchołku drzewa jest zachowanie macierzyste, które ma pod sobą uporządkowany zbiór zachowań; schemat ten jest oparty na relacji rodzic-dziecko; blackboard przechowywanie danych i zmiennych do celów decyzyjnych; z jednego blackboard może korzystać jeden obiekt, lub cała grupa.
Idea drzewa zachowań AI dwie drużyny (każda po 10 botów); jedna drużyna używa losowych wag, a druga parametry określone na początku (agresywna gra, podanie, strzał); każde zachowanie (które było zdefiniowane) ma wagę w przedziale 0 : 1 ; mecz trwa x sekund; po każdym meczu podliczamy punkty i aktualizujemy wagi prosty mechanizm uczenia się.
Rysunek: Przykład drzewa zachowań Unreal Engine 4
Ukrywanie się jeżeli nie widzimy przeciwnika, to już znajdujemy się w miejscu ukrycia; jeśli przeciwnik jest widoczny, to uruchamiamy zadanie EQS FindHidingSpot; wyznaczanie najlepszego miejsca ukrycia (czyli o określonych parametrach); modyfikacja zmiennej Destination i zadanie MoveTo, w którym wskazana jest zmienna Destination.
Rysunek: Przykład drzewa zachowań Ukryj się
Leczenie zapytanie sprecyzowane pod szukanie apteczki; zadanie FindMedicPack; wyszukiwany jest punkt najbliżej apteczki; MoveTo i przejście w kierunku, gdzie znajduje się apteczka.
Rysunek: Przykład drzewa zachowań Unreal Engine 4
Atak pierwsza gałąź FindPointNearEnemy ustala pozycję oddania strzału do przeciwnika; w ograniczonym czasie wykonywane jest zadanie MoveTo; ShootEnemy, czyli strzał w kierunku przeciwnika. Atak druga gałąź wyznaczenie punktu w bazie przeciwnika, do którego idziemy (!!! przeciwnik dokładnie wie, gdzie na mapie znajduje się baza/gracz, coś do zebrania): nieważne gdzie jest gracz przeciwnik nas znajdzie; nieważne, że power up jeszcze się nie pojawił przeciwnik dokładnie wie, za ile to nastąpi. przemieszczenie się do pola, w którym możliwe jest przejęcie bazy gracza.
Rysunek: Przykład drzewa zachowań Unreal Engine 4
Obrona FindFriendSpot pozwala ustalić, czy przyjaciel / członek drużyny jest widoczny; przemieszczenie się w jego pobliże zadaniem MoveTo; obrona drużyny, gdzie więcej botów znajduje się w jednym miejscu.
Rysunek: Przykład drzewa zachowań Unreal Engine 4
Rysunek: Przykład drzewa zachowań Unreal Engine 4
Elementy sztucznej inteligencji każda z akcji ma wagi; wagi reprezentują chęć bota do wykonania danej akcji; bot z dużą wartością ataku będzie agresywny; bot z dużą wartością obrony będzie bronił bazy i poruszał się w grupie; wagi pozostają niezmienione, jeżeli drużyna wygrała; losujemy nowe wagi po przegranej rozgrywce; statystyki rozgrywek mogą nam powiedzieć, jak dobrze działa dana strategia (możliwość modyfikacji dwóch skutecznych strategii), ale: celność bota ma charakter losowy w kodzie programu zawsze możemy założyć, że strzał w naszą stronę to headshot.
Dziękuję za uwagę