2015-06-30 6 views
8

Tworzyłem prosty silnik szachowy w języku C# w ciągu ostatniego miesiąca i zrobiłem kilka fajnych postępów w tej sprawie. Używa prostego algorytmu Alpha-Beta.Search Quescence szachy jest zbyt obszerna

W celu skorygowania efektu horyzontu, próbowałem zaimplementować wyszukiwanie w trybie wyciszenia (i kilka razy zakończyło się niepowodzeniem, zanim zadziałało). Wydaje się, że siła silnika nieco się poprawiła, ale jest niesamowicie powolna!

Wcześniej, mogłem przeszukać 6-warstwową głębię w około 160 sekund (gdzieś w stanie pośrednim), z wyszukiwaniem spoczynkowym, komputer przenosi około 80sekund, aby uzyskać ruch na głębokości wyszukiwania 3!

Licznik węzłów o dużej sile ma około 20000 węzłów na głębokości 3, a licznik węzłów spoczynkowych nie przekracza 20 milionów!

Ponieważ jest to mój pierwszy silnik szachowy, tak naprawdę nie wiem, czy te liczby są normalne, czy też mogłem popełnić błąd w moim algorytmie wyciszenia. Byłbym wdzięczny, gdyby ktoś bardziej doświadczony mógł mi powiedzieć, jaki jest zwykle stosunek węzłów BF Nodes/Quiescent.

Btw, żeby rzucić okiem na: (ta metoda jest wywoływana przez drzewo BF gdy searchdepth jest 0)

public static int QuiescentValue(chessBoard Board, int Alpha, int Beta) 
    { 
     QuiescentNodes++; 

     int MinMax = Board.WhoseMove; // 1 = maximierend, -1 = minimierend 
     int Counter = 0; 
     int maxCount; 


     int tempValue = 0; 
     int currentAlpha = Alpha; 
     int currentBeta = Beta; 
     int QuietWorth = chEvaluation.Evaluate(Board); 

     if(MinMax == 1) //Max 
     { 
      if (QuietWorth >= currentBeta) 
       return currentBeta; 
      if (QuietWorth > currentAlpha) 
       currentAlpha = QuietWorth; 
     } 

     else   //Min 
     { 
      if (QuietWorth <= currentAlpha) 
       return currentAlpha; 
      if (QuietWorth < currentBeta) 
       currentBeta = QuietWorth; 
     } 




     List<chMove> HitMoves = GetAllHitMoves(Board); 
     maxCount = HitMoves.Count; 

     if(maxCount == 0) 
      return chEvaluation.Evaluate(Board); 


     chessBoard tempBoard; 

     while (Counter < maxCount) 
     { 
      tempBoard = new chessBoard(Board); 
      tempBoard.Move(HitMoves[Counter]); 
      tempValue = QuiescentValue(tempBoard, currentAlpha, currentBeta); 

      if (MinMax == 1) //maximierend 
      { 
       if (tempValue >= currentBeta) 
       { 
        return currentBeta; 
       } 

       if (tempValue > currentAlpha) 
       { 
        currentAlpha = tempValue; 
       } 

      } 

      else   //minimierend 
      { 
       if (tempValue <= currentAlpha) 
       { 
        return currentAlpha; 
       } 
       if (tempValue < currentBeta) 
       { 
        currentBeta = tempValue; 
       } 
      } 

      Counter++; 
     } 

     if (MinMax == 1) 
      return currentAlpha; 
     else 
      return currentBeta; 

    } 
+1

Czy obejrzysz [to pytanie SO] (http://stackoverflow.com/questions/17510606/quiscence-search-performance ? rq = 1)? – DeadZone

+2

Jeden komentarz nie jest specyficzny dla wyszukiwania w stanie spoczynku: W przypadku gry w szachy zwykle jest _do _ szybsze modyfikowanie tej samej planszy, a następnie cofanie ruchu, a nie kopiowanie całej planszy dla każdej sondy. –

+0

@DeadZone: Spojrzałem na powiązany post, ale problem polegał na tym, że facet generował wszystkie ruchy w poszukiwaniu spoczynku (czego nie robię). – xXliolauXx

Odpowiedz

2

nie jestem familliar z angielskiej terminologii - jest HitMove posunięcie gdzie usuwasz kawałek z planszy?

W takim przypadku wydaje mi się, że używasz GetAllHitMoves, aby uzyskać listę "hałaśliwych" ruchów do wyszukiwania uspokojenia, które następnie są oceniane dalej niż zwykle 3 lub 6 warstw. Jest to nazywane rekursywnie, więc oceniasz to w kółko, o ile istnieją pozostałości HitMoves. Ograniczenie wyszukiwania w trybie spoczynku powinno rozwiązać problemy z wydajnością.

chodzi o wyborze limitu na poszukiwaniu spokoju - stany wiki:

Modern chess engines may search certain moves up to 2 or 3 times deeper than the minimum.

+0

Dziękuję, to wydaje się być tym, czego szukałem Ogranicziłem wyszukiwanie w trybie spoczynku do 4 warstw i wyszukiwanie nagle stało się o wiele szybsze! Zaznaczę wtedy Twoją odpowiedź – xXliolauXx

+0

Edytuj: Czy możesz mi powiedzieć jak bardzo ograniczone wyszukiwanie w trybie uśpienia wpływa na wynik wyszukiwania? – xXliolauXx

+1

W tym względzie? Ustawiając limit wyszukiwania uspokojenia, można oczywiście uzyskać efekt horyzontu w pobliżu limitu czasu spoczynkowego, jednak nie będzie jest w stanie tego uniknąć, chyba że ocenisz każdy możliwy ruch (zbliżony do tego, co zrobiłeś wcześniej) –