İPUCU

Java Object Oriented Programming temeline dayanan, çok işlevli, step by step işleyen dilin dökümanlarının paylaşım alanı.

Seçenekler

Java ile Satranç Oyunu Programlama(Yapay Zeka)

26-08-2011 20:56
#1
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
S.a,

Bu makalede satranc oyununa nasil bir yapay zeka kodlandigini bulabileceksiniz.Bölümü 2 parcaya ayiracagiz.

Teori Bölümü, satranc programlamanin genel prensipleri ile ilgili.Bu programlamaya girmeden genel prosedürleri iceriyor.Böylece programlama bilmeyenler tarafindan da kolay anlasilabilir.

Pratik Bölümü ise, bir satranc programinin Java’da somut uygulamasidir.Bunun yaninda ilk önce Kullanici girişi icin bir arayüz(interface) yazip daha sonra yapay zekaya gececegiz.

Makalemiz 10 kısımdan olusuyor.Pratik bölümünde her bölümün sonunda Source Code (Kaynak kodu)nu bulabileceksiniz.



Eger pratik bölümünde kendi örnek kodlarinizi yazmak isterseniz, programlama araci olan Java’ya ihtiyaciniz olacak.Ilk önce Java Developers Kit JDK’ye ihtiyaciniz olacak.Bunu Oracle Download Center den indirebilirsiniz.

TEORi BöLÜMÜ

Satranc Tahtasi


Bilgisayar sadece rakamlarla calisiyor.Bu yüzden satranc tahtasinin görünümü adreslerin olusturdugu siralardan ibaret.Her bir adres bir alani temsil ediyor. Adreste kaydedilen deger bilgisayara tahtanin üzerinde yer alan figürler hakkinda bilgi veriyor. Adresler ard arda siralanir ve bir Index üzerinden ele alinabilinir.(Programcilar icin: Array)

Bu tanim cok soyut oldu.Bunu bir örnekle anlasilabilir yapmaya calisalim.

64 cekmeceli bir sandigin önünde oturdugunuzu düsünün.Bu cekmeceler 1’den 64’e kadar numaralandirilmis.Siz ayni sekilde tahtanin her bir alanina karsilik gelecek sekilde bir satranc tahtasini numaralandirdiniz.Satranc tahtasinin üzerinde bir figür(tas) duruyorsa, bu ayni figür cekmecenin icinde de ayni numara ile yer aliyor. Ama tabiki satranc tahtasini göremezsiniz.(ayni sekilde bilgisayar da göremez)
Ama mesela 12. alanda nasil bir figür(tas) oldugunu bilmek isterseniz, asagidaki örnege bakin.



Satranc oyun kurallari

Satranctaki en önemli kural figürlerin(taslarin) ilerleme seklidir.Diger kurallar ise bunun üzerine kuruludur.Bilgisayar, sadece basit aritmetik operasyonlar gerceklestirdigi sayilar ile calistigindan figürlerin ilerleme seklini matematik dilinde belirtmeliyiz.

Tekrar sandik örnegine dönelim.Normalde gercek bir satranc tahtasi üzerinde bir figürü(taşı) oynamak icin basitce kaydirmak isterken bunu sandığımızla yapamayiz.Cekmeceden bir figür alip diger bir cekmeceye koymaniz gerekir.Ama figürleri(taslari) kolayca herhangi bir cekmeceye koyamazsiniz cünkü o zaman ayni, tahtanin üzerindeki figürleri secmeden kaydirmaniz gibi gecersiz hareket yapmis olursunuz.

Satranc oyununda bazi kolay kurallar mevcut.Mesela; "her yöne bir alan(Şah)" veya "her zaman bir L(At)". Önümüzde sadece üzerinde sayilar yer alan bir cekmecemiz oldugundan böyle cografi bildirimleri takip etmek bizim sandik ile biraz zor.

Bir Atin, alan 29’dan nereye atlayabilecegini bir inceleyelim:


#Alan 19’a (19 - 29 = -10)
#Alan 12’ye (12 - 29 = -17)
#Alan 14’e (14 - 29 = -15)
#alan 23’e (23 - 29 = -6)
#Alan 39’a (39 - 29 = +10)
#Alan 46’ya (46 - 29 = +17)
#Alan 44’e (44 - 29 = +15)
#Alan 35’e (35 - 29= +6)



Peki Alan 37’den?
#Alan 27’ye (27 - 37 = -10)
#Alan 20’ye (20 - 37 = -17)
#Alan 22’ye (22 - 37 = -15)
#Alan 31’e (31 - 37 = -6)
#Alan 47’ye (47 - 37 = +10)
#Alan 54’e (54 - 37 = +17)
#Alan 52’ye (52 - 37 = +15)
#Alan 43’e (43 - 37 = +6)


Dikkatinizi ceken birsey var mi? At figürünün her adimini basit bir toplama ya da cikarma islemi ile belirleyebiliriz.Eger ati bir cekmeceden alip ve diger 10 cekmeceye koyarsak
gecerli bir hamle yapmis oluruz.Diger tüm figürlerin ilerleme seklini basit operasyonlar ile belirleyebilirsiniz.Isterseniz deneyin.

Tabii ki bilgisayar bir hamle yapilmadan, rastgele satranc tahtasinin kenarindan oynanip oynanmadigini kontrol etmek zorundadir.Bu kontrol mekanizmasini pratik bölümünde inceleyecegiz.



Pozisyon Değerlendirmesi

Oyun kurallarini bilmek ile satranc oyuncusu olunmaz.Bizim bilgisayarimizin herhangi gecerli bir hamle gerceklestirip en iyisi olmasini bekleyemez.Bir hamlenin sonuçlarını tahmin etmek için, ortaya cikan pozisyonu değerlendirecektir.
Böylece kendisi icin en uygun olan hamleyi bulabilir.Degerlendirmede bilgisayar, kendi figürlerinin(taslarinin) degerini topluyor ve rakip figürlerin degerlerini de çaliyor.
Genelde piyonlarin hareketliligi, merkezin kontrolü ve yapi taslari da degerlendirmeye girer.


Hamle Secimi

En iyi hamleyi bulabilmek icin bilgisayar, "hamle agaci" adinda bir sistem üretir. Bunun yaninda her gecerli hamle icin bir "dal" olusturur.Tabii yarim hamleyi önceden kestirmek cok zordur ve kullanilabilir sonuclara ***ürmez.

O yüzden bilgisayar her bir "dal’a gider ve hamleyi kendi satranc tahtasinda yapar ve tekrar tüm gecerli hamleleri üretir, ama bu sefer karsi taraf icin. Islem birkac kez tekrarlanir. Tekrarlarin tam sayisi arama derinligine baglidir.

Bir son düğüme ulasilirsa, yani bu düğümler icin baska alt düğüm olusturulamiyorsa bu düğüm degerlendirilir.

Simdi bilgisayar en iyi hamleyi secer. Bunun icin "Minimax" adinda Algoritma mevcut.Bu, su anlami tasiyor:Her oyuncu kendi avantajini ikiye katlayacak ve rakibin avantajini da yariya indirecek sekilde hamle yapar.
Somut olarak: Eger bilgisayar, son dügüm olmayan bir dügümün degerini hesaplarsa, ilk önce kendinden veya rakibin hamlelerinden bir dügüm gidiyor mu ona bakar.

Bu kendi hamleleri ise düğüm, en yüksek oranlı alt düğümün değerini alır.
Bu hamleler rakibe ait ise en düsük oranlı alt düğümün değerini alır.


Belli bir zamandan sonra kökten giden tüm dallar bir degerlendirme almislardir.Bilgisayar bunlarin arasindan en iyisini secer ve bunu hamlesi olarak calistirir.
deLete-xL` Teşekkür etti.

26-08-2011 21:01
#2
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
PRATIK BöLÜMÜ

1. Asama

Ön Hazirlik

Kullanici arayüzünü programlamadan önce birkac ön hazirligi bitirmeliyiz.Java nesne yönelimli bir programlama dili olduğu için satranc programini sınıflara ayirmamiz gerek.Asagidaki 2 sınıfı kullanacagız:

ChessPartner

Bu java.applet.Applet tarafindan türetilmiştir.Bu cerceve uygulamasidir.Burada satranc tahtasindan ve "Yeni Oyun" butonundan olusan GUI(Graphical user interface)’yi insa ediyoruz.

Board

Bu java.awt.Canvas tarafindan türetilmiştir. Bu, programimizin arayüzünü(interface) ve Yapay Zeka’yi icerir.Bu sinif, Yapay Zeka’nin hesaplamalari ayni konuda yürüdügü icin Runnable arayüzünü uygular.
Ilk önce ana Applet ChessPartner’e bir bakalim:



GUI’nin yapisi ya da olay islemcisi(Event-Handler) gibi sadece standart programlama tekniklerini yazdigimiz icin baska aciklamaya gerek yok.Class ChessPartner böylece programlanmis oluyor, bu bölümün icinde sadece Class Board degistirecegiz.
Asagida Class Board temel versiyonunu bulacaksiniz:



Bu class’ta (sinifta) anlasilmayan bir nokta olabilir: Satranc tahtasini olustururken, satranc tahtasi sadece 64 alana sahip oldugu halde neden 120 girisli bir Array kullaniyoruz?

Dogru cevabi "Satranc kurallarini uygulama" kisminda ögreneceksiniz.Burada sadece bir ipucu verelim: Satranc tahtasini cevreliyoruz. Yukariya ve asagiya 2 sira ve her kenar kismina da birer sira ekliyoruz.
Bu hamlelerin olusmasini daha kolay hale getiriyor

1. Asamanin Source Code
1. Asamanin Appleti
HenryVolter Teşekkür etti.
26-08-2011 21:04
#3
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
2.Asama

Satranc Tahtasi cizimi

Ilk önce Class Board acik ve koyu alanlar icin renkleri belirliyoruz:

Satranc tahtasi paintField (int index) yöntemi ile ciziliyor. paint () yöntemi satranc tahtasinin her bir alani icin paintField () yöntemini cagiriyor.
Ilk önce paint () yöntemine bir göz atalim:

Kenari cizmek istemedigimiz icin döngü kenar kisminin tüm alanlarini atliyor.Modulo bölünme(Modulo Division) ile satranc tahtasinin son dizisine ulasip ulasmadigimizi buluyoruz.Eger ulasilmissa kenara ait olan sonraki iki alan atlaniyor.

Simdi paintField () yöntemine bir göz atalim:

Bu yöntemde metoda iletilen Index, X ve Y koordinatlarina göre, yani sütun ve satıra göre bölünür.Bunun yaninda cerceve index’e girmez. Sonra yöntem(method) temel alanın açık veya koyu olmasi mi gerektigini hesaplar. Daha sonra fillRect () yöntemi ile alan çizilir.

2. Asamanin Source Code
2. Asamanin Appleti
26-08-2011 21:07
#4
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
3.Asama

Figürleri cizme

Sonraki adim olarak figürleri(oyun taslarini) cizelim.Bu durumda her bir figür(karakter) şeffaf arka plan ile bir resimde kaydedilir.Siteye koydugumuz figürler ArtToday’dan olusuyor ve kullanim kisitlamasi vardir.Bu yüzden indirme linkini vermek yasak.

Gercek kodumuza gelelim.Ilk önce figürlerimizi bir sayida kodlamamiz gerekiyor.Bunun icin asagidaki kurallar gecerlidir:

-Yüzler degeri rok yapma(castling) özelligini kaydeder.(yapildi/daha yapilmadi)
-Onlar degeri figürün rengini kaydeder. 1->Beyaz, 2-> Siyah
-Birler degeri figürün tipini kaydeder. 1->Piyon, 2->At, 3->Fil, 4->Kale, 5->Vezir ve 6->Şah

Simdilik daha bos bir tahtamiz var. newgame() metodunda baslangic düzeni yükleniyor:

Tabiki figürleri de yüklememiz gerekiyor.Bu figürleri her zaman göstermek istedigimiz icin bir veri alanina kaydediyoruz.Bu veri alanini Class Board global alanda beyan ediyoruz.Figürleri cizerken Applet icin bir referansa ihtiyacimiz var.Bu referansi ana degisken olan parent ’te kaydediyoruz.

Resimlerin yüklenmesi ve Applet referansinin hizalanmasi görevini Board’in yapıcısı (Constructor) aliyor.



Simdi sadece figürlerin paintField () metodu ile cizimi kaldi.


3. Asamanin Source Code
3. Asamanin Appleti
HenryVolter Teşekkür etti.
26-08-2011 21:12
#5
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
4. Asama

Fare ile Etkileşim

Bu bölümde programimiz fare olaylarina tepki vermeyi ögrenecek.Yani kullanıcının, figürleri fare ile hareket ettirmesi.Gecerli hamleleri daha kontrol etmiyoruz, yani istediginiz gibi gecersiz ve mantiksiz bir hamle olsa dahi hamle yapabilirsiniz.
Ilk olarak olay isleme rutinlerini(event handler method) kayit etmemiz gerek.Bunun icin asagidaki satirlari Board’in yapicisina ekliyoruz.

Böylece uygun olaylar meydana gelince, MouseListener ve MouseMotionListener arayüzlerinin uygun metodlari cagrilir.Fare ile etkilesimler Sürükle & Birak (Drag&Drop) yöntemi ile olacaktir.
Kullanici, bir alanin üzerine tiklar, fareyi baska alana sürükler ve fare tusunu birakir. Bunun icin degerleri önbellege kaydedebilecegimiz birkac değişkene(variable) ihtiyacimiz var.
Bu degiskenleri Class Board global isim bölümünde tanimliyoruz:


Bir kac yeni Metod da tanimlamamiz gerekiyor.Ilk metodumuz execute (int start, int end) :


Bu metod, bilgisayar hamlesini bulunca veya bir insan tarafindan gecersiz bir hamle yapildiginda cagriliyor. Gecerli ve gecersiz hamleleri ayirmak icin isvalid (int move) metodu var:

Satranc kurallarini daha uygulamadigimiz icin metod, her zaman dogru hamleler yapilmis gibi geri döner. Bu metodu Yapay Zeka bölümünde gözden gecirecegiz ki gecerli ve gecersiz hamleleri ayirabilsin.

Simdi sira asil olay isleme rutinlerinde(event handler method). mouseDragged (), mousePressed () ve mouseReleased () metodlarini kullaniyoruz. Fare etkilesiminin baslangici ile baslayalim, yani mousePressed ():

Ilk olarak mutlak koordinatlardan farenin üzerinde bulundugu satranc tahtasinin satir ve sütun sirasini cikariyoruz. Fare kutu kenarindan disariya cikarilirdiginda olusabilecek hatalari da düzeltiyoruz. (Indekslerin her zaman gecerli alanda olmasini sagliyoruz.) Sonra Drag&Drop değişkenini yerlestiriyoruz. Son olarak, baslama kutusu yeni mavi bir astar ile tekrar ciziliyor.

Sonraki metod ise mouseDragged (). Bu metod fare basili bir tus ile hareket ettirilirse cagriliyor.("Cekmek" olarak da adlandirilir):

Bu metod ilk önce farenin satranc tahtasi üzerinde yeni bir alana hareket ettirilmesini kontrol ediyor. Eger hareket ettirilmiyorsa asagidaki operasyonlar tamamlanmiyor. Fare yeni bir alana hareket ettirilirse, eski alan geri yükleniyor. Ama bir istisna ile: Baslama alani (start) fare etkilesiminin sonuna kadar isaretli kalmalidir. Daha sonra yeni alan isaretlenir. Yani bu sefer
baslama alaninin orijinal isaretini almak icin ilk önce baslama alaninda(start field) olup olmadigimizi test ediyoruz.

Simdi fare etkilesiminin sonuna yaklasiyoruz. mouseReleased () metodu kullanici bir fare tusunu biraktiginda cagriliyor.





Bu metodlar aslinda cok basit. Eger fare son alana hareket ettirildiginde, koordinatlar zaten mousePressed () ya da mouseDragged () tarafindan kaydediliyor. Bize sadece isaretleri silip, eger gecerli ise hamleyi(move) yapmak kaliyor. Bunun yaninda degisken kodu (Variable Code), Yapay Zeka (AI) yeni liste olusturdugu sirada hamle listesine(movelist) erismemizi engelliyor.

4. Asamanin Source Code
4. Asamanin AppletiBR
26-08-2011 21:17
#6
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
5.Asama

Satranç Kurallarının Uygulanması

Simdiye kadar beşer bir kullanicinin programla iletisim kurabilecegi bir Interface(arayüz) yazdik.Simdi ise Yapay Zeka(artificial intelligence) yi yazmaya baslayacagiz.Ilk adim olarak programimiza satranc kurallarini ögretecegiz.

2 noktada gecerli hamlelerin bir listesini olusturacagiz. Bir tarafta insanin girdigi verileri kontrol etmek icin, diger tarafta ise Yapay Zeka’nin en iyi hamleyi hesaplamasi icin. Herseyi 2 defa yazmak istemedigimiz icin insan hamlelerinin kontrolünü söyle uyguluyoruz: tüm gecerli hamleleri(hareketleri) kaydedecegimiz bir Array tanimliyoruz. isvalid () metodu Array(diziyi) yineler ve eger yapilan hamle listede mevcut ise gercek olarak geri döner.

Gerekli global değişkenleri tanimlayarak basliyoruz:

Sonra simulize (), multisimulize () ve genmove () metodlarina ihtiyacimiz var. simulize () metodu ile basliyoruz:



Bu yöntem, hareketin kenara gidip gitmedigini kontrol eder. Bu durumda degilse hareket listesine(movelist) eklenir. multisimulize () metoduna gelelim. Bu metod Vezir, Kale ve Fil’in hareketlerini simulize eder.


Bu metod baslama alanini ve mesafeyi parametre olarak alir. Mesafe cekme yönü demek, yani figürün capraz,yatay veya dikey hareket etmesi. Daha sonra bu metod yoluna bir engel cikincaya veya tahtanin kenarina ulasilincaya kadar hamleleri simulize eder.

En karmasik metod ise genmove () . Burada tek hamleler olusturuluyor. Hatirlayacak olursaniz teori bölümünde tüm satranc hamlelerinin basit bir toplama veya cikarma islemi ile ifade edilebildigini söylemistik. Iste bu ilkeyi simdi hayata geciriyoruz. Ama 12 * 10 satranc tahtamiz icin sayilar 8 * 8 icin olandan biraz farkli.



Roklamayi ve en passant cekimini uygulamiyoruz. Rok yapmayi "son çalışmalar" bölümünde ögrenecegiz ama en passant cekimini(en passant capturing) islemeyecegiz cünkü cok fazla kullanilmiyor. Ama genmove () metodunu biryerde cagirmamiz gerekiyor. Bu cagirma islemini iki metodda gerceklestirecegiz. newgame () ve execute () . Yani newgame () metodunun sonunda asagidaki kodu ekliyoruz:



execute () metodunda cekim(hareket, hamle ne derseniz deyin) renginin degistirilmesi gerekiyor.Cünkü beyaz ve siyah değişimli olarak hareket etmeli. Kod söyle görünüyor :



Simdi neden 10x12 boyutlarinda bir satranc tahtasi kullandigimiz yani normal satranc tahtasina neden kenar ekledigimiz anlasilmis olmalidir. Böylece bir hamle(move) normal tahtanin disina cikip cikmadigini kontrol etmek cok daha kolay olacak.


5. Asamanin Source Code
5. Asamanin Appleti
26-08-2011 21:21
#7
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
6. Asama

Şah icin kontrol

Programimiz cesitli hareketleri artik taniyor. Ama büyük bir eksiklik var: Şah ile sah-mat yapabiliriz! Bunu önlemek icin ischeck () adinda bir metoda ihtiyacimiz var.Bu metod asagidaki gibi görünüyor:









Bu metod prensipte cok basit: tarafi(partisi) harekette olan krali ariyoruz. Sonra bu pozisyondan gidiyoruz ve herhangi bir düsman figürün bu alana saldirip saldirmadigini kontrol ediyoruz. Eger böyleyse true geri döndürülüyor. Eger tüm kontroller negativ ise false geri döndürülüyor.

simulize () metodunu öyle bir degistirmeliyiz ki hamleyi(move) tamamlasin, sah-mat olup olmadigini kontrol etsin ve sonra hamleyi geri alsin:


Simdi hareket listesinde (movelist) sadece, calistirilmalari kendi Şah’ına sah-mat olmayacak olan hamleler(hareketler) mevcut.


6. Asamanin Source Code
6. Asamanin Appleti

26-08-2011 21:23
#8
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
7.Asama

Değerlendirme yöntemi


Bu bölüm bir sonraki bölüm ön çalışma yapiyor, yani hamle secimini. Bir hamleyi secmek icin Yapay Zeka bir pozisyon tahmin edebilmek zorundadir. Kendisi icin en iyi pozisyonu bulmak zorundadir. Bu nedenle değerlendirme fonksiyonu var. Yöntem, bir pozisyon degeri verir.

Değerlendirme yöntemine bir pozisyon cesitli yönleri ile dahil edilebilir: Bir kacini sayacak olursak; Piyon yapisi, merkezin hakimiyeti, bir pozisyonel degerlendirme, malzeme değeri ya da Tempo. Burada malzeme degeri ve pozisyonel degerlendirme ile yetinecegiz. Bir pozisyonun malzeme degerini bilgisayarin sahip oldugu tüm figürlerinin degeri toplamini, insanin sahip oldugu tüm figürlerin degeri sonucundan cikararak hesapliyoruz.
Pozisyonel degerlendirme icin her alan icin bir deger kaydedilen bir veri alani tanımliyoruz. Bu deger üzerinde duran figürlerin birine dahil edilir.

Her alanin pozisyonel degerlerini Board sinifinin(class Board) global isim bölümünde tanimladigimiz posvalues Array’da kaydediyoruz:



Asıl degerlendirme fonksiyonu evaluation () söyle tanimlaniyor:



7. Asamanin Source Code
7. Asamanin uygulamasi (Applet)
26-08-2011 21:28
#9
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
8.Asama

Hamle Secimi

Bu bölümde cok is yapmamiz gerekiyor. Bu paragrafin sonunda programimiz siyah icin hamle yapacak. Bunun yaninda hamle secimini Minimax Algoritmasi’na göre uyguluyoruz.

Daha önce de belirttigim gibi bu algoritma bize kendi avantajini maksimum ve rakibinkini ise minimum yapar diyor. Somut olarak bu su anlama geliyor: eger bilgisayar kendi hamle yaptigi derinliklerde ise düğüm, en kötü alt düğümün degerini aliyor. Eger insan hamle yapiyorsa düğüm, en iyi alt düğümü aliyor. Bir pozisyon icin negatif degerler bilgisayarin her zaman daha iyi durumda oldugu anlamina geliyor.Cünkü degerler insanin bakış açısından aliniyor.

Ilk önce birkac yeni değişken eklememiz gerek. Bunlar global değişkenler oldugundan Class Board global isim bölümünde(global namespace) tanimlaniyor:


Sonraki adim olarak genmove () metodunu degistirmemiz lazim. Asagidaki kodu bas tarafina ekliyoruz:


Bir sah-mat’ta baska hamleler üretilemeyeceginden Minimax alaninda deger, daha fazla gecersiz kilinmiyor ve düzenlenen üst dügüme geri gidiyor. Bu metodun sonunda asagidaki cizgiyi eklememiz gerek:

deep--;

En iyi hamleyi hesaplarken kullanici arayüzünün lag yapmasini(takilmasini) istemedigimizden hesaplama icin kendimize ait bir thread olmasi gerekiyor. Thread run () metodunda tanimlaniyor. Bunun icinde Yapay Zeka icin en iyi hamlenin hesaplamasi bulunuyor.


simulize () metodu öyle degistirilmeli ki, hedef derinligi erisilinceye kadar genmove () metodunu cagirsin. Ayrica Minimax Algoritmasi’ni uygulamasi gerekiyor:


Metodun geri kalan kodu ayni kaliyor. Simdi execute () metodunu öyle degistirecegiz ki, hamle hesaplamasini tetikleyecek durumda olsun:


newgame () metodu da degistirilmek zorunda, yoksa hamle listesinin olusturulmasini tetiklemeyez.


Simdi Satranc programimiz kendi kendine oynayabilir. Ancak daha cok yavas ve sadece 2 yarim hamleyi hesaplayabiliyor. Sonraki paragrafta programin hizini Alpha-Beta Algoritmasi yardimi ile güclü bir sekilde hizlandirmaya calisacagiz ki programimimiz 4-6 arasinda yarim hamleyi hesaplayabilsin.

8. Asamanin Source Code
8. Asamanin Uygulamasi(Applet)
26-08-2011 21:35
#10
Üyelik tarihi:
11/2010
Nereden:
Adana
Mesajlar:
490
Teşekkür (Etti):
77
Teşekkür (Aldı):
104
Konular:
215
Ticaret:
(0) %
9. Asama

Alpha-Beta Algoritmasi


Simdi kursumuzun en zor bölümüne geldik.Alpha-Beta Algoritmasina. Alpha-Beta Algoritmasi hamle aramasi sirasinda hesaplama karmaşıklığını azaltmaya yariyor.Bu azaltma, programimiza kisa bir zamanda 4 hamleyi hesaplama kapasitesine ulasmasina izin verecek.

Alpha-Beta Algoritmasi, Minimax Algoritmasinin gelismis hali.Bu, Minimax Algoritmasina göre secilme sansi olmayan hamle agacının dallarını ayırıyor. Asagidaki senaryoyu gözümüzün önüne getirelim: Bilgisayar bir dügümün degerini 4 derinliginde hesapliyor. Dügüm icin negativ degerler aliyor, yani bilgisayar daha iyi bir konumda duruyor.

Derinlik 3’te bilgisayar icin simdi yeni bir hamle analize ediliyor ve insan icin tüm mümkün hamleler olusturuluyor. Insan her zaman kendi avantajini ikiye katlayan hamleyi yapacak, yani en iyi degere sahip olan hamleyi. Ama bir hamle, önceden hesapladigimiz dügümün degerinden yüksek bir degere sahip ise bilgisayar insanin geri kalan hamlelerinin hesaplamasini o dal icin iptal edebilir.

Minimax’a göre bilgisayar bu dali secmeyecek.Cünkü bilgisayar mümkün oldugunca derin degerler istiyor ve bu dügümün degeri son dügümün üzerinde olmali.

Simdi Alpha-Beta Algoritmasini anladigimizi umarak satranc programimiz icin somut uygulamaya geciyoruz.

Algoritma icin Class Board global isim bölümünde 2 deger tanimlamamiz gerek:



Alpha-Beta deger alaninin baslatilmasi gerek. Bu nedenle asagidaki kod Konstruktor’de newgame() yi cagirmadan önce bulunmalidir.



genmove() metodu da veri alanini(array) o andaki derinlik icin baslatmalidir.



genmove () metodunun sonuna da kod eklenmelidir:

ababort = false;

En cok degirtirmemiz gereken metod simulize () :





Metodun gerisi ayni kaliyor.Simdi hesaplama derinligini run () metodunda yükseltecek durumdayiz. Cünkü hesaplama önemli derecede azaltildi.

target = 4;

Böylece Alpha - Beta Algoritmasini uygulamis olduk. Satranc programi simdi daha güzel ve iyi bir zorluk derecesinde oynuyor.
Bu noktada Yapay Zeka’nizin zorluk derecesini nasil yükseltebileceginiz hakkinda bir kac öneride bulunmak istiyoruz. Bu önerilerin uygulanmasi bu kurs icin fazla olabilir.
Önerilerin cogu sitenin Chess Partner Applet bölümünde zaten uygulandi. Cünkü bu applet Open Source ve applet’in kaynak kodundan yardim alabilirsiniz.

Önerilerimiz:

-Bir acilis kütüphanesi yapin. Chess Partner Applet’te uyguladigimiz Acilis kütüphanesini( http://library.thinkquest.org/C00134...g/openings.zip) indirebilir ve kullanabilirsiniz.
-Kodun, figür kaydinin(board array) 3’e ayrilmasi Tipe, renge ve özel bilgilere göre
-Şah pozisyonunu kaydedin (Şah’in ischeck () metodunda aramaya gerek kalmamasi icin).
-Programin pozisyonel oyununu her figür icin (hem beyaz hem de siyah figürler icin) deger alanlari olusturursaniz iyilestirebilirsiniz.

9. Asamanin Source Code
9. Asamanin uygulamasi(Applet)

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı