Strategii In Jocurile pe Calculator
Cuprins
1 INTRODUCERE 1
1.1 PROBLEMA 2
1.2 abordări planificate 2
2 CONTEXT – genului RTS 3
3 ANALIZA 6
3 . 1 AI ÎN RTS JOCURILE 6
3.1.1 Sub – concluzie pentru AI în jocuri RTS 9
3,2 TEORII 11
3.2.1 Retele neuronale 11
3.2.2 Algoritmi genetici 12
3.2.3 Mașini de stat 13
3.2.4 logica fuzzy 13
3.2.5 Bayesian Rețele 14
3.2.6 Sub – Concluzie privind alegerea teoria . 15
3.3 LEARNING 16
3.3.1 învățare supravegheată 16
3.3.2 învățare nesupravegheată 16
3.3.3 de armare de învățare 16
3.3.4 Online vs învățare offline. 16
3.3.5 Sub – concluzie asupra învățării 17
3.4 SĂ UTILIZAȚI UN RTS joc existent sau la a implementa un nou joc RTS ? 18
3.5 ANALIZA CONCLUZIE 19
4 TEORIE 20
4.1 teoria probabilitatii 20
4.1.1 Spațiul eșantionului șifuncția de probabilitate de 20
4.1.2 Frecventa interpretare 22
4.1.3 interpretare subiectivă 22
4.1.4 Probabilitate articolul 22
4.1.5 Independența 23
4.1.6 probabilitate condiționată . 23
4.1.7 independență condiționată 24
4.1.8 variabile aleatoare 24
4.1.9 distribuție de probabilitate comune 25
4.1.10 distribuție marginală 26
4.2 NETWORK Bayesian 27
4.2.1 Setarea tabelele 28
4.2.2 interogări Efectuarea în rețelele bayesiene 29
4.2.3 Concluzie privind Bayesian Rețele 34
4 . 3 ARMARE LEARNING 36
4.3.1 algoritmi de învățare 38
4.3.2 Concluzie privind armare de învățare 41
4.4 CONCLUZIE PRIVIND TEORIE 42
5 Game Design 43
6 GAME implementării design- 46
6.1 GAME FUNCȚIONALITATEA 48
7 AI -Bayesian REȚELEI 51
7 . 1 Ce putem construi ? 51
7.2 IDENTIFICAREA variabilele aleatoare NECESARE 51
7,3 decizii de proiectare 55
7.4 CADRUL GRAFICUL 56
7.5 LEARNING ȘI TESTARE IMPLEMENTARE 58
7.6 ALGORITMUL QUERY 59
7.7 CONCLUZIE PRIVIND AI -Bayesian REȚELEI 62
8 LEARNING 63
8.1 Ce este o strategie ? 63
8,2 moduri de a învăța O STRATEGIE – SPAȚIUL DE STAT 63
8.2.1 aleatorie IndexAndSign 64
8.2.2 aleatorie IndexValueAndSign 65
8.2.3 recoacere simulate 65
8.2.4 Monte Carlo 67
12 113 REFERINȚE
AI pentru jocuri de strategie în timp real
Dezvoltarea unui AI pentru un joc de strategie în timp real capabil de a invata noi strategii
1 Introducere
Când joci un joc de strategie în timp real (joc RTS), in genereal ai posibilitatea de a alege opțiunea de single-player, cand esti impotriva calculatorului sau alternativ, se poate alege opțiunea de multiplayer. În opțiunea de multiplayer de jocuri RTS noile strategii sunt în continuă dezvoltare și de schimbare a modului în care jocurile sunt în curs de redare. Din acest motiv, jucătorii pot găsi această opțiune de joc interesant și provocator. Cu toate acestea, în partea de single-player inteligența artificială (AI) în aceste jocuri nu se invata noi strategii. Prin urmare, un jucător uman devine superior AI-ului și pierde interesul în partea de single player a jocului.
În cazul în care AI-ul din aceste jocuri RTS s-ar putea adapta la noi strategii și capabil să învețe pe cont propriu , jucătorul va continua sa gaseasca această parte a jocului captivant si ar fi interesat de a incerca noi tactici înainte, de exemplu joc online împotriva unui "oponent uman".
Această teză va explora posibilitățile de dezvoltare a unui AI pentru un joc RTS care sa poata învăța să se adapteze la noi strategii folosite de către un adversar. În acest fel, se speră că modul single player de jocuri RTS poate continua să fie la fel de interesant și provocator ca modul multiplayer de RTS. Scopul acestui proiect este de a dezvolta un AI pentru un joc RTS care sa poata învăța pentru a contracara noi strategii folosite de către un adversar.
2 Context -gen RTS
Această secțiune descrie genul RTS și va explica elementele, strategiile și moduri de joc tipic RTS . Există o mulțime de elemente diferite în joc. Mai întâi de toate este harta. Fiecare joc este jucat pe o hartă de dimensiuni limitate care pot fi realizate de o mulțime variata de peisaje. Acest lucru poate fi iarbă, apă, munți, poduri, etc. De multe ori decorul pe o hartă va avea nevoie de tipuri de unități și strategii speciale pentru a fi utilizate.
Al doilea element în jocurile RTS este de resurse, care sunt situate in mai multe locuri de pe harta. În funcție de joc, resursele pot fi minerale, gaze naturale, petrol, copaci, etc. Resursele de aur poate fi în mod normal colectate de anumite tipuri de unități numite lucrători și sunt folosite pentru a construi lucrători, clădiri, unități militare sau de tehnologie de cercetare.
Al treilea element este de unități. În fiecare joc RTS există o mulțime de diferite unități pe care jucatorul le poate alege pentru a le utiliza în armata lui. Fiecare tip de unitate are punctele sale slabe și prin urmare, situații de joc pentru diferite tipuri de unități. De exemplu un soldat ar putea fi mai puternic împotriva altor soldați, dar slab împotriva unităților de aer pe care nu le poate ataca. Ultimul element în jocurile RTS sunt clădirile. Există de multe ori o mulțime de clădiri diferite în jocurile RTS care toate au propria lor funcționalitate , de exemplu, de a instrui noi unități militare, resursele se transforma în bani, de aprovizionare a armatei cu alimente sau pentru a cerceta noi tehnologii.
Joc
Un joc RTS este văzut fie de o izometrie sau de o perspectivă 3D.
În joc, jucătorii depun eforturi pentru a elimina adversarii de pe harta. Acest lucru se face prin construirea armatei de diferite unități și utilizarea acesteia în lupta împotriva adversarului.
Jucatorul poate selecta unități și clădiri, selectandu-le. Odata selectat, el poate, de exemplu, comanda o unitate pentru a trece la o anumită poziție, făcând clic pe această poziție pe hartă sau poate ataca alta unitate. Odată ce o anumită clădire este selectata, jucatorul de exemplu poate începe producerea de diferiti soldați sau pentru a cerceta noua tehnologie care va da jucătorului posibilitatea de a construi noi tipuri de unități și clădiri.
Pe parcursul jocului, jucătorul este responsabil de crearea a economiei ( de exemplu, construirea de lucrători ), el decide care fabrici și unități ar trebui să fie construite împotriva adversarului. De asemenea, el trebuie să controleze toate unitățile individuale în joc, unde se duc, pe care unități inamice ar trebui să atace, pe care abilități speciale ar trebui să folosesca și așa mai departe .
Strategii
Având o strategie bună pentru modul în care va ataca oponentul este un aspect foarte important pentru un joc RTS. Cu toate acestea, este la fel de important să fie în măsură să realizeze atunci când strategia nu va lucra impotriva adversarului si de a fi capabil de a schimba strategia într- o astfel de situație. În aproape toate jocurile RTS , există trei strategii principale și contra timp. O strategie este de atac rapid, în cazul în care încercați să scoateti adversarul după doar câteva minute de joc. O altă strategie este de a cerceta noi tehnologii foarte repede, care va permite să construiti unitățile care sunt mult mai puternice decât unitățile adversarilor. A treia strategie, se bazează pe obținerea unei economii mari și să fie difuzata foarte rapid, care va permite să construiască mai multe unități decât adversarul mai târziu în joc. Există, desigur un număr nesfârșit de variante și combinații ale acestor strategii generale și noi strategii în curs de dezvoltare.
Aspect în timp real
O altă parte centrală a jocurilor RTS este aspectul în timp real. Totul se întâmplă în timp real, ceea ce înseamnă că jucătorul trebuie să controleze toate unitățile sale , să construiască fabrici și unități , etc toate în același timp. Acest lucru înseamnă că el trebuie să fie capabil să gândească și să reacționeze foarte rapid.
Ceață de război
Ceață de război este o caracteristică foarte comună a jocurilor RTS si inseamna că un jucător poate vedea doar o parte a hărții, unde are în prezent fie unități sau clădiri plasate. Restul de harta va fi acoperit de o ceață care face imposibil pentru el să vadă ce se întâmplă în aceste poziții. Prin urmare, este important pentru un jucător să continue să cerceteze harta pentru a vedea ce face inamicul.
Moduri de a juca
Există în mod normal, trei moduri diferite de a juca jocuri RTS: modul de campanie, a juca de singur și un mod multiplayer.
Modul de campanie este doar pentru jocuri single player și conține un număr de niveluri care jucătorul trebuie să le completeze. Aceste niveluri diferă de multe ori de la un nivel la altul. Misiunea pe un singur nivel ar putea fi, de exemplu pentru a apăra o bază de pre-constructie pentru o anumită perioada de timp și la un alt nivel, sau misiunea ar putea fi escorta a unei unitati speciale de la o parte a hărții la alta.
Nivelurile în modul de campanie sunt construite în jurul unei povesti care se spune la player prin scene tăiate între nivelurile. Când joci un nivel, player-ul este plasat în interiorul aceastei povesti și are nevoie pentru a finaliza un nivel înainte de a putea trece la următorul capitol al poveștii.
În modul single player, un jucător poate juca împotriva unui adversar AI controlat. Nu există misiuni speciale, cum ar fi în modul de campanie. Jucătorul uman se joaca cu adversarul AI controlat în aceleași condiții; ei încep cu aceeași sumă de bani, același număr de unități și clădiri și pot în timpul jocului construi acelasi tip de unitati. Un joc skirmish poate fi în mod normal, 1 vs 1 , 2 vs 2 , 3 vs 3 sau 4 vs 4 în cazul în care toți aliații și adversarii sunt controlati de un AI.
Un joc multiplayer este asemanator celui single-player. Singura diferență este că adversarii sunt alți jucători umani. Există o mulțime de jucători profesioniști care joacă în modul multiplayer de jocuri RTS. Există de asemenea, o mulțime de diferite ligi și turnee pentru jocuri RTS și în unele țări există chiar Canale TV care arată doar jocuri RTS.
3 Analiza
În jocurile RTS AI-ul are nevoie de a controla unitățile individuale , decide ce trebuie construit, pune strategia de ansamblu , etc. În acest capitol diferitele tipuri de AI pentru jocurile RTS precum și teoriile de dezvoltare a AI sunt descrise. Din ambele tipuri de AI și diferitelor teorii una este aleasă pentru acest proiect. Mai mult, se discută dacă se integreaza dezvoltarea AI-ul într-un joc RTS deja existent, sau pentru a construi un nou RTS de la zero.
3.1 AI în jocuri RTS
După cum este descris în capitolul anterior, există atât de multe elemente diferite într-un joc RTS care trebuie controlate, incat este un pic vag pentru a vorbi pur și simplu despre un " AI pentru un joc RTS ". Brian Schwarb pledează pentru o serie de domenii în RTS-urile care trebuie să fie controlate de un AI. În cele ce urmează, voi descrie pe scurt și exemplifica aceste tipuri diferite de AI și decide cu privire la care dintre aceste tipuri de AI se concentreaza acest proiect.
Comportamentul unități individuale AI
Unul din rolurile de bază ale AI este de a controla comportamentul unității individuale. Pentru a gasi tiparul comportamentului de unități într-o bătălie, de exemplu, face ca o unitate de lupta sa se retraga atunci când este atacata de către unitățile inamice într-o anumită zonă. Unitățile individuale sunt inteligente si variază de la joc la joc. De asemenea, jucătorii pot suprascrie comportamentul unitatii individuale și preia controlul de la toate unitățile.
Unii jucători preferă micromanagement in timp ce altii prefera macromanagement. Micromanagement include, printre altele, unități în mișcare pentru a evita atacul inamic, făcând toate unitățile sa se concentreze astfel încât acestea sa nu poata scăpa.
Jucătorii care preferă macromanagement construiesc armate uriașe și apoi pur și simplu comanda intreaga armata sa atace unitățile inamice într-o anumită zonă, fără a specifica obiectivul.
Prin urmare, este nevoie de un echilibru al comportamentului unității individuale, care va fi util pentru ambii jucatori ce prefera micromanagement și care preferă macromanagement.
AI pentru comportament unitate de lucrător
Tipul de unitate lucrător este special, deoarece în acest proiect. Mai mult, se discută dacă se integreaza dezvoltarea AI-ul într-un joc RTS deja existent, sau pentru a construi un nou RTS de la zero.
3.1 AI în jocuri RTS
După cum este descris în capitolul anterior, există atât de multe elemente diferite într-un joc RTS care trebuie controlate, incat este un pic vag pentru a vorbi pur și simplu despre un " AI pentru un joc RTS ". Brian Schwarb pledează pentru o serie de domenii în RTS-urile care trebuie să fie controlate de un AI. În cele ce urmează, voi descrie pe scurt și exemplifica aceste tipuri diferite de AI și decide cu privire la care dintre aceste tipuri de AI se concentreaza acest proiect.
Comportamentul unități individuale AI
Unul din rolurile de bază ale AI este de a controla comportamentul unității individuale. Pentru a gasi tiparul comportamentului de unități într-o bătălie, de exemplu, face ca o unitate de lupta sa se retraga atunci când este atacata de către unitățile inamice într-o anumită zonă. Unitățile individuale sunt inteligente si variază de la joc la joc. De asemenea, jucătorii pot suprascrie comportamentul unitatii individuale și preia controlul de la toate unitățile.
Unii jucători preferă micromanagement in timp ce altii prefera macromanagement. Micromanagement include, printre altele, unități în mișcare pentru a evita atacul inamic, făcând toate unitățile sa se concentreze astfel încât acestea sa nu poata scăpa.
Jucătorii care preferă macromanagement construiesc armate uriașe și apoi pur și simplu comanda intreaga armata sa atace unitățile inamice într-o anumită zonă, fără a specifica obiectivul.
Prin urmare, este nevoie de un echilibru al comportamentului unității individuale, care va fi util pentru ambii jucatori ce prefera micromanagement și care preferă macromanagement.
AI pentru comportament unitate de lucrător
Tipul de unitate lucrător este special, deoarece în mod normal este foarte slab in luptă. Prin urmare, este nevoie de un AI care va face lucrătorii să fugă de luptă atunci când este atacat sau cel puțin să încerce să riposteze deși munca lor normală este de a recolta resurse.
Cu toate acestea jucătorii care preferă micromanagement vor avea dorințe diferite, cu privire la unitățile de lucrători decât jucători care prefera macromanagement.
Nivel mediu – AI strategic
Acest AI controleaza 5-30 unități și este creat atunci când nivelul superior AI decide să atace, de exemplu, inamicul de baza. Rolul principal al acestui AI este să asigure că atacul are toate unitățile forte și punctele slabe în considerare (atât propriu și dușmani), pentru a vă asigura că armata nu este irosita. În cazul în care comportamentul unitate individuală este aceeași pentru ambii jucători umani și jucători de calculator, AI-ul strategic de nivel mediu este necesar în mod normal doar de către jucător calculator , deoarece jucătorul uman va dori pentru sa conduca atacul.
La nivel înalt AI strategic
Similar cu nivel mediu – AI-ul strategic, are nevoie doar de către jucător calculator și este responsabil de strategia generală; atacare rapida, să crească o apărare puternică, cercetare rapida etc. Este de asemenea responsabil pentru a decide cum ar trebui să fie atacat inamicul ( prin aer, unitati de sol , etc ). În cele mai multe părți ale jocului acestui nivel înalt AI-ul strategic determină un stil de joc specific. Unii ar putea valora atacul și o economie puternică în timp ce altii ar putea să fie precauți. Prin schimbarea AI-ului strategic la nivel înalt, adversarul controlat de computer poate fi variat, oferind astfel jucătorului uman diferite experiențe de joc de la joc la joc.
Clădire oraș AI
AI-ul de asemenea, trebuie să știe unde să construiască clădiri noi, care în unele jocuri RTS este de fapt o parte foarte importantă a jocului. Pe multe hărți de exemplu în Starcraft, un jucător poate alege să blocheze intrarea la baza lui chiar de la începutul jocului prin plasarea clădiri pe calea care duce la baza lui. Acest lucru îi va da timp pentru a construi o economie puternică sau de cercetari noi, fără a fi nevoie de a utiliza banii pe unitati defensive. Cu toate acestea, acest lucru va da adversarului său posibilitatea de a prelua controlul unor zone mari de pe hartă. La începutul unui joc, acesta este un avantaj de a plasa clădiri apropiate, deoarece acest lucru va face mai ușor să -l apere de atacul inamic. Mai târziu în joc cu toate acestea, clădirile strâns plasate vor fi foarte vulnerabile la atacul inamic al armelor de distrugere în masă, care sunt capabile de a distruge clădiri și unități într-o zonă mare.
Analiza teren AI
Hărțile în jocurile RTS pot diferi foarte mult de la una la alta. Una ar putea fi desert deschis sau insule, iar unele ar putea avea o mulțime de resurse împrăștiate în jurul valorii de hartă în timp ce altele au doar puține resurse aflate la unele locuri centrale pe harta. Prin urmare, AI-ul trebuie să facă o analiză a terenului pentru a fi capabil de a determina modul în care să-și apere baza sa, cum să atace inamicul, cum să adune resurse, etc. Această analiză se face în mod normal prin trimiterea de unități ieftine pentru a explora harta și ar trebui să fie făcut în mod continuu, deoarece toți jucătorii pot afecta harta atunci când se folosesc de resurse pentru construirea de orașe.
Modelarea adversarului AI
Modelarea adversarului este procesul de urmărire a ceea ce construiește inamicul, când le construiește, atunci când în mod normal il va ataca. Acest lucru va oferi calculatorului informații cu privire la adversarul pe care-l poate folosi pentru a se adapta la stilul de joc.
Managementul resurselor AI
Gestionarea resurselor este un aspect vital in jocurile RTS și este despre colectarea resurselor și alegerea dacă să-și consume resursele colectate pe unități, clădiri sau tehnologie.
În fiecare joc jucătorul trebuie să decidă cu atenție ceea ce a construit într-un mod care îi va oferi atât o economie mai puternică cat și o armată mai puternică decât a adversarului. În plus, el trebuie să se asigure că produce cel mai bun tip de unități pentru o anumită situație. Jucătorii controlați de AI au adesea ordine de constructii specifice. Acest lucru va asigura că computerul continuă să fie o amenințare, deoarece acesta evită clădiri sau unități care sunt inutile, la un moment dat al jocului. Acest ordin de a construi toate acestea, face jucătorul calculator oarecum previzibil și ușor de a fi învins în cazul în care are o slăbiciune în ordinea construirii.
Jucătorii umani pot folosi, de asemenea comenzi build specifice, pe care le-au găsit pentru a fi optime într-o situație dată, de exemplu atunci când faci un atac rapid. Cu toate acestea, jucătorii umani vor avea mult mai mult de construit si de a alege noi variante de comenzi. În același timp, jucatorul uman este capabil de a schimba ordinea construirii atunci când descopera că strategia urmata nu este buna față de strategia aleasă de către adversar. Acest lucru este ceva în care computerul nu poate face orbește în urma unui ordin construit predefinit.
Recunoaștere AI
Recunoașterea este de a afla ce se întâmplă pe hartă. Așa cum am menționat mai devreme este în mod normal, ceea ce se numește "ceață de război" în jocurile RTS. Ceață de război înseamnă, că un jucător poate vedea doar zonele de pe hartă, unde are în prezent fie clădiri sau unități poziționate. Având în vedere că restul hărții este invizibil pentru el, unitățile inamice se pot deplasa pe hartă, fără a fi detectat și prin urmare recunoașterea este esențială pentru a afla unde sunt amplasate unitățile inamice și dacă este posibil care sunt planurile dușmanilor.
Cheating AI
Un punct care nu a fost discutat încă este posibilitatea ca AI-ul pentru a fi inselat, se întâmplă deja într-o mulțime de jocuri RTS. De exemplu acesta ar putea fi ales pentru a permite AI-ului sa fie afectat de ceață de război menționat mai devreme. Acest lucru ar însemna că AI-ul a fost întotdeauna conștient de ceea ce adversarii au fost, fac și prin urmare , nu ar avea nevoie de componenta de recunoaștere. Același lucru este posibil cu analiza de teren AI în cazul în care AI-ul ar putea cunoaște întreaga hartă de îndată ce începe jocul și cu construirea orașului ar fi putut fi pre-planificata de construcția pentru fiecare hartă.
Principalul motiv pentru alegerea posibilitatii de a lasa ieftin AI-ul este ca face dezvoltarea AI puțin complicata deoarece o mulțime de componente poata fi scoasa din ea. În plus, aceasta este o modalitate de a face AI-ul o luptă bună împotriva multor buni jucători umani.
Problema cu această soluție, desigur este că jucătorul ar putea simți că el joacă un meci nedrept atunci când adversarul AI întotdeauna pare să știe exact ce planuri are.
3.1.1 Sub – concluzie pentru AI în jocuri RTS
Este important de remarcat că diferitele componente AI pentru jocurile RTS descrise în acest capitol nu sunt o listă finită de componente AI generale in toate jocurile RTS dezvoltate până în prezent. Dacă aveți o economie puternică se poate construi unitățile potrivite pentru o anumită situație, avănd o bună șansă de a câștiga jocul, chiar daca s-ar putea să nu fie foarte buna la micromanagement. În ciuda acestui fapt, AI în multe din jocurile RTS pur și simplu se bazează pe ordinea de a construi după cum s-a menționat mai devreme. Există mai multe exemple, în cazul în care punerea în aplicare a unui management al resurselor AI este menționat, dar nu a fost explicat în detaliu. În această arhitectură există o unitate și un manager responsabili de a construe, producerea de noi unități și clădiri, dar decizia de a alege ce sa se construiasca este aceea ca este ascuns și nu este prestabilit. Un motiv pentru a alege gestionarea resurselor AI este că acesta poate fi implementata și testata într-un mediu închis. AI-ul se va baza numai pe unele situații de joc și ca urmare întoarce informații despre ce unitate sau clădire va construe, nu are nevoie de un complet RTS tipar initial pentru a putea da dovadă de utilitatea sa.
3.2.1 Retele neuronale
Retele neuronale sunt recunoscute pentru creare de AI-uri și sunt descrise în multe cărți cu crearea de AI pentru jocuri. Rețelele neuronale sunt construite într-un mod care simulează creierul uman si este construit folosind mai multe blocuri mici de constructii numite neuroni artificiali. Un neuron artificial este de intrare și de ieșire. Intrările reflectă în mod normal și numărul de intrări poate varia foarte mult de la o retea la alta. Fiecare intrare are o anumită greutate. Această greutate specifică cât de mult o anumita intrare ar trebui să conteze pentru interiorul neuronului. In interiorul neuronului este o funcție de activare, care este utilizată pentru a determina valoarea de ieșire pentru neuron. În această funcție de activare, toate intrările sunt multiplicate cu greutatea lor și se adaugă apoi împreună. În cazul în care valoarea totală este mai mare decât o anumită valoare de activare, neuronul va stabili ieșirea de la o valoare care arată că aceasta a fost activata. In caz contrar aceasta va fi setata la o valoare care să rezulte că neuronul nu a fost activat (acest lucru ar putea fi un 1 sau un 0). Această valoare este apoi trimisa la alti neuroni sau trimisa din retea ca unul dintre producțiile totale ale rețelei.Figura 3-1 O rețea de alimentare înainte.
Cel mai utilizat mod de a conecta neuronii este de a utiliza straturile. Rețeaua în Fejl! Henvisningskilde ikke fundet. se numește “o rețea de alimentare înainte” de la fiecare strat de neuroni hrănește producția sa în următorul strat de neuroni, până când o putere este data. După cum se poate observa din figura, rețeaua o rețea de alimentare înainte are un strat de neuroni numit stratul ascuns. Acest strat este pur și simplu un strat de neuroni situat între intrări și ieșiri. Rețele neuronale pot fi instruite pentru a recunoaste un model. Acest lucru se realizează prin ajustarea ponderilor în rețea. O metodă de a face acest lucru este metoda de "propagare înapoi". În această metodă,valoarea de ieșire din rețea este comparată cu valoarea de ieșire țintă. Diferența între aceste două se numește valoarea de eroare. Această valoare de eroare este trecuta la stratul de ieșire, unde ponderile sunt ajustate în funcție de valoarea de eroare . Acest proces continuă apoi prin straturile ascunse prin calcularea diferenței dintre stratul ascuns lângă stratul de ieșire și stratul de ieșire ajustat. Ponderile din acest strat sunt apoi ajustate și așa mai departe. O problemă cu folosirea acestei metode este că ar putea părea ca o cutie neagră. Caseta da unele intrări și returnează unele ieșiri. Cu toate acestea, pentru a urmări în jos de ce a fost făcută o anumită unitate sau clădire, cererea devine dificila din cauza diferitelor greutăți și conexiuni dintre neuronii din rețea și prin urmare AI-ul devine o sarcină dificilă.
3.2.2 Algoritmi genetici
Algoritmii genetici beneficiaza de modul în care are loc evoluția în natură: numai membrii cei mai adaptati unei specii supraviețuisc. Acest lucru asigură faptul că doar ADN-ul cel mai adaptat al unei generații este trecut la următoarea generație, rezultatul fiind cel mai puternic creat. Mai mult decât atât, erori mici vor avea loc din când în când, atunci când trecerea de ADN de la un părinte la un copil. Această mică eroare ar putea avea un efect negativ asupra copilului, care va avea apoi o șansă mai mică pentru ADN-ul generației următoare. Cu toate acestea, în unele situații rare aceste erori ar putea duce la efecte pozitive pentru copil, ceea ce face ca ADN-ul său sa treaca la o nouă generație. În algoritmi genetici sunt codificate soluții diferite pentru o problemă, de exemplu sub forma unei secvențe de numere binare. Aceste soluții sunt apoi puse pentru a rezolva o problemă și a acelora care efectuează cel mai bine sunt selectate pentru a produce următoarea generație de soluții. Această generație următoare este făcută prin luarea de date de la o soluție și combinata cu date de la o altă soluție. De exemplu, în cazul în care soluția este dată de o serie de zece numere binare, o soluție nouă ar putea fi generată prin luarea în primele 5 numere binare de la o soluție și ultimele 5 de la alta. Pentru a asigura o evoluție, micile modificări vor fi făcute din timp în acest copil. Acest lucru ar putea fi de a schimba un bit de la a fi un '0 ' de a fi un '1', sau ar putea fi pentru schimbarea poziției de biți. După o mulțime de generații, sperăm ca evoluția va veni cu o soluție bună la problema. Algoritmii genetici au fost utilizati cu mare succes în jocul Nero, unde soldații pot fi instruiți de război permițându-le să facă sarcini specific de un număr mare de ori și în mod continuu producerea de noi soldați, bazate pe cei care au efectuat cel mai bine de la generația anterioară. Cu toate acestea, o problemă cu utilizarea algoritmilor genetici pentru managementul resurselor AI este că am avea nevoie de populații întregi de gestionare a resurselor AI, din care cel mai bine pot fi selectate pentru producerea unor noi populații.
3.2.3 Mașini de stare
O mașină de stare finită este o tehnică frecvent utilizată pentru a lăsa un obiect si se comportă diferit în situații diferite și pot fi puse în aplicare cu o simplă declaratie de comutator. O mașină de stat este formata din patru elemente principale:
Starile care definesc comportamentul; tranzitii de stare, care sunt de mișcare de la un stat la altul; reguli sau condiții care trebuiesc îndeplinite pentru a permite o tranziție de stare; evenimente de intrare, care sunt externe sau interne generate și pot declanșa eventuale reguli.
De exemplu, un soldat poate fi sanatos, rănit și mort. Dacă el este în stare bună de sănătate va angaja soldatii inamici în luptă fără a se gândi prea mult despre evitarea atacului. Când starea lui de sănătate scade sub 50 %, regula de schimbare a starii ranitilor vor fi îndeplinite și tranziția va avea loc. Acum el nu va ataca orbește inamicul , dar va încerca să găsească acoperire pentru a evita atacul inamic. În cazul în care sănătatea lui scade la 0 %, o tranziție a starii de mort va avea loc și el nu va mai fi capabil de a trage in inamic. În acest fel comportamentul unui soldat poate fi controlat. O problemă cu această tehnică este că ar putea avea ca rezultat un comportament foarte previzibil. O soluție ar putea fi de a folosi utilaje de stare nedeterministe unde tranzițiile între stari sunt mai puțin previzibile. De exemplu, soldatul se poate schimba pentru a răni starea dacă starea lui de sănătate scade sub 50%, dar în cazul în care aceasta scade sub 60 %, nu poate fi o mica schimbare care s-ar putea schimba in acel moment. Acest lucru ar putea fi determinat fie de aruncarea unui zar (număr aleator), sau folosind logica fuzzy.
Mașina de stare ar putea fi ca atare folosita ca metodă de a face managementul resurselor. De exemplu, ar putea o stare sa fie Barrack Present care să permită producerea de soldați. Cu toate acestea, din moment ce există în mod normal o mulțime de diferite clădiri și unități din jocuri RTS, numărul de stari necesare ar fi enorme.
3.2.4 Logica fuzzy
O regulă în logică normală este scris sub forma "dacă A, atunci B altceva C". Aici condiția A trebuie îndeplinita exact în cazul în care B este efectuat. Acest lucru înseamnă că o condiție trebuie să fie specificata într-un mod clar. De exemplu, vrei să știi dacă un bărbat este înalt sau nu, va trebui în mod clar să se precizeze ce implică înalt. În cazul în care limita este stabilită de a fi 180 cm, o persoană care este de 179.99 cm inaltimea nu va fi văzuta ca fiind înalt. În logica fuzzy fiecare afirmație poate fi considerata ca fiind adevărata într-o anumită măsură. În cazul în care ceva este declarat a fi adevărat la un grad de 1, este absolut adevărat în timp ce 0 înseamnă absolut fals. Orice între este adevărat într-o oarecare măsură. De exemplu, o persoană care are 160 cm ar fi în jur de 0,80 grade înalta, în timp ce o persoană care a fost de 210 cm inaltime ar fi inalt la un grad de 1. Logica fuzzy functioneaza mai intai prin conversie. Aceste seturi pot fi scurte, medii și înalte și probabil se vor suprapune un pic, ceea ce înseamnă că valoarea de intrare poate aparține uneia sau mai multora dintre acestea. Există funcții pentru transformarea valorii de intrare în grade de adevăr pentru fiecare set. Aceste funcții sunt numite functii membre și pot varia foarte mult de la unul de altul, ceea ce va afecta gradul rezultat de adevăr. Exemple de funcții membre sunt: funcția de membru triunghiular , funcția de membru inversă și funcția de membru trapez.
Odată ce gradul de adevăr a fost gasit pentru fiecare din seturi, aceste grade de adevăr sunt folosite pentru a face premisa unor reguli neclare. O astfel de premisă ar putea fi:
"if(thinANDtall)".
În logica fuzzy rezultatul unei reguli va avea un anumit grad de adevăr. Dacă de exemplu, rezultatul "if(thinANDtall)" regulă este de a folosi mai multe variabile , atunci această variabilă va fi setata la o valoare între 0 și 1, în funcție de operanzi subțiri și înalte în premisa de la regula. Reala valoarea a variabilei foloseste în unele funcții evaluarea sau compararea celor doi operanzi. Ultimele rezultatele de la regulile sunt folosite pentru a găsi valoarea de ieșire. De exemplu, variabila foloseste mai multe cu valoarea de 0,6 în timp ce o variabilă foloseste mai puține cu valoarea de 0,3. Aceste valori sunt trimise în unele functii membre de ieșire care determină producția efectivă. În exemplul nostru, acest lucru ar putea fi de 0,45 ceea ce înseamnă că persoana care ar trebui să înceapă a folosit un pic mai mult.
3.2.5 Rețele Bayesian
Rețelele bayesiene sunt grafice care reprezintă compact relația dintre variabile aleatorii pentru o problemă dată. Folosind aceste grafice putem lua decizii, atunci când avem prea multă incertitudine ceea ce face dificil de a găsi soluția optimă pentru o problemă. Rețelele bayesiene folosesc probabilitatea condiționată și de regula Bayesiana pentru a găsi cea mai bună soluție pentru o problemă având în vedere ce am putea ști despre această problemă. De exemplu, un antrenor de fotbal, ar putea ști ce tactica folosesc adversarii în mod normal pentru echipa lor și ce jucătorii ii are la dispoziție. Pe baza acestor informații putem găsi cea mai bună tactică contra echipei. Rețelele bayesiene folosesc noduri pentru a reprezenta variabile aleatoare și arcuri pentru a reprezenta relația dintre aceste variabile. O variabilă aleatoare reprezinta o parte caracteristică a entității și pot fi în unele stari. Scopul rețelelor bayesiene este de a găsi starile, cel mai probabil pentru fiecare variabilă aleatoare. De exemplu, o variabilă aleatoare ar putea fi strategia adversarului care are starile 3-4-3, 4-4-2 si 2-4-4 care ne spune formarea probabilă a echipei adverse. O variabila aleatoare poate depinde de valoarea altei variabile. Acest lucru este reprezentat de un arc de indicare variabil care cauzează efectul. Putem folosi regula Bayesiana pentru a găsi probabilitatea variabilei într-o anumită stare data ceea ce știm despre variabilele sale. Definiția regulei este:
P(A|B) = P(A) * P(B|A) / P(B)
Ceea ce înseamnă că probabilitatea de variabila A dat variabilei B este egală cu probabilitatea A ori probabilitatea B o dată împărțita la probabilitatea de B. In acest fel se poate găsi probabilitatea unor ființe variabile aleatoare într -o anumita stare, chiar dacă nu putem măsura asta direct. Așa cum am menționat, acest lucru este util de exemplu în jocurile în care AI trebuie să ia decizii pe baza unor informații incomplete cu privire la situația de joc curent.
3.2.6 Concluzie privind alegerea teoriei
Teoriile AI descrise în această secțiune au fost rețelele neuronale, algoritmi generici , mașina de stari, logica fuzzy si retele bayesiene. După cum este descris la punctul 3.1, proiectul se va concentra pe dezvoltarea unui AI pentru gestionarea resurselor, în cazul în care se utilizează AI-ul pentru a determina ce unități se pot construi în timpul jocului. În acest scop Rețele Bayesiane sunt cele mai potrivite. Pentru un singur lucru în jocurile RTS jucătorii trebuie întotdeauna să ia o decizie bazată pe o mulțime de incertitudini, care este exact ceea ce reteaua Bayesiana este buna prin urmare la o alegere evidentă. Un alt motiv este că retelele Bayesiane sunt interesante din punct de vedere academic. În cazul în care rețelele neuronale, algoritmi generici, logica fuzzy și mașinile de stari, par a fi bine stabilite metoda AI în ( RTS ) pare a fi o metodă mai puțin folosită și mai puțin documentata.
3.4 Folosirea unui joc RTS existent sau crearea unui nou joc RTS
Pentru a putea testa capacitățile de AI puse în aplicare în acest proiect, AI-ul trebuie să fie integrat într-un joc RTS. Acest joc RTS ar putea să fie un joc existent cu un cod sursă accesibil, sau ar putea fi un joc pus în aplicare doar pentru acest proiect.
Lucrul cu un joc existent ar elimina o parte din munca pe care punerea în aplicare a unui întreg joc este necesara. Cu toate acestea, atunci când se utilizează un joc existent, AI-ul dezvoltat în această teză ar trebui să lucreze împreună cu toate celelalte AI-uri (constatare, strategie la nivel înalt, etc) și acest lucru ar putea duce la unele dificultăți atunci când se evaluează AI-ul. Integrarea AI-ul într-un joc existent ar necesita, de asemenea, de timp pentru a ajunge să înțeleagă motor de joc și de a integra AI-ul, cu toate componentele necesare de joc.
Prin urmare, a fost ales pentru a proiecta și implementa un mic joc RTS cu scopul specific de a testa managementul resurselor AI. Aceasta include mai multe variante de la definiția normală a unui joc RTS.
Mai întâi de toate jocurile RTS au în mod normal un anumit aspect. Jucatorul poate explora harta de joc și poate folosi diferite tactici care decide cel mai bine avantajul terenului. În plus, jucătorul trebuie să ia decizii în ceea ce privește plasarea de clădiri noi și are nevoie pentru a controla unitățile sale pentru a le evita focul inamicului, să atace unitățile inamice etc. Implementarea acestui spațiu, necesita o mulțime de muncă și prin urmare întrebarea este dacă resursa management AI ar putea fi dezvoltata și evaluata pentru un joc RTS în cazul în care acest aspect nu a fost pus în aplicare.
Acest aspect nu influențează direct managementul resurselor AI. În schimb, managementul resurselor AI este influențată de cererile de unități și de construcție care provin de la AI-ul strategic la nivel înalt și mediu. Aceste componente AI depind foarte mult de aspectul și managementul resurselor, prin urmare AI este afectat indirect de aspect. Schimbarea aspectului va schimba interfața jocului. După cum s-a menționat în descrierea de jocuri RTS, utilizatorul poate selecta în mod normal unități și clădiri pentru a a efectua sarcini specifice. Schimbarea aspectului, elimină de asemenea, această formă de interacțiune. În schimb, interfața se va compune din butoane care utilizatorul poate apăsa în scopul de a construi mai multe unități sau clădiri și a unor zone de text care afișează numărul actual de diferite unități și clădiri. Aceste modificări ridică întrebarea dacă jocul, va continua să fie un joc RTS. Jocul va fi în continuare în timp real și va fi în continuare un joc strategic și prin urmare, ar putea fi numit și joc RTS deși nu ar putea fi exact ceea ce oamenii în mod normal s-ar astepta la fi un joc RTS. Cu toate acestea, această întrebare nu este foarte importanta. Partea importanta este ca managementul resurselor AI va avea exact aceeași funcționalitate ca și într-un joc normal de RTS și lecțiile învățate în acest proiect vor fi folosite pentru proiecte “reale" de joc RTS.
4.1 Teoria probabilităților
Trebuie să ne bazăm pe teoria probabilității pentru a obține o idee care probabil o să se întâmple. Noi folosim teoria probabilității, în general și în jocuri atunci când nu suntem siguri despre ceva anume. De exemplu, un jucător care rămâne in baza lui într-un joc RTS și nu exploreaza harta merge pe tehnologie rapida, în timp ce un jucător care explorează harta devreme poate merge pentru un atac rapid. Cu toate acestea nu putem fi siguri. Dacă de exemplu, am descoperit ca adversarul nostru a explorat harta foarte devreme in joc, am putea concluziona că este foarte probabil ca el va face un atac rapid și prin urmare începem construcția de apărare. Pe de altă parte, el ar putea pur și simplu sa verifice dacă vom merge pentru tehnologie sau pentru un atac rapid și apoi, dacă vom folosi resursele în apărarea noastră s-ar putea obține un avantaj de a merge pentru tehnologia rapida. În aceste situații trebuie să ne folosim de probabilitate. Este probabilitatea ca adversarul nostru merge pentru un atac rapid mai mare decât probabilitatea de a merge pentru tehnologia de aparare. Distribuția arată ca aceste probabilități pot fi folosite atunci când se decide dacă să se pregătească pentru atac sau dacă ar trebui să folosim banii pe altceva decât apărare.
4.1.1 Spațiul și funcția de probabilitate
Un spațiu eșantion este un set de elemente care reprezintă toate valorile posibile pentru o anumită situație și este reprezentată de Ω, de exemplu, atunci când se ocupă cu probabilități de desen, dintr-un pachet normal de 52 de cărți în pachet, un exemplu în acest sens ar putea fi cazul de a extrage o carte de inimă din pachet. Aici evenimentele sunt cele a celor 52 de carti, care sunt de tip inima, precum și elementele de la acest eveniment sunt cărțile individuale. Mai mult, setul tuturor evenimentelor posibile, inclusiv un set gol și toate evenimentele complementare sunt numite sigma – algebra sau σ algebra de Ω. Pentru cartea noastră de joc de inimi, pică romb, patrate, toți așii, toate inimile, toate romburile, toate cartile roșii, etc. O funcție de probabilitate P( ) este o funcție a evenimentelor din spațiul eșantionului și determină probabilitatea ca un anumit eveniment are loc. Deci, dacă avem o inima ca eveniment va consta din elementele:
Inima = {H1,H2,H3… H13 }
apoi
P (inimi) = ¼
P ( { h1} ) + P ( { h2 }) + P ( { h3 }) …. P ( { H13 }) = ¼
Aceasta este o funcție de probabilitate ce atribuie un număr la toate evenimentele.
In plus, putem vorbi de asemenea despre un spațiu de probabilitate. Un spațiu de probabilitate este triplu { Ω, σ , P } unde Ω după cum s-a menționat este spațiul de probă, σ este setul tuturor evenimentelor posibile în Ø inclusiv setul de gol și toate evenimentele complementare și P fiind o probabilitate atribuita fiecărui eveniment din σ.
În teoria probabilităților avem în general probabilitatea unor evenimente ce trebuie să fie între 0 și 1 și suma probabilităților de toate elementele din spațiul de probă trebuie să fie 1.
De exemplu, pentru a extrage 10 inimi dintr-un pachet normal de carti este de 1/ 52. Scriem acest lucru ca:
P (E) = n / N = 1/52
deoarece există 10 de inimi din cele 52 de cărți posibile .
Dacă dorim în schimb posibilitatea de a extrage toate cartile, cele 10 inimi dintr-un pachet normal de cărți, vom avea:
P ( F ) = n / N = 51/52
Acest eveniment este de fapt aceeași cu probabilitatea de la primul eveniment care nu a avut loc și prin urmare:
P (F) = 1 – P (E)
Pentru a extrage 10 de inimă avem, prin urmare:
Psuccess = P (E)
Pfailure = 1 – P (E)
Psuccess + Pfailure = 1
4.1.2 interpretare Frecventa
Probabilitățile pot fi interpretate în moduri diferite. O modalitate este interpretarea frecventă în care probabilitatea unui eveniment obține valoarea n din N rezultate posibile ce determinată prin repetarea aceluiași experiment de mai multe ori.
Dacă am de exemplu, extrage o carte dintr-un pachet normal de cărți de 100 de ori am putea spune că probabilitatea de a extrage 10 de inima a fost de 5/52 sau 0. Cu toate acestea, în cazul în care experimentul a fost repetat de mai multe ori, probabilitatea de 10 de inimi s-ar ajunge mai aproape de 1/52. Sau altfel spus, în cazul în care experimentul este efectuat de n ori și10 de inimi este atrasă n din aceste N ori, probabilitatea P (E) din 10 de inimi ar fi:
P (E) = n / N = 1/ 52, N ∞
4.1.4 Reguli de probabilitate
Această secțiune va descrie pe scurt câteva reguli de probabilitate.
Dacă A și B sunt două evenimente mutual exclusive, numai una dintre ele poate avea loc la un moment dat. Probabilitatea ca unul dintre aceste evenimente sa aibe loc este:
P (AUB) = P (A) + P (B)
Dacă cele două evenimente nu se exclud reciproc, este posibil ca evenimentul A și B să apară în același timp. Acest lucru înseamnă că împărtășesc unele dintre elementele din spatiul de probă. Prin urmare am avea:
P(AUB) = P(A) + P(B) – P(A∩B)
Din moment ce elementele A și B sunt ambele găsite în P(A) și P(B), avem P(A∩B), de două ori, prin urmare trebuie să se extragă una dintre ele.
4.1.5 Independența
Evenimentul A și B, se spune că sunt independente dacă apariția uneia dintre ele nu depinde de apariția celuilalt. Probabilitatea de cele două evenimente independente A și B apar scrise: P(A∩B) = P(A) P(B)
4.1.6 Probabilitate condiționată
Atunci când cele două evenimente nu sunt independente, scriem probabilitatea evenimentului A ce a avut loc în condițiile în care știm că evenimentul B a avut loc ca:
P(A|B)
Probabilitatea ambelor evenimente A și B este:
P(A∩B) = P(A) P(B|A) = P(B) P(A|B)
Folosind această regulă se poate determina probabilitatea lui A care apar atunci când știm că B a avut loc ca:
P(A|B) = P(A∩B) / P(B) = P(A) P(B|A) / P(B)
Această regulă se numește teorema lui Bayes și ne permite să găsim probabilitatea P(A|B), atunci când știm că probabilitatea P înainte (A) ,probabilitatea P(B|A) și dovezi P(B). Procesul de a găsi P(A|B) este numit deducție Bayesiana și este un aspect foarte central al rețelelor bayesiene.
4.1.7 Independență condiționată
Probabilitatea condiționată poate găsi o modalitate de a verifica dacă cele două evenimente A și B sunt de fapt independente. Noi știm că ele sunt independente dacă oricare:
P(A) = 0 sau P(B) = 0 sau
P(A|B) = P(A) și P(A) = 0 sau P(B)! = 0
De fapt, putem arăta de asemenea, dacă două evenimente sunt condiționate independente. Două evenimente A și B, s-ar putea să nu fie independente, dar atunci când se introduce un al treilea eveniment C, știind că C a avut loc, A și B sunt independente.
De exemplu , dacă avem un joc în cazul în care un tanc se poate construi numai dacă avem o fabrică și o fabrică poate fi prezenta doar în cazul în care baza noastră principală a fost actualizata pentru a comanda centrul. Aici evenimentului A de a construi un rezervor nu este independentă de evenimentul B de a avea un centru de comandă. Cu toate acestea, în cazul în care avem, de asemenea eveniment C, înseamnă că avem de fapt o fabrică, atunci A și B devin independente. Știind că avem un centru de comandă nu va face mai mult sau mai putin posibil sa construim un rezervor atunci când știm , de asemenea, că avem o fabrică. Avem independență condiționată, atunci când:
P ( A | B∩C ) = P ( A | C ) și P ( A ) ! = 0 sau P ( B ) ! = 0
sau
P ( A | C ) = 0 sau P ( B | C ) = 0
4.1.8 variabile aleatoare
O variabilă aleatoare este un concept referitor la studiul matematic (cantitativ) al unui fenomen aleator (întâmplător). Acest număr nu trebuie să se afle între 0 și 1, așa cum este cazul pentru funcțiile de probabilitate. În schimb, numărul este o reprezentare de rezultat a evenimentului. De exemplu, evenimentul de desen de pe o carte dintr-un pachet de carti pot avea rezultatele: {inima, romb, trefla și patrate}. Aici o variabilă aleatoare ar putea fi, astfel încât în cazul în care rezultatul a evenimentului a fost inima variabila aleatoare ar fi 1, în cazul în care rezultatul a fost de romb variabila ar fi 2 și așa mai departe.
Un mod de a explica relatia dintre variabile și evenimente aleatorii este să se uite invers la funcția variabila aleatoare. Dacă ne uităm la evenimentul de a avea un număr par, atunci când au fost aruncate zarurile, o variabilă aleatoare ar putea fi astfel încât, un număr par ar fi 1 și 0. Dacă am inversa această funcție variabilă aleatoare și i-am oferi numărul 1 aceasta ne-ar da subset al spațiului probe ce conțin evenimentele {2 , 4, 6 }.
Motivul de ce ne-ar prefera noțiunea de variabile aleatoare în loc de noțiunea de evenimente este că variabilele aleatoare, în unele situații par a fi mai intuitive. De exemplu, dacă luăm în considerare evenimentul X = "numărul de ori, atunci când se roteste o monedă de 20 de ori la rând". În acest exemplu, variabilele aleatoare ne precizeaza probabilitatea de a se invarti de cel puțin 10 ori scriem: P(X>10). Acest lucru nu se poate face direct cu evenimente care în schimb trebuie să definească un complet nou eveniment pentru a obține rotiri de cel puțin 10 ori.
Când avem un domeniu cu o problemă specifică variabilele aleatoare sunt folosite pentru a reprezenta o anumită caracteristică a unei entități în domeniul nostru și suntem interesați să știm care este starea acestei variabile aleatoare. În jocul nostru RTS, de exemplu, un jucător poate avea sau nu o fabrică. Aici fabrica variabila aleatoare poate fi atat adevarata cat si falsa.
Când definim variabilele aleatoare, este important ca acestea sa fie suficient de precise pentru a trece testul de claritate, care este un test folosit pentru a scoate orice ambiguitate din stările posibile ale unei variabile aleatoare. În test ne imaginăm că există un clarvăzător ce știe totul despre starea actuală a lumii. Acest clarvăzător trebuie să fie apoi posibilitatea de a stabili fără echivoc starea actuală a variabilei aleatoare. Deci, dacă avem o armata, variabila aleatoare poate lua valori mici, medii sau mari si nu va trece testul deoarece nu vom ști exact ce dimensiuni militare aparțin starilor. De exemplu 300 inseamna o parte din mediu sau mare de soldati?
Dacă în schimb, valorile au fost mai mari decat armata soldatilor, sau mai mica decat armata aceasta sau egala cu armata inamicului, clarvăzătorul ar fi într-adevăr în măsură să spună fără echivoc care afirmatie variabilă este în prezent.
4.1.9 de distribuție în comun de probabilitate
Distribuția de probabilitate comună este probabilitatea ca toate variabilele din domeniul problemei au o anumită valoare la un moment dat. În cazul în care variabilele sunt independente am scrie acest lucru ca:
P ( X = x , Y = y) = P ( X = x ) P ( Y = y) = P ( x ) P ( y)
și în cazul în care nu sunt independente am scrie:
P ( X = x , Y = y) = P ( x | y ) P ( y ) = P ( y | x ) P ( x )
unde X și Y sunt două variabile aleatoare și x și y sunt valori specifice pentru X și Y.
Distribuția de probabilitate este comuna in toate combinațiile de variabile într-un domeniu problemă. Deci, pentru fiecare X variabilă, am avea nevoie pentru a se multiplica probabilitatea pentru fiecare dintre starile X ce pot lua probabilități de toate stările posibile ale celorlalte variabile din distribuția de probabilitate comună. De aceea ar trebui să facem unde m este numărul de stari în variabilele și n este numărul de variabile.
4.1.10 distribuție marginală
O modalitate de a calcula probabilitatea unei variabile aleatoare dintr-o distribuție de probabilitate comună, anumită valoare este prin însumarea tuturor valorilor de celelalte variabile. Ca exemplu, se ia în considerare distribuția de probabilitate comună a celor două variabile X și Y. Dacă lăsăm x și y (setul de valori pentru X și Y), fie {adevarat , fals} și { adevarat, fals} , putem folosi distribuirea marginala de X pentru a găsi probabilitatea de a X a fi adevărat:
P(X = true), (X = true, Y = y) = P(X = true, Y = true) + P (X = true, Y = false)
Chiar dacă acest lucru s-ar putea arata ca o modalitate ușoară de a găsi probabilitatea de o variabila într-o anumita stare, există o problemă cu metoda și anume că numărul de valori, de care avem nevoie pentru a găsi distribuirea marginala de X, crește exponențial cu numărul de variabile în distribuția de probabilitate comună.
Design implementarea 6 Joc
Acest capitol descrie pe scurt clasele necesare pentru punerea în aplicare a jocului RTS și descrie comunicarea dintre aceste clase .
player
Clasa jucătorului este responsabila pentru stocarea tuturor informațiilor cu privire la un jucător. Aceasta clasa face parte din: muncitori, lightsoldiers , heavysoldiers , lighttanks , heavytanks , barăci și fabrici aparținând jucatorului. Aceasta include, de asemenea, suma de bani pe care jucătorul o are în posesia lui. Clasa jucător este responsabila pentru modificarea acestor informatii pe tot parcursul jocului.
Unități și clădiri
Un mod evident de a proiecta unitățile și clasele de construcție ar fi să avem super unitati si super clădiri pentru a permite unității individuale și tipurilor de construcții sa fie generalizăte de aceste clase. Cu toate acestea, toate unitățile împărtășesc exact aceeași caracteristică; timp de construire, pret, viata, putere de distrugere, tipuri de arme și amortizare, avand exact aceleași caracteristici. În schimb va exista doar o singură unitate de clasă și o clădire de clase. Pentru a distinge diferentele de tipuri de unități, clasa jucător va avea un fisier pentru fiecare tip. Acest lucru va oferi un acces rapid la informații din diferite unități și clădiri deținute de către jucător.
TheFactory
Fabrica este o inima și este disponibila pentru toate celelalte clase de care au nevoie pentru a construi unități sau clădiri noi. De asemenea, această clasă va conține valori pentru diferite caracteristici ale unităților și clădirilor care vor fi folosite la construirea de noi unități și clădiri . Acest lucru oferă un mod foarte simplu de a optimiza jocul prin ajustarea acestor valori.
TheBattle
Batalia este responsabila pentru calcularea rezultatului unei lupte. Ea face acest lucru prin a lua puterea de distrugere a tuturor unităților, care rulează această valoare prin convertor de putere și apoi livreaza prejudiciul final la o unitate țintă. Acest lucru se face prin apelarea la o metodă specifică care va determina apoi rezultatul final al atacului.
GraphAI
Clasa grafica contine toate nodurile care construiesc Rețeaua Bayesiana. Ea are metode pentru a face diferențe sau aproximari în rețea. In plus, metode pentru stocare, restaurare și modificare a tabelelor pentru nodurile din rețea, cu toate acestea , logica principala pentru a face aceste operațiuni se află în clasele de utilitate Serialize și TableModifier. Prin urmare, motivul principal din clasa grafica este o stare între clasa GameCore și cele două clase de utilitate.
MoneyProvider
Aceasta clasa este folosita pentru a da banii pe jucători prin verificarea muncitorilor care aparțin unui jucător gata să plateasca.
Verificari inactive
Responsabilitatea verificarii de a nu avea clădiri inactive este pentru a nu avea unități care așteaptă să fie inactive. Prin urmare, în cazul în care o clădire este inactiva cererea este de verificare a obiectului ca aceea clădirea sa începea să producă unitatile solicitate.
Ordinea
Aceasta clasa produce obiecte construite pe comanda. Când un jucător cumpără un lucrător, unitate militară sau o clădire, această clasă este responsabila de eliminarea prețului pentru această unitate si sa ia din banii jucătorului. Este de asemenea, responsabil de producerea ordinei de a construi și plasa aceasta ordine pe lista de jucători de bază principală, baracă sau fabrici de construire.
Constructorul
Aceasta clasa este responsabila pentru transformarea jucătorilor construiti în unități și clădiri reale. In plus se elimină comanda de a construi corespunzătoare data de jucator și în cazul în care jucătorul a construit mai multe comenzi așteapta urmatoarea comanda.
Procesul jocului
Clasa procesare de joc este numele ce descrie nucleul jocului. Acesta funcționează ca un strat între interfața și cronometrele ce controlează jocul și clasele care pot efectua logica de joc efectiv de utilizare. De asemenea, din această clasă se poate alege care test sau metodă de învățare rula .
Constructia jocului IA
Această clasă este interfața pentru utilizator. Aici, toate butoanele și câmpurile de text sunt create și actualizate. În plus,aceasta face cereri de constructii ( atunci când este apăsat un buton ).Contra cronometru se asigura că GraphAI , theBattle ,MoneyProvider și IddleChecker sunt verificati periodic.
Figura 6-1 Joc Class Diagram
6.1 Funcționalitatea jocului
În afară de IA, care decide ce s-a construit într-o anumită situație, există practic două funcții principale în joc. Jucătorul poate construi o unitate sau clădire și unitățile pot ataca alte unități și clădiri.
Ordinea construirii
În joc, barăci și fabrici pot construi doar o unitate la un moment dat și principala bază poate construi doar un singur lucrător, baracă sau fabrica la un moment dat. Cu toate acestea, un jucător, sau IA-ul , poate face în continuare mai mult de o cerere la un moment dat. Această cerere este pe lista de așteptare a clădirilor responsabile de constructii iar unitatea va începe sa faca muncitorul sau clădirea solicitata de îndată ce toate cererile anterioare au fost finalizate. Această funcționalitate a fost implementata pe baza modelului de comandă[ 24 ]. Ori de câte ori se solicită o unitate sau clădire, un obiect se construieste in ordinea in care este creat și introdus pe lista clădirilor responsabile de constructii. Acest obiect de constructii este creat cu o valoare care indica ce tip de unitate sau clădire a fost solicitat. În cazul în care clădirea (de exemplu, o baracă ) este gata pentru a începe construirea unității, se executa metoda ce se numește ordinea constructiei. În funcție de valoarea pe care o are obiectul constructiei, se va crea în această metodă un temporizator cu un nume pentru tipul de unitate și timpul ramas pentru cronometru.
Când expiră, acesta este primit în clasa constructiei jocului IA. De aici, o metodă pentru construirea unității sau clădirilor solicitate este numita clasa procesorului de joc. Cu toate acestea, clasa procesorului de joc este responsabila de asteptarea claselor capabile să execute funcționalitatea cerută de clasa constructiei jocului IA. Prin urmare, solicită una din metodele din clasa Constructoare. Aceasta clasa este responsabila pentru procesul de construire de noi unități și clădiri. Atunci când este utilizata va construi, fie de la cazarmă, fabrica sau baza principala și solicită obiectul jucătorului pentru a adăuga unitatea sau clădirea în listele sale de unități și clădiri. Obiectul jucător face acest lucru prin a cere fabricii o nouă instanță a acestei unități sau clădiri. Fabrica știe fiecare detaliu despre obiectul solicitat și prin urmare, se poate reveni imediat. În cazul în care mai multe comenzi construiesc obiectul fabricii va apela metoda executa pe următoarea linie. În cazul în care nu există mai multe comenzi construite clădirea este setata pentru a fi inactiva. Obiectul inactiv verifică permanent dacă clădirile sunt inactive și dacă este cazul, verifică dacă au primit noi ordine de construire. În cazul în care acest lucru este facut, cazul se numește metoda de a executa primul obiect din listă.
Bătălia
Când două IA joaca una împotriva celeilalte este important ca diferențele în performanțele lor sunt cauzate numai de către unitățile și clădirile deținute de jucători, și nu cum sunt untitale lor controlate intr-o lupta. Prin urmare, o funcție de luptă care a fost pusă în aplicare, este utilizata de către ambele IA și asigură că luptă în exact același mod. În cazul în care un om se joacă împotriva unui adversar IA poate fi aleasa ca funcția IA sa-si controleze unitățile.
Funcția de luptă este numita la fiecare cinci secunde clasa procesorului de joc. În cazul în care una din principalele baze este distrusa, funcția de luptă va reveni la informația procesorului de joc care va încheia atunci jocul.
Din moment ce toate unitățile sunt puternice față de tipurile de unități specifice și slabe împotriva altora, funcția de luptă asigură, că unitățile încerca mereu să tragă in tipul de unitate în care sunt cele mai puternice. În cazul în care adversarul nu are unități de acest tip vor încerca să tragă in unitățile care sunt de-al doilea cel mai puternic împotriva și așa mai departe.
La fiecare apel, puterea de foc totală a unui tip de unitate este calculat. Acest lucru se face prin înmulțirea numărului de unități de acest tip de unitate cu puterea de foc pentru tipul de unitate. Rezultatul constituie puterea de foc totală a acestui tip de unitate. Cu toate acestea, în funcție de tipul de armura avuta, doar un anumit procent din acest foc va fi tratată ca daune pe tinta. Puterea de foc finală este găsita prin apelarea de convertor de daune avand informații despre tipul de arme din unitatea de atac și de tipul de armura a unității de apărare.
Odată ce puterea de foc reala de un tip de unitate a fost găsita, prejudiciul este tratat în unitățile atacate. Aceste unități sunt stocate într-o listă în obiectul jucătorului. Acesta este apoi determinat de cât de multe unități ar trebui să fie eliminate de pe această listă și în cele din urmă prejudiciul rămas nu este suficient de mare pentru a ucide o unitate.
7.1 Ce am construit?
AI-ul în joc va avea o funcționalitate de bază și anume pentru a afla ce unitate va fi mai deștept pentru a construi într-o anumită situație . AI-ul este de a fi numit periodic de la bucla de joc și la fiecare apel se întoarcă răspunsul său la cursuri care se ocupă de fapt, construirea unității sau clădirii solicitate .
AI-ul , desigur, va avea nevoie de câteva informații despre situația curentă a jocului să fie în măsură să dau seama ce unitate sau clădire de a construi . Aceste informații ar putea veni de la un AI strategic la nivel înalt de informare a managementului de resurse , dacă acesta a fost de planificare un atac stealth , dacă a existat o amenințare de inamic atac aerian etc Cu toate acestea , o astfel de AI strategic la nivel înalt nu este de gând să fie puse în aplicare pentru acest joc deoarece accentul trebuie să rămână cu privire la gestionarea resurselor AI . În schimb, managementul resurselor AI va primi toate informațiile următoare , la fiecare apel :
– Câți bani se player ( calculator ) au ?
– Câți dintre fiecare tip de unitate are player ( calculator ) au ?
– Câți dintre fiecare tip de unitate are inamicul are ?
– Câți dintre fiecare tip de clădire se player ( calculator ) au ?
Pe baza acestor informații și pe cunoștințe cu privire la avantajele și dezavantajele fiecărei unități și clădiri , AI-ul este de a fi în măsură să decidă ce unitate sau clădire de a construi , la un anumit moment .
7.2 Identificarea variabilelor aleatoare necesare
În analiza sa decis să dezvolte AI folosind Bayesian Networks . Această secțiune va identifica variabilele aleatoare necesare în rețea .
De ieșire din rețea va fi o alegere între , fie construirea unui lucrător , unitate militară , o clădire sau nimic , la toate . Prin urmare , o variabilă aleatoare este nevoie de ceea ce va fi posibil să se facă această alegere odată ce știm distribuția variabilei aleatoare . Această variabilă aleatoare se numește WhatDoWeBuild .
Totușimasa pentru această variabilă aleatoare ar fi foarte mare dacă toate informațiile din domeniul urma să fie reprezentat în ea . Prin urmare, sunt necesare și alte variabile aleatoare , care va afecta ceea ce afirma variabila WhatDoWeBuild ia . Aceste variabile pot fi împărțite în două grupe : variabile aleatorii externe , care reflectăsituația curentă a jocului și care nu pot fi modificate decâtentitatea care o reprezintă își schimbă starea ; și variabile aleatoare interne care pot fi modificate ca rezultat al altor variabile aleatoare cu valori particulare . Tabelul 7-1 prezintă variabilele aleatoare externe .
Nume Descriere Valori posibile
NumberOfWorkers Afișează numărul de lucrători deținute de calculator 0 ^ 10
NumberOfOwnLightSoldiers Afișează numărul de lightsoldiers în armată computere 0 ^ œ
NumberOfEnemyLightSoldiers Afișează numărul de lightsoldiers în armata inamici 0 ^ œ
NumberOfOwnHeavySoldiers Afișează numărul de heavysoldiers în armată computere 0 ^ œ
NumberOfEnemyHeavtSoldiers Afișează numărul de lightsoldiers în armată computere 0 ^ œ
NumberOfOwnLightTanks Afișează numărul de lighttanks în armată computere 0 ^ œ
NumberOfEnemyLightTanks Afișează numărul de lighttanks în armată computere 0 ^ œ
NumberOfOwnHeavyTanks Afișează numărul de heavytanks în armată computere 0 ^ œ
NumberOfEnemyHeavyTanks Afișează numărul de heavytanks în armata inamici 0 ^ œ
NumberOfBarracks Afișează numărul de Barracks deținute de calculator 0 ^ 4
( valori peste 4 vor fi considerate ca egal cu 4 )
NumberOfFactories Afișează numărul de fabrici deținute de calculator 0 ^ 4
( valori peste 4 vor fi considerate ca egal cu 4 )
Bani ( M ) Arată numărul de bani posedat de calculator 0 = 0 < = M < preț LS 1 = LSPrice < = M < HS preț 2 = HSPrice < = M < preț LT 3 = LTPrice < = M < HT preț 4 = HTPrice < = M < BarPrice 5 = BarPrice < = M < FactPrice 6 = FactoryPrice < = M ( Bar = Barrack , Fac = Factory )
Cu variabilele aleatoare externe în loc , variabilele aleatoare interne necesare pot fi determinate . În primul rând ,numărul de unități aparținând celor două unități de AI și adversă trebuie să fie comparate pentru a avea o imagine clară a stării intensitate a curentului pentru fiecare tip de unitate . Deoarece acest lucru va da o indicație de care sunt necesare unități și care nu sunt necesare în special , acest lucru va influența puternic alegerea finală a ceea ce pentru a construi .
Acest lucru conduce la cinci variabile aleatoare . Patru pentru compararea tipurilor individuale unitare și cea care , pe baza valorii de laultimele patru , va determina starea generală de forte unitare , și , de asemenea, cât de mult este nevoie de o unitate de fiecare tip de unitate ( Tabelul 7-2 ) .
Nume Descriere Valori posibile
LSstatus Indică dacă computerul are mai multe sau mai multe lightsoldiers ca inamicul sau dacă inamicul are mai mult de 1 ( mai mult sau egal )
2 ( mai puțin )
HSstatus Indică dacă computerul are mai multe sau mai multe heavysoldiers ca inamicul sau dacă inamicul are mai mult de 1 ( mai mult sau egal )
2 ( mai puțin )
LTstatus Indică dacă computerul are mai multe sau mai multe lighttanks ca inamicul sau dacă inamicul are mai mult de 1 ( mai mult sau egal )
2 ( mai puțin )
HTstatus Indică dacă computerul are mai multe sau mai multe heavytanks ca inamicul sau dacă inamicul are mai mult de 1 ( mai mult sau egal )
2 ( mai puțin )
WhichUnitIsNeeded Determină unitate care computerul are nevoie cel mai mult la un anumit moment 0 = lighsoldier
1 = heavysoldier
2 = lighttanks
3 = heavytank
Variabilele prezentate mai sus oferă o imagine de care sunt necesare unități . Cu toate acestea , înainte de a decide de a construi o unitate specific , este necesar să se decidă dacă pentru a construi o unitate militară sau un lucrător . Această decizie ar fi fost făcute de către permițându- WhichUnitlsNeeded depinde de cantitatea de lucrători disponibilă . Cu toate acestea , deoarece WhichUnitlsNeeded prezinta starea și are nevoie de numai unități militare , a fost ales pentru a permite alegerea între un muncitor și o unitate militară se face prin propria variabilă aleatoare numit UnitOrWorker ( Tabelul 7-3 ) .
Tabelul 7-3 o variabilă aleatoare , de a decide dacă pentru a construi o unitate sau un lucrător
Nume Descriere Valori posibile
UnitOrWorker Afișează nevoile lucrătorilor și unitățile militare 0 = lucrător
1 = lightsoldier
2 = heavysoldier
3 = lighttank
4 = heavytank
Următor se va stabili dacă unitatea de necesar este cu adevărat ceea ce este cea mai mare nevoie , sau dacă ar fi mai bine pentru a construi o clădire , care pot construi acest tip de unitate sau , în cazul în care o clădire există deja , se va face mai rapid de a construi unități de care tastați în viitor .
Această decizie se va face în trei noduri ; SoldierOrBarrack , TankOrFactory și BuildWorker ( Tabelul 7-4 ) . Aceste trei va avea tot nodul UnitOrWorker ca părinte și alături de care
-SoldierOrBarrack va avea NumberOfBarracks nodul externe ca părinte ,
-TankOrFactory va avea nodul NumberOfFactories ca părinte
– Și BuildWorker va avea NumberOfWorkers ca părinte .
Nume Descriere Valori posibile
SoldierOrBarrack spune dacă este nevoie de o lightsoldier , heavysoldier , baracă sau nimic 0 = nimic
1 = lightsoldier
2 = heavysoldier
3 = Barrack
TankOrFactory spune dacă este nevoie de o lighttank , heavytank , fabrică sau nimic 0 = nimic
1 = lighttank
2 = heavytank
3 = fabrică
BuildWorker Spune-i dacă este nevoie de un lucrător sau nimic, 0 = nimic
1 = lucrător
În cele din urmă va fi acum posibil să se decidă ce să construiască . Ultimul WhatDoWeBuild nod ( Tabelul 7-5 ), va avea patru părinți ; cele trei noduri înainte menționate SoldierOrBarrack , TankOrFactory și BuildWorker , iar banii nod .
Tabelul 7-5 variabilă aleatoare , de a decide ce pentru a construi
Nume Descriere Valori posibile
WhatDoWeBuildpunctul de decizie definitivă a ceea ce pentru a construi de fapt . 0 = Nimic
1 = lucrător
2 = lightsoldier
3 = heavysoldier
4 = lighttank
5 = heavytank
6 = Barrack
7 = Factory
În acest nod , acesta va fi în primul rând determinat ceea ce cererea este de a construi . După aceasta , prețul pentru această cerere construi vor fi comparate cu situația curentă de bani . Dacă nu există suficienți bani vor fi construite unitatea sau clădirea solicitat și altfel nimic nu va fi construit la toate .
Rețeaua completă Bayesian poate vedea în figura 7-1 .
Figura 7-1Rețeaua bayesiană
7,3 deciziile de proiectare
Proiectarea rețelei Bayesian a suferit numeroase modificări , prin dezvoltarea sa . În această secțiune unele dintre problemele majore de proiectare sunt explicate .
O problemă de proiectare a fost de a lăsa SoldierOrBarrack , TankOrFactory și BuildWorker fi trei noduri individuale , în cazul în care în loc acolo ar fi putut fi un nod singur cu o masă mai mare . Motivul pentru alegerea acestui design este că , în funcție de valoarea de lanodul UnitOrWorker , aproape 2/3 din liniile tabelei pentrunodul combinat ar fi exclus să devinăvaloarea aleasă amesei . De exemplu , în cazul în care nodul UnitOrWorker returnează valoarea 1 , ceea ce înseamnă că unitatea de dorit este un lightsoldier , informațiile cu privire la numărul de fabrici disponibile și despre dacă este nevoie de o lighttank , heavytank și muncitor devine irelevantă și ar fi , în schimb, cursul unei masă inutil de mare .
Prin urmare, a fost ales pentru a împărți acest nod mare în sus, în trei noduri cu mese mai mici . Cu toate acestea , deși acest design separă informații nu se bazează pe reciproc unul de altul , această alegere are , de asemenea, unele dezavantaje . Dacă ne imaginăm că din nou nodul UnitOrWorker returnează valoarea 1 , acest lucru va duce la mesele BuildTankOfFactory și BuildWorker atât întorc un 0 sens construi nimic . Acest lucru este evident atunci când se uită la diagrama pentru
Rețea Bayesian ( Figura 7-1 ) , cu toate acestea, computerul ar trebui să exploreze toate rândurile din tabelele de la cele două noduri de a seama de acest lucru .
Un alt aspect de proiectare a fost locația nodului de bani . In multe variante deproiectarenodul bani a fost plasat în partea de sus a graficului și a afectat în consecință cererile de unități specifice mai mult decât o face acum când sunt plasate în partea de jos a graficului .
Motivul principal pentru design-ul ales a venit de la încercarea de a se gândească la modul în care s-ar putea să decidă în mod normal, ceea ce unitate pentru a construi . Dacă s-ar privi în mod normal la suma de bani disponibile și din acest decide ce pentru a construi , apoi primele modele probabil ar fi fost o alegere mai bună . Cu toate acestea , de multe ori acest lucru nu este ceea ce se întâmplă . În mod normal, nevoile dumneavoastra vor veni de la alte elemente în joc ; propria strategie , strategia de dușmani , numărul de un anumit tip de unitate în armata ta și în armata dușmani și așa mai departe . Ma gandesc la ea în acest fel , atunci banii nu ar trebui să decidă ce să construiască . În schimb , în cazul în care unul are mai puțini bani decât prețul unității necesar sau clădirii , s-ar putea aștepta pur și simplu un timp, până când mai mulți bani au fost primite . Dacă nodul bani a fost plasat în partea de sus a graficului , unitatea solicitată în unele situații ar deveni o unitate care a fost accesibile în loc de o unitate care nu era accesibil, dar , de fapt, necesare .
7.4 Cadrul grafic
În secțiunile anterioare au fost determinate variabilele aleatoare necesare pentru rețea . Cu acestea în loc următorul pas este de a implementa rețeaua de aceste variabile . O soluție simplă pentru acest lucru ar fi să implementeze rețeaua ca un singur fișier și atunci când se ocupă cu doar un număr mic de variabile acest lucru ar fi într-adevăr ușor . Problema cu această soluție este faptul că este foarte static și nu permite cu ușurință pentru modificări ale rețelei și , atunci când numărul de variabile crește , această problemă devine și mai acută .
Prin urmare, o soluție mai dinamic a fost dezvoltat pentru acest proiect . În această soluție în fiecare nod este reprezentat ca un obiect al unei clase nod și fiecare nod are referințele la părinții săi care sunt utilizate atunci când traverseazărețeaua . În acest fel noi noduri pot fi ușor adăugate la rețeaua prin crearea de obiecte de nod și adăugarea de referințe la acest obiect la copii sale . Cu toate acestea , sunt necesare 6 tipuri diferite de clase de noduri ( vezi figura 7-2 ), de la modul în care un nod va determina valoarea de retur ( de stat ) este diferit de la nod la nod . În cele ce urmează , diferitele noduri sunt descrise .
BaseNode
A
Nod intervalNode ContinuousNode DeterministicNode ContDependentNode SemiDeterNode
Clase de cadru figura 7-2 Grafic
nod
Un nod de acest tip utilizează valorile returnate de la părinții săi ca index pentru căutarea de propria sa valoare întoarcerea în tabela sa .
ContinuouslyNode
Acest tip de nod stochează informații cu privire la o entitate din domeniul problema care poate lua cu privire la orice valoare de la 0 la infinit . Aceste noduri vor avea nici o masă , dar se va întoarce pur și simplu numărul care va fi stabilită înainte de algoritmul AI ( algoritm de interogare – a se vedea 7.6 ), se numește .
ContDependentNode
Noduri de acest tip au doar două ContinuouslyNodes ca părinți . Când a fost întrebat de o valoare a ContDependentNode vor compara valorile doi parinti sale și a reveni un număr care indică dacă valoarea părinte 1 este mai mare sau mai mică decât valoarea de părinte 2 .
IntervalNode
Un exemplu în acest nod este un nod de bani . În funcție de cantitatea de bani pe care jucătorul are , acest nod va reveni o anumită valoare . Pentru a determina ce valoare să se întoarcă , acest nod va verifica în ce interval de valori de valoarea curentă de bani este . Acest lucru ar putea fi mai mic decât prețul de un lucrător , între prețul de lucrător și prețul unui heavysoldier și așa mai departe . Aceste intervale vor fi stocate într-un tabel care aparține nodul .
DeterministicNode
Acest nod poate lua pe o valoare dintr-un set predefinit de valori posibile . De exemplu,nodul de munca poate avea o valoare de la 1 la 10. Acest nod va avea nici o masă .
SemiDeterministicNode
Acest nod poate lua , de asemenea, la o valoare dintr- un set predifined de valori posibile . Cu toate acestea , acest nod va avea o limită superioară , ceea ce înseamnă că în cazul în care atributul are o valoare mai mare decât această valoare , valoarea returnata de la nodul va fi setat la valoarea maximă . Un exemplu în acest sens este nodul NumberOfBarracks , care poate avea o valoare de la 0 la 4 , deși un jucător s-ar putea construi cinci barăci sau mai multe .
BaseNode
În cele din urmă este nevoie de un nod de clasa super- de la care toate celelalte tipuri de noduri vor moșteni . Acest lucru previne nodurile de la a fi nevoie să știe despre toate celelalte tipuri de noduri , atunci când stocarea indicii pentru părinții lor . În schimb, ei trebuie doar să știe nodul de clasa super- .
Acest cadru face posibil pentru a construi cu ușurință în rețea și , de asemenea, modifica -l pur și simplu crearea sau ștergerea obiectelor nod și prin rearanjarea referințele dintre aceste
obiecte nod . Secțiunea 7.6 descrie algoritmul care face posibil pentru a obține un răspuns de la rețea .
7.5 implementarea de învățare și de testare
Cadrul grafic face ușor de a construi o rețea și de a -l modifica . Cu toate acestea , pentru a instrui rețea și de a observa rezultatele acestui training alte clase sunt necesare . Aceste clase sunt descrise în această secțiune .
TableProducer
Înainte de AI-ul poate returna un rezultat de care unitate sau clădire pentru a construi , tabelele pentru fiecare nod din rețea trebuie să fie inițializat . Că este , distribuția de probabilitate dat fiecare combinație posibilă a statelor mamă trebuie să fie scrise într-un tabel . Acest lucru ar putea fi realizat manual, dar din moment ce tabelele devenit rapid foarte mare, acest lucru ar fi un proces greoi . Prin urmare , clasa TableProducer a fost pusă în aplicare . Aceasta clasa poate construi tabele de aleatoare pentru Graficul AI . Fiecare masă produs va urma restricțiilor specificate pentru fiecare tabel , dar va pe lângă de care conțin numere pur aleatoare . De exemplu , în tabelul SoldierOrBarrack , nu ar face prea mult sens pentru a avea o distribuție spune că probabilitatea de a construi un soldat a fost de 0,8 , deși jucătorul nu a avut nici cazarma de unde acest soldat ar putea fi construit . Prin urmare, probabilitatea de a construi un soldat trebuie să fie zero atunci când nu există barăci sunt prezente .
TableModifier
Această clasă este utilizată pentru formarea AI . Acesta are mai multe metode care, în moduri diferite poate modifica conținutul tabelelor din Graficul AI . Metodele specifice de modificare sunt descrise în capitolul următor .
Monte Carlo
Aceasta clasa este o implementare a algoritmului de învățare Monte Carlo . Ea are metode pentru stocarea de informații cu privire la ceea ce este construit într-o anumită stare și metode pentru modificarea unui tabel bazat în această informație .
Serializer
Această clasă este responsabil de a scrie și de a citi tabelele de pe hard disk . În cazul în care AI-ul a fost instruit , este important ca ceea ce a fost învățat nu dispare atunci când aplicația este închisă . Prin urmare, este necesar să se facă tabelele dinGraficul AI persistente , astfel încât acestea pot fi citite ulterior în aplicația din nou . Acest lucru permite , de asemenea, pentru schimbul rapid un tabel cu un alt tabel .
ResultWriter
Aceasta clasa este folosit pentru salvarea rezultatele a două IA joacă una împotriva celeilalte . Dacă SIA , de exemplu, se joacă până la 10 , apoi un nou dosar care conține toate rezultatele intermediare vor fi
a făcut de fiecare dată când unul din ALS ajunge la 10 puncte . De text , de asemenea, pur pot fi scrise într-un fișier prin această clasă pentru a explica rezultatele de la un test .
TestRunner
Aceasta clasa este responsabil pentru controlul diferitele metode de învățare , de exemplu, de urmărire a numărului de iterații efectuate într-o metodă de învățare atât de departe , și din acest decide ceea ce ar trebui să fie modificat și modul în care acest lucru ar trebui făcut . Cu toate acestea , modificările actuale se face fie prin clasa TableModifier sau clasa MonteCarlo
Urmatoarea figura ( Figura 7-3 ) prezinta diagrama de clase pentru clasele AI aferente .
Diagrama de clase figura 7-3 AI
7.6Query Algoritmul
Un arc direcționat la un nod la alt nod arată cănodul părinte afecteazănodul copil . Acest lucru înseamnă că, pentru toate nodurile care au noduri mamă , nu putem obține starea de nodul înainte de a ști starea nodurilor mamă . În rețeaua descrise în ultimul capitol ( a se vedea figura 7-1 ) , nodul care decide în cele din urmă ceea ce pentru a construi este WhatDoWeBuild nod . Din moment ce acest lucru este un nod frunză , nu putem obține un răspuns de la el înainte de starea de toate nodurile sale mamă au fost găsite .
O soluție pentru acest lucru ar fi să înceapă de la rădăcina Graficul , dat de noduri fără părinți , și să le trimită starea lor de la toate nodurile de copii și din nou a lăsa acești copii transmite starea lor de copiii lor până când suntem la WhatDoWeBuild nod care ne poate da rezultatul cautam . Cu toate acestea , acest lucru necesită că știm toate nodurile rădăcină și de a pune toate aceste noduri pentru a începe trimiterea de valorile lor pentru copiii lor .
Abordarea aleasă pentru acest proiect lucrează în sens opus . În loc de a începe de la rădăcina Graficul , această abordare pornește de la nodul frunză . Înainte de a reveni un stat , acest nod va apela tot de părinții săi și cere pentru starea lor . Ei vor cere din nou tuturor părinților lor, până când se ajunge la un nod care nu are părinți și acest nod va reveni apoi starea sa la nodul apelantului . În acest felGraficul va fi traversată de apeluri recursive și va necesita numai pentru noi să știm un nod frunză în loc de un număr mare de noduri rădăcină .
Această abordare este foarte potrivit pentru acest proiect deoarece rețeaua are un singur nod frunză .
Experiment:
Concluzii
Inteligența artificială își propune la modul ideal să afle cum pot fi mașinile să devină la fel de inteligente ca oamenii.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Strategii In Jocurile pe Calculator (ID: 160786)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
