Genetikus algoritmust szeretnék írni, ami megoldja a snakehez hasonló játékomat, de nem tanul semmit. Mit tegyek, hogy menjen?
Szóval a játék annyi, hogy van egy mátrixom(pályám) 0-osal és 1-essel feltöltve és megvan a karakter poziciója(x és y). Ha a karakter poziciója 1-es akkor meghalt, mivel falnak ütközött, ha 0 éli tovább életét, ha viszont 2 (amiből egy van a mátrixba) akkor kapott egy pontot és random megint a pályára kerül egy kettes(tehát egy pont).
Neuron hálozatom már van, nyolc bemeneti paraméter, a négy irányba a faltól(tehát egyestől) való távolsága és a ponttól való távolsága. Van valamennyi rejtett réteg valamennyi neuronnal rétegenként(nem tudom mennyi kéne pontosan) és 4 kimeneti neuron, ami a négy irányt jelzi.
Ugyebár a genetikus algoritmus annyiból áll, hogy populáció mérete szerint létrehozok x hálozatot random súlyokkal - Ez megvan.
Lefuttatom az összeset míg meg nem hal(akkor is meghalt ha 50-et lépett pont nékül) - Ez is megvan.
Fitness function egyelőre csak annyi, hogy amelyik több pontot szerez az megmarad.
Hogyan alkotom meg a következő generációt?:
Hány legjobb egyedet kell kiválasztani, pl ha 100 egyedből kiválasztom a legjobb 10-et, páronként kereszteznem kell őket, majd mutálnom kis eséllyel az összeset? De akkor mi lesz a többi kilencvennel?
Keresztezésnél jól értettem ,hogy a súlyokat cserélgetem össze? Ha igen akkor ezt az összes párnál ugyanazon minta alapján kell(pl sulyok elso fele mara, masadik fele cserélődik), vagy mindig véletlenszerűen?
Tudom sok kérdés, lehet fele teljesen nonsens, de kb egy hónapja még neuron hálozatotról sem tudtam semmit, mégis sikerült megértenem és megírnom még a backpropagationt is(amit itt nem tudok használni, de nem is akarok). Nagyon szeretnék már egy saját ilyen kezdetleges AI-t és ezért kérem a segítségeteket.
Előre is köszönöm minden válaszolónak!
Köszönöm szépen, sokat segítettél. Szerintem azt fogom csinálni hogy nem párosítom az összeset, hanem csak a felét, akik nem parosodtak azok kiesnek (természetes kiválasztódás) és az új generációba a kivalasztott szülők és utódai maradnak, ha véletlenül az utódok eleg felresikerultek lettek akkor a szulok ne vesszenek el(de letesztelem majd mindkét módszert).
Viszont van még egy probléma, ha a súlyokat veszem az egyed dns-ének és azokat keresztezem akkor elég nagy zavar lesz a hálózatba, szinte mintha újabb random halozatot hoztam volna létre. Erre nincs valami más módszer? (Lehet hogy rosz nagyságrendű súlyokat használok, de elozo crossoveres kiserletembe 10000 generacio utan se tanult semmit)
Az a modszer is valoszinuleg mukodik, ha a populacio fele marad, es a masik fele uj.
Azt mar irtam, hogy a crossovernel a dns-nek mindig egy folytonos szakaszat masold! Igy a mar mukodo halozatdarabkak tobbe-kevesbe egyben maradnak, es igy nem lesz teljesen random uj halozatod.
Ha nagyon nem tanul, akkor a halozatmerettel lehet gond, vagy a sulyokkal, a nemlinearis fuggvenyeddel, a kimenettel, vagy barmi massal. Van a programnak valami kimenete, ahol latszik, hogy mit csinal az AI szimulacio kozben?
Ja, es igen, van jobb modszer, de eleg bonyolult algoritmusrol van szo: ilyen a NEAT ( [link] ). [link]
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!