AI ile Arduino Üzerinde Tic Tac Toe (Minimax Algoritması): 3 Adım
AI ile Arduino Üzerinde Tic Tac Toe (Minimax Algoritması): 3 Adım
Anonim
Image
Image
İnşa Et ve Oyna
İnşa Et ve Oyna

Bu Eğitilebilir Kitapta, Arduino kullanarak bir AI ile bir Tic Tac Toe oyununun nasıl oluşturulacağını göstereceğim. Arduino'ya karşı oynayabilir veya Arduino'nun kendisine karşı oynamasını izleyebilirsiniz.

Sadece Tic Tac Toe için bir yapay zeka oluşturmak için değil, aynı zamanda Dörtlü Sıra, dama ve hatta satranç gibi çeşitli diğer oyunlar için de kullanılabilen "minimax algoritması" adlı bir algoritma kullanıyorum. Satranç gibi oyunlar çok karmaşıktır ve algoritmanın çok daha gelişmiş versiyonlarını gerektirir. Tic Tac Toe oyunumuz için, yine de oldukça etkileyici olan algoritmanın en basit versiyonunu kullanabiliriz. Aslında, AI o kadar iyi ki Arduino'yu yenmek imkansız!

Oyun inşa etmek kolaydır. Sadece birkaç bileşene ve yazdığım taslağa ihtiyacınız var. Nasıl çalıştığını anlamak istiyorsanız, algoritmanın daha ayrıntılı bir açıklamasını da ekledim.

1. Adım: Oluşturun ve Oynayın

Tic Tac Toe oyununu oluşturmak için aşağıdaki bileşenlere ihtiyacınız olacak:

  • Arduino Uno'su
  • 9 WS2812 RGB LED'leri
  • 9 basma düğmesi
  • bazı tel ve atlama kabloları

Bileşenleri Fritzing çiziminde gösterildiği gibi bağlayın. Ardından kodu Arduino'nuza yükleyin.

Varsayılan olarak, Arduino ilk dönüşü alır. İşleri biraz daha ilginç hale getirmek için ilk hamle rastgele seçilir. İlk hareketten sonra Arduino, mümkün olan en iyi hareketi belirlemek için minimax algoritmasını kullanır. Arduino'yu sıfırlayarak yeni bir oyuna başlarsınız.

Seri Monitörü açarak Arduino'nun "düşünmesini" izleyebilirsiniz. Algoritma, olası her hareket için, bu hareketin Arduino için bir kazanç (10 değeri) veya bir kayıp (-10 değeri) veya beraberlik (0 değeri) ile sonuçlanıp sonuçlanmayacağını gösteren bir derecelendirme hesaplar.

Ayrıca, çizimin en başındaki "#define DEMO_MODE" satırını yorumlayarak Arduino'nun kendisine karşı oynamasını izleyebilirsiniz. Değiştirilen taslağı yüklerseniz, Arduino ilk hareketi rastgele yapar ve ardından her oyuncu için her turda en iyi hareketi belirlemek için minimax algoritmasını kullanır.

Arduino'ya karşı kazanamayacağınızı unutmayın. Her oyun ya berabere biter ya da hata yaparsanız kaybedersiniz. Bunun nedeni, algoritmanın her zaman mümkün olan en iyi hareketi seçmesidir. Bildiğiniz gibi, her iki oyuncu da hata yapmazsa Tic Tac Toe oyunu her zaman berabere biter. Demo modunda her oyun berabere biter çünkü hepimizin bildiği gibi bilgisayarlar asla hata yapmaz;-)

Adım 2: Minimax Algoritması

Minimax Algoritması
Minimax Algoritması

Algoritma iki bileşenden oluşur: bir değerlendirme işlevi ve bir arama stratejisi. Değerlendirme işlevi, pano konumlarına sayısal bir değer atayan bir işlevdir. Pozisyon son bir pozisyon ise (yani, mavi oyuncunun veya kırmızı oyuncunun kazandığı veya hiçbir oyuncunun kazanmadığı bir pozisyon), değerlendirme işlevi çok basittir: Diyelim ki Arduino mavi oynuyor ve insan oyuncu kırmızı oynuyor.. Konum mavi için kazanan bir konumsa, işlev bu konuma 10 değeri atar; kırmızı için kazanan bir konumsa, işlev konuma -10 değerini atar; ve pozisyon berabere ise, fonksiyon 0 değerini atar.

Arduino'nun sırası geldiğinde, değerlendirme fonksiyonunun değerini maksimize eden bir hareket seçmek ister, çünkü değeri maksimize etmek, beraberlik üzerinde kazanmayı tercih edeceği (10'dan büyüktür) ve kaybetme üzerinde beraberliği tercih edeceği anlamına gelir (0, -10'dan büyüktür). Benzer bir argümanla, rakip, değerlendirme fonksiyonunun değerini en aza indirecek şekilde oynamak istiyor.

Nihai olmayan bir konum için, algoritma, özyinelemeli bir arama stratejisi ile değerlendirme fonksiyonunun değerini hesaplar. Mevcut konumdan başlayarak, mavi oyuncunun ve kırmızı oyuncunun yapabileceği tüm hareketleri dönüşümlü olarak simüle eder. Bu, şemadaki gibi bir ağaç olarak görselleştirilebilir. Son bir konuma ulaştığında, geri adım atmaya başlar ve değerlendirme fonksiyonunun değerini alt özyineleme seviyesinden daha yüksek özyineleme seviyesine taşır. Değerlendirme fonksiyonu değerlerinin maksimumunu (ilgili özyineleme adımında mavi oyuncunun sırasıysa) veya minimumunu (ilgili özyineleme adımında kırmızı oyuncunun sırasıysa) alt özyineleme seviyesinden aşağıdaki konuma atar. daha yüksek özyineleme seviyesi. Son olarak, algoritma geri adım atmayı bitirip tekrar mevcut konuma geldiğinde, maksimum değerlendirme fonksiyonu değerine sahip o hareketi (veya hareketlerden birini) alır.

Bu biraz soyut gelebilir, ama aslında o kadar da zor değil. Diyagramın üst kısmında gösterilen konumu göz önünde bulundurun. İlk özyineleme adımında, mavinin yapabileceği üç farklı hareket vardır. Mavi, değerlendirme fonksiyonunun değerini maksimize etmeye çalışır. Mavinin yapabileceği her hamle için kırmızının yapabileceği iki hamle vardır. Kırmızı, değerlendirme fonksiyonunun değerini en aza indirmeye çalışır. Sağ üst köşede mavinin oynadığı hareketi düşünün. Kırmızı orta kutuda oynarsa, kırmızı kazanır (-10). Öte yandan, orta alt kutuda kırmızı oynarsa, bir sonraki hamlede mavi kazanır (10). Bu nedenle, sağ üst köşede mavi oynarsa, değerlendirme fonksiyonunun değerini en aza indireceğinden kırmızı orta kutuda oynayacaktır. Benzer şekilde, mavi orta alt kutuda çalarsa, kırmızı yine orta kutuda oynayacak çünkü bu, değerlendirme işlevini en aza indirecektir. Öte yandan, mavi orta kutuda oynarsa, kırmızının hangi hamleyi yaptığı önemli değil, mavi her zaman kazanır (10). Mavi, değerlendirme fonksiyonunu maksimize etmek istediğinden ortadaki kutuda oynayacaktır, çünkü bu pozisyon değerlendirme fonksiyonunun (10) diğer iki hamleden (-10) daha büyük bir değeri ile sonuçlanacaktır.

3. Adım: Sorun Giderme ve Sonraki Adımlar

Bir düğmeye basarsanız ve düğmeye karşılık gelen LED'den farklı bir LED yanarsa, muhtemelen A0-A2 veya 4-6 pinlerindeki kabloları karıştırdınız veya LED'leri yanlış sırayla bağladınız.

Ayrıca algoritmanın her zaman Arduino'nun olabildiğince hızlı kazanmasına izin verecek bir hareket seçmediğini unutmayın. Aslında, Arduino kazanan bir hamle olacak bir hamle seçmediği için algoritmada hata ayıklamak için biraz zaman harcadım. Bunun yerine bir hamle sonra kazanacağını garanti eden bir hamle seçtiğini fark etmem biraz zaman aldı. İsterseniz, algoritmayı her zaman daha sonraki bir galibiyete kazanan bir hamleyi tercih edecek şekilde değiştirmeyi deneyebilirsiniz.

Bu projenin olası bir uzantısı, algoritmayı 4x4 veya hatta 5x5 Tic Tac Toe için bir AI oluşturmak için kullanmak olacaktır. Ancak, algoritmanın incelemesi gereken konum sayısının çok hızlı arttığını unutmayın. Söz konusu oyuncu için konumun iyi veya kötü olma olasılığına bağlı olarak, değerleri nihai olmayan konumlara atayarak değerlendirme işlevini daha akıllı hale getirmenin yollarını bulmanız gerekecektir. Ayrıca, bir hareketin alternatif hareketlerden daha fazla araştırmaya daha az değer verdiği ortaya çıkarsa, özyinelemeyi erken durdurarak aramayı daha akıllı hale getirmeye çalışabilirsiniz.

Arduino, sınırlı hafızası nedeniyle muhtemelen bu tür uzantılar için en iyi platform değildir. Özyineleme, programın yürütülmesi sırasında yığının büyümesini sağlar ve yığın çok fazla büyürse program belleğini bozarak çökmelere veya düzensiz davranışlara yol açabilir. Bu proje için Arduino'yu seçtim çünkü yapılıp yapılamayacağını görmek istedim ve bu tür problemler için en iyi seçim olduğu için değil, eğitim amaçlıydı.