Talaan ng mga Nilalaman:

Pagkimbot ng Tic Tac sa Arduino Sa AI (Minimax Algorithm): 3 Mga Hakbang
Pagkimbot ng Tic Tac sa Arduino Sa AI (Minimax Algorithm): 3 Mga Hakbang

Video: Pagkimbot ng Tic Tac sa Arduino Sa AI (Minimax Algorithm): 3 Mga Hakbang

Video: Pagkimbot ng Tic Tac sa Arduino Sa AI (Minimax Algorithm): 3 Mga Hakbang
Video: The Toy Master is Everywhere! 2024, Nobyembre
Anonim
Image
Image
Bumuo at Maglaro
Bumuo at Maglaro

Sa Instructable na ito ay ipapakita ko sa iyo kung paano bumuo ng isang laro ng Tic Tac Toe sa isang AI na gumagamit ng isang Arduino. Maaari kang maglaro laban sa Arduino o manuod ng Arduino na maglaro laban sa sarili nito.

Gumagamit ako ng isang algorithm na tinatawag na "minimax algorithm", na maaaring magamit hindi lamang upang bumuo ng isang AI para sa Tic Tac Toe, kundi pati na rin para sa iba't ibang mga laro tulad ng Four in a Row, checkers o kahit chess. Ang mga laro tulad ng chess ay napakahirap at nangangailangan ng mas maraming pino na mga bersyon ng algorithm. Para sa aming laro ng Tic Tac Toe, maaari naming gamitin ang pinakasimpleng bersyon ng algorithm, na kung saan ay gayunpaman ay kahanga-hanga. Sa katunayan, napakahusay ng AI na imposibleng talunin ang Arduino!

Ang laro ay madaling bumuo. Kakailanganin mo lamang ang ilang mga bahagi at ang sketch na isinulat ko. Nagdagdag din ako ng isang mas detalyadong paliwanag ng algorithm, kung nais mong maunawaan kung paano ito gumagana.

Hakbang 1: Bumuo at Maglaro

Upang maitayo ang laro ng Tic Tac Toe kakailanganin mo ang mga sumusunod na sangkap:

  • Isang Arduino Uno
  • 9 WS2812 RGB LEDs
  • 9 mga pindutan ng itulak
  • ilang mga wire at jumper cable

Wire up ang mga bahagi tulad ng ipinakita sa sketch ng Fritzing. Pagkatapos i-upload ang code sa iyong Arduino.

Bilang default, ang Arduino ay kukuha ng unang turn. Upang gawing mas kawili-wili ang mga bagay, ang unang paglipat ay napili nang sapalaran. Matapos ang unang paglipat, ginagamit ng Arduino ang minimax algorithm upang matukoy ang pinakamahusay na posibleng paglipat. Nagsisimula ka ng isang bagong laro sa pamamagitan ng pag-reset sa Arduino.

Maaari mong panoorin ang "pag-iisip" ng Arduino sa pamamagitan ng pagbubukas ng Serial Monitor. Para sa bawat posibleng paglipat, kinakalkula ng algorithm ang isang rating na nagpapahiwatig kung ang paglipat na ito ay hahantong sa isang panalo (halagang 10) o isang pagkawala (halaga ng -10) para sa Arduino o isang draw (halagang 0).

Maaari mo ring panoorin ang pag-play ng Arduino laban sa sarili nito sa pamamagitan ng pag-aalala ng linya na "#define DEMO_MODE" sa simula pa lamang ng sketch. Kung na-upload mo ang binagong sketch, ginagawa ng Arduino ang unang ilipat nang random at pagkatapos ay ginagamit ang minimax algorithm upang matukoy ang pinakamahusay na paglipat para sa bawat manlalaro sa bawat pagliko.

Tandaan na hindi ka maaaring manalo laban sa Arduino. Ang bawat laro ay magtatapos sa isang draw o talo ka, kung nagkamali ka. Ito ay dahil palaging pinipili ng algorithm ang pinakamahusay na posibleng paglipat. Tulad ng maaari mong malaman, ang isang laro ng Tic Tac Toe ay palaging magtatapos sa isang draw kung ang parehong mga manlalaro ay hindi nagkakamali. Sa demo mode, ang bawat laro ay nagtatapos sa isang draw dahil, sa alam nating lahat, ang mga computer ay hindi kailanman nagkakamali;-)

Hakbang 2: Ang Minimax Algorithm

Ang Minimax Algorithm
Ang Minimax Algorithm

Ang algorithm ay binubuo ng dalawang bahagi: isang pag-andar sa pagsusuri at diskarte sa paghahanap. Ang pagpapaandar ng pagsusuri ay isang pagpapaandar na nagtatalaga ng isang bilang na bilang sa mga posisyon sa board. Kung ang posisyon ay isang pangwakas na posisyon (ibig sabihin, isang posisyon kung saan nanalo ang asul na manlalaro o ang pulang manlalaro o kung saan nanalo ang alinman sa manlalaro), ang pagpapaandar sa pagsusuri ay napaka-simple: Sabihin nating ang Arduino ay naglalaro ng asul at ang manlalaro ng tao ay naglalaro ng pula. Kung ang posisyon ay isang panalong posisyon para sa asul, ang pagpapaandar ay nagtatalaga ng isang halaga ng 10 sa posisyon na iyon; kung ito ay isang panalong posisyon para sa pula, ang pagpapaandar ay nagtatalaga ng isang halaga ng -10 sa posisyon; at kung ang posisyon ay isang pagguhit, ang pagpapaandar ay nagtatalaga ng isang halaga ng 0.

Kapag ang turn ng Arduino, nais nitong pumili ng isang paglipat na maximize ang halaga ng pag-andar ng pagsusuri, dahil ang pag-maximize ng halaga ay nangangahulugang mas gugustuhin ang isang panalo sa isang draw (10 ay mas malaki sa 0) at mas matanggal ang isang draw kaysa sa mawala (0 ay mas malaki kaysa sa -10). Sa pamamagitan ng isang magkatulad na argumento, ang kalaban ay nais na maglaro sa paraang minimina niya ang halaga ng pagpapaandar sa pagsusuri.

Para sa isang hindi pangwakas na posisyon, kinakalkula ng algorithm ang halaga ng pagpapaandar ng pagsusuri sa pamamagitan ng isang recursive na diskarte sa paghahanap. Simula mula sa kasalukuyang posisyon, halili nitong ginagalawan ang lahat ng mga galaw na maaaring gawin ng asul na manlalaro at ng pulang manlalaro. Maaari itong mailarawan bilang isang puno, tulad ng sa diagram. Kapag dumating ito sa isang huling posisyon, nagsisimula itong umatras, dala ang halaga ng pagpapaandar ng pagsusuri mula sa mas mababang antas ng recursion hanggang sa mas mataas na antas ng recursion. Itinalaga nito ang maximum (kung sa kaukulang hakbang sa recursion ito ay ang turn ng asul na manlalaro) o ang minimum (kung sa kaukulang hakbang sa recursion ay ang turn ng pulang manlalaro) ng mga halaga ng pagpapaandar na pagsusuri mula sa mas mababang antas ng recursion hanggang sa posisyon sa mas mataas na antas ng recursion. Sa wakas, kapag natapos na ng algorithm ang pag-urong at nakarating muli sa kasalukuyang posisyon, tumatagal ang paglipat na iyon (o isa sa mga galaw) na mayroong pinakamataas na halaga ng pag-andar sa pagsusuri.

Maaari itong tunog medyo abstract, ngunit ito ay talagang hindi mahirap. Isaalang-alang ang posisyon na ipinakita sa tuktok ng diagram. Sa unang hakbang sa recursion, mayroong tatlong magkakaibang paggalaw na maaaring gawin ng asul. Sinusubukan ni Blue na i-maximize ang halaga ng pagpapaandar ng pagsusuri. Para sa bawat paggalaw na maaaring gawin ng asul, mayroong dalawang galaw na maaaring gawin ng pula. Sinusubukan ng pula na i-minimize ang halaga ng pagpapaandar ng pagsusuri. Isaalang-alang ang paglipat kung saan tumutugtog ang asul sa kanang sulok sa itaas. Kung ang pula ay naglalaro sa gitnang kahon, ang pula ay nanalo (-10). Kung, sa kabilang banda, ang pula ay naglalaro sa gitnang ilalim na kahon, ang asul ay mananalo sa susunod na paglipat (10). Kaya, kung ang asul ay naglalaro sa kanang sulok sa itaas, maglalaro ang pula sa gitnang kahon, dahil pinapaliit nito ang halaga ng pag-andar ng pagsusuri. Analogically, kung ang asul na pag-play sa center box sa ibaba, ang pula ay muling maglalaro sa center box sapagkat pinapaliit ang pagpapaandar ng pagsusuri. Kung, sa kabilang banda, ang asul na naglalaro sa gitnang kahon, hindi alintana kung aling pulang galaw ang tumatagal, ang asul ay laging manalo (10). Dahil nais ng asul na i-maximize ang pagpapaandar ng pagsusuri, maglalaro ito sa kahon ng gitna, dahil ang posisyon na iyon ay nagreresulta sa isang mas malaking halaga ng pag-andar ng pagsusuri (10) kaysa sa iba pang dalawang mga galaw (-10).

Hakbang 3: Pag-troubleshoot at Karagdagang Mga Hakbang

Kung itulak mo ang isang pindutan at ibang LED kaysa sa isang naaayon sa mga ilaw ng pindutan, ang iyong marahil ay nakuha ang mga wire sa mga pin na A0-A2 o 4-6 na halo-halong, o ikinonekta mo ang mga LED sa maling pagkakasunud-sunod.

Tandaan din na ang algorithm ay hindi palaging pumili ng isang paglipat na hahayaan ang Arduino na manalo nang mas mabilis hangga't maaari. Sa katunayan, gumugol ako ng ilang oras sa pag-debug ng algorithm dahil ang Arduino ay hindi pumili ng isang paglipat na maaaring isang panalong paglipat. Tumagal ako ng ilang oras hanggang sa napagtanto ko na sa halip ay pumili ng isang paglipat na ginagarantiyahan na mananalo ito ng isang paglipat sa paglaon. Kung nais mo, maaari mong subukang baguhin ang algorithm upang palaging ginusto nito ang isang panalong paglipat sa isang susunod na panalo.

Ang isang posibleng pagpapalawak ng proyektong ito ay ang paggamit ng algorithm upang bumuo ng isang AI para sa isang 4x4 o kahit isang 5x5 Tic Tac Toe. Gayunpaman, tandaan na ang bilang ng mga posisyon na kailangang suriin ng algorithm ay napakabilis tumubo. Kakailanganin mong maghanap ng mga paraan upang gawing mas matalino ang pagpapaandar ng pagsusuri sa pamamagitan ng pag-assine ng mga halaga sa mga posisyon na hindi pangwakas, batay sa posibilidad na ang posisyon ay mabuti o masama para sa pinag-uusapang manlalaro. Maaari mo ring subukang gawing mas matalino ang paghahanap sa pamamagitan ng pagtigil ng maaga sa recursion kung ang isang paglipat ay naging mas karapat-dapat sa karagdagang pagsaliksik kaysa sa mga kahaliling paggalaw.

Ang Arduino ay marahil hindi ang pinakamahusay na platform para sa mga naturang extension dahil sa limitadong memorya nito. Hinahayaan ng Recursion na lumaki ang stack sa panahon ng pagpapatupad ng programa, at kung ang stack ay lumalaki nang labis, maaari nitong masira ang memorya ng programa, na humahantong sa mga pag-crash o maling pag-uugali. Pinili ko ang Arduino para sa proyektong ito higit sa lahat dahil nais kong makita kung magagawa ito at para sa mga hangaring pang-edukasyon, hindi dahil ito ang pinakamahusay na pagpipilian para sa ganitong uri ng problema.

Inirerekumendang: