The WeakReference class, monitoring memory leak and garbage collection in a Java application

Image
 Below is a Stack implementation that uses an internal resizeable array structure.  public class MyStack< T > implements Stack< T > { private static final int CAPACITY = 100 ; private Object[] array ; private int pos = 0 ; public MyStack () { this . array = new Object[ CAPACITY ] ; } @Override public void push ( T item) { if ( pos >= array . length / 2 ) { Object[] newArray = new Object[ pos * 2 ] ; System. arraycopy ( array , 0 , newArray , 0 , array . length ) ; array = newArray ; } array [ pos ++] = item ; } @Override public T pop () { if (isEmpty()) { throw new RuntimeException( "empty stack" ) ; } @SuppressWarnings ( "unchecked" ) T item = ( T ) array [ pos - 1 ] ; pos -= 1 ; return item ; } @Override @SuppressWarnings ( "unchecked" ) public T peek...

FEN Notasyonu ve UCI Protokolü

FEN NOTASYONU

Forsyth-Edwards Notasyonu, satranç pozisyonlarını ASCII karakter seti kullanarak ifade etmeye yarayan bir standarttır. Satranç programcıları için standart bir pozisyon notasyonu çok önemlidir çünkü böylece pozisyon veritabanlarını birbirleri ile paylaşabilirler. Satranç motorlarının test edilmesinde bu veritabanları önemli yer tutar ve yorucu veri girişi işlemlerinden kurtulmayı sağlar. [1]

FEN tanımlaması tek satırdan oluşur ve 6 alandan ibarettir:

  • İlk alan, taşların yerleşimini ifade eder. Taşların dizilimi 8. satırdan başlanarak gösterilir. Beyaz taşlar için "PNBRQK" şeklinde büyük harfler kullanılırken, siyah taşlar için küçük harfler kullanılır.
  • İkinci alan aktif rengi ifade etmektedir. Eğer sıra beyazda ise "w" değerini alır.
  • Üçüncü alan rok yapma iznini ifade eder. Eğer her iki taraf da rok yapamıyorsa "-" değerini alır. Eğer beyaz, şah tarafına rok yapabiliyorsa "K", vezir tarafına rok yapabiliyorsa "Q" değerini alır.
  • Dördüncü alan, en passant hamlesi için hedef olan kareyi gösterir. Eğer herhangi bir en passant hedef karesi yoksa "-" değerini alır.
  • Beşinci alan, yarım hamle sayısını gösterir. Bu, elli hamle kuralı içerisinde beraberlik oluşması açısından önemlidir.
  • Altıncı alan tam hamle sayısını gösterir. Bu sayı, siyahlar hamle yaptığında arttırılmaktadır.

Satrançta başlangıç pozisyonunu ifade eden FEN tanımı şu şekildedir:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

FEN notasyonu PGN (Portable Game Notation) içerisindeki bir kısım olarak değerlendirilmektedir. Modern satranç motorlarının hepsi bu standartları desteklemektedir.

UCI PROTOKOLÜ

UCI spesifikasyonu işletim sisteminden bağımsızdır. Satranç motoru Windows sistemlerinde bir .exe dosyasıdır. Motor ile grafik arayüz arasındaki iletişim standart giriş/çıkış yoluyla ve text komutları ile yapılmaktadır. Motor hızlı bir biçimde boot ederek GUI tarafından gönderilecek komutlara hazır olmalıdır. Motora "isready" veya "setoption" komutları geldiğinde içsel parametrelerini set etmelidir.
Motor, düşünürken bile standart giriş kısmından gelen komutları işleyebilmelidir. Motor kendisine bir "go" komutu gelmediği sürece hesaplamaya başlamamalıdır. Motor belli bir pozisyonu hesaplamaya başlamadan önce "position" komutunu almış olmalıdır. Varsayılan durumda açılış kitabı GUI tarafından yönetilecektir. Motor, kendisine anlamsız veya yanlış bir komut geldiğinde onu basitçe yok sayacaktır. Hamlelerin ifade edilişi uzun cebirsel notasyon ile olacaktır. [2]

Önemli UCI Komutları

GUI'den Motora:

  • uci
    Motora UCI protokolünü kullanmasını söyle. Bu komut program çalıştırıldığında bir kez gönderilecektir. Komutu alan motor, kendisini tanıtarak "option" komutları ile desteklediği ayarları bildirecektir. Daha sonra "uciok" komutu ile protokolü desteklediğini bildirecektir, aksi halde çalışması durdurulacaktır.
  • debug [ on | off ]
    Debug modunu açmak ve kapamak için kullanılır. Motor düşünürken bile debug modu değiştirilebilmelidir.
  • isready
    Motorun yeni bir komutu işlemeye hazır olup olmadığını anlamak ve GUI ile senkronize olmasını sağlamak için kullanılır. "readyok" komutu ile cevaplanmaktadır.
  • position [fen | startpos ] moves ....
Motor içsel olarak pozisyonu kurmalı ve komuttaki hamleleri oynamalıdır. Pozisyon FEN notasyonundaki gibi ya da başlangıç pozisyonunda olabilir.
  • go
    "position" komutu ile verilmiş olan pozisyonu hesaplamaya başla.
  • go searchmoves ....
    Arama işlemini verilen hamleler ile sınırla
  • go wtime
    Beyazın x milisaniye düşünme süresi kalmıştır.
  • go mate
    x hamlede mat ara.
  • go ponder
    Ponder moduna geçerek arama yap. Burada motora GUI tarafından rakibin yapması tahmin edilen hamle söylenmekte ve bunun üzerinden düşünmesi istenmektedir.
  • ponderhit
    Rakip tahmin edilen hamleyi yapmıştır. Motor normal arama moduna dönmelidir.

Motor'dan GUI'ye

  • id
    GUI'den "uci" komutu alındıktan sonra cevap olarak dönmelidir.
  • uciok
    "id" komutundan sonra gönderilir ve tüm bilgilerin gönderilmiş olduğu ve uci modunda hazır olunduğu anlamına gelir.
  • bestmove
Motor hesaplama işlemini tamamlamış ve en iyi hamleyi bulmuştur.
  • info
    Hesaplama ile ilgili ayrıntılı bilgiler verilir.
  • option
Motor parametreleri açıklanır.



[1] Edwards, S. J. "Portable game notation." (1994).

[2] Kahlen, Stefan-Meyer, and Rudolf Huber. "Universal chess interface (uci)." (2014).

Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

My Crappy Looking Solution to "Binary Tree Common Ancestor" Problem

A Graph Application in Java: Using WordNet to Find Outcast Words