11

Tôi thực hiện cơ bản việc cắt xén alpha-beta nhưng tôi không biết cách cải thiện thứ tự di chuyển. Tôi đã đọc rằng nó có thể được thực hiện với một tìm kiếm nông, làm sâu sắc lặp đi lặp lại hoặc lưu trữ các bestMoves để chuyển đổi bảng.Đặt hàng di chuyển Alpha-beta

Bất kỳ đề xuất nào về cách triển khai một trong những cải tiến này trong thuật toán này?

public double alphaBetaPruning(Board board, int depth, double alpha, double beta, int player) { 
    if (depth == 0) { 
     return board.evaluateBoard(); 
    } 

    Collection<Move> children = board.generatePossibleMoves(player); 
    if (player == 0) { 
     for (Move move : children) { 
      Board tempBoard = new Board(board); 
      tempBoard.makeMove(move); 
      int nextPlayer = next(player); 
      double result = alphaBetaPruning(tempBoard, depth - 1, alpha,beta,nextPlayer); 
      if ((result > alpha)) { 
       alpha = result; 
       if (depth == this.origDepth) { 
        this.bestMove = move; 
       } 
      } 
      if (alpha >= beta) { 
       break; 
      } 
     } 
     return alpha; 
    } else { 
     for (Move move : children) { 
      Board tempBoard = new Board(board); 
      tempBoard.makeMove(move); 
      int nextPlayer = next(player); 
      double result = alphaBetaPruning(tempBoard, depth - 1, alpha,beta,nextPlayer); 
      if ((result < beta)) { 
       beta = result; 
       if (depth == this.origDepth) { 
        this.bestMove = move; 
       } 
      } 
      if (beta <= alpha) { 
       break; 
      } 
     } 
     return beta; 
    } 
} 

public int next(int player) { 
    if (player == 0) { 
     return 4; 
    } else { 
     return 0; 
    } 
} 

Trả lời

15
  • Node sắp xếp lại với tìm kiếm cạn là tầm thường: tính toán giá trị heuristic cho mỗi đứa trẻ của nhà nước trước khi đệ quy kiểm tra chúng. Sau đó, sắp xếp giá trị của các trạng thái này [giảm dần cho đỉnh tối đa và tăng dần cho đỉnh tối đa] và đệ quy gọi thuật toán trên danh sách được sắp xếp. Ý tưởng là - nếu một trạng thái tốt ở mức độ sâu , có nhiều khả năng là tốt ở trạng thái sâu, và nếu nó đúng - bạn sẽ nhận được nhiều cảnh báo hơn.

    Các phân loại nên được thực hiện trước này [trong cả ifelse khoản]

    for (Move move : children) {

  • lưu trữ di chuyển cũng là tầm thường - nhiều tiểu bang được tính hai lần, khi bạn hoàn thành việc tính toán bất cứ tiểu bang , lưu trữ nó [với độ sâu tính toán! nó là improtant!] trong một HashMap. Điều đầu tiên bạn làm khi bạn bắt đầu tính toán trên một đỉnh - là kiểm tra xem nó đã được tính - và nếu có, trả về giá trị được lưu trong bộ nhớ cache. Ý tưởng đằng sau đó là nhiều tiểu bang có thể truy cập từ các đường dẫn khác nhau, do đó, cách này - bạn có thể loại bỏ các tính toán dư thừa.

    Những thay đổi nên được thực hiện cả trong dòng đầu tiên của phương pháp này [cái gì đó như if (cache.contains((new State(board,depth,player)) return cache.get(new State(board,depth,player))] [xin lỗi vì thiếu sang trọng và hiệu quả - chỉ giải thích một ý tưởng ở đây].
    Bạn cũng nên thêm cache.put(...) trước mỗi câu lệnh return.

+0

được cung cấp mẫu mã trong câu hỏi, bạn có thể vui lòng cung cấp triển khai hoặc sắp xếp có thể (do đó cả sắp xếp và gọi đệ quy trên danh sách được sắp xếp)? Tôi bối rối về cách thực hiện điều đó. – FedericoCapaldo

0

Trước hết người ta phải hiểu lý do đằng sau thứ tự di chuyển trong một thuật toán cắt tỉa alpha-beta. Alpha-beta tạo ra kết quả tương tự như một minimax nhưng trong nhiều trường hợp có thể làm nhanh hơn vì nó không tìm kiếm thông qua các nhánh không liên quan.

Nó không phải lúc nào cũng nhanh hơn, bởi vì nó không đảm bảo cắt tỉa, nếu thực tế trong trường hợp xấu hơn nó sẽ không cắt tỉa và tìm kiếm hoàn toàn cùng một cây như minimax và sẽ chậm hơn vì giá trị a/b book- duy trì. Trong trường hợp tốt nhất (cắt tỉa tối đa) nó cho phép tìm kiếm một cây 2 lần sâu cùng một lúc. Đối với một cây ngẫu nhiên, nó có thể tìm kiếm sâu hơn 4/3 lần cùng một lúc.

Move đặt hàng có thể được thực hiện trong một vài cách sau:

  1. bạn có một chuyên gia miền người mang đến cho bạn gợi ý về những gì di chuyển tốt hơn. Ví dụ như trong việc quảng bá cờ vua của một cầm đồ, việc nắm bắt những mảnh có giá trị cao với mảnh giá trị thấp hơn là những động thái tốt trung bình. Trong checkers nó là tốt hơn để giết nhiều checkers trong một di chuyển sau đó ít checker và nó là tốt hơn để tạo ra một nữ hoàng.Vì vậy, chức năng thế hệ di chuyển của bạn trở lại các bước di chuyển tốt hơn trước
  2. bạn nhận được ý tưởng của việc di chuyển từ đánh giá vị trí ở mức 1 sâu hơn nhỏ hơn như thế nào (tìm kiếm nông sâu của bạn). Bạn đã tính toán đánh giá ở độ sâu n-1, sắp xếp các chuyển động và sau đó đánh giá ở độ sâu n.

Cách tiếp cận thứ hai bạn đã đề cập không liên quan gì đến việc đặt hàng chuyển. Nó phải làm với một thực tế là chức năng đánh giá có thể tốn kém và nhiều vị trí được đánh giá nhiều thời gian. Để bỏ qua điều này, bạn có thể lưu trữ các giá trị của vị trí trong băm sau khi bạn tính toán nó và sử dụng lại nó sau này.

Các vấn đề liên quan