Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

121
Views
¿Posibles optimizaciones para mi algoritmo de poda alfa-beta?

Soy un nuevo programador que actualmente codifica un algoritmo minimax de poda alfa-beta de javascript para mi motor de ajedrez, usando Chess.js y Chessboard.js. He implementado un algoritmo básico con orden de movimiento. Actualmente, está evaluando alrededor de 14000 nodos durante 8 segundos, lo cual es demasiado lento. ¿Hay algún problema con mi algoritmo o hay optimizaciones que no he implementado? Mi algoritmo no puede procesar nada más profundo que la profundidad 4 dentro de límites de tiempo razonables. Gracias. PD: la función de "seguimiento de Eval" solo evalúa cada movimiento específico como una forma de evitar hacer una evaluación completa de los tableros en los nodos hoja, esta optimización aceleró mi programa en alrededor de un 50%, pero todavía es lento en este momento.

 function minimax(game, depth, distanceFromRoot, alpha, beta, gameEval) {//returns gameEval if (depth === 0) { nodeNum++; if(game.turn() === 'b'){ return (-gameEval / 8); }else{ return (gameEval / 8); } } // run eval var prevEval = gameEval; var moves = game.moves(); moveOrdering(moves); var bestMove = null; var bestEval = null; for (let i = 0; i < moves.length; i++) { var gameCopy = new Chess()//dummy board to pass down gameCopy.load(game.fen()) const moveInfo = gameCopy.move(moves[i]) var curGameCopy = new Chess()//static board to eval, before the move so we know which piece was taken if a capture occurs curGameCopy.load(game.fen()) var curEval = trackingEval(curGameCopy, prevEval, moveInfo, moves[i]); //returns the OBJECTIVE eval for the current move for current move sequence var evaluated = -minimax(gameCopy, depth - 1, distanceFromRoot + 1, -beta, -alpha, curEval);//pass down the current eval for that move if (evaluated >= beta) { return beta; } if (evaluated > alpha){ alpha = evaluated bestMove = moves[i] bestEval = evaluated; if (distanceFromRoot === 0) { bestEval = evaluated; } } } if(distanceFromRoot === 0){ setEval(-bestEval) return bestMove; } return alpha; }
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Es difícil decir qué optimizaciones ha realizado y qué es razonable, ya que solo vemos una pequeña parte de su código. Tu evaluación puede ser lenta, tu orden de jugadas puede ser lenta/incorrecta, y copiar el tablero también es más lento que hacer y luego deshacer la jugada.

Puede encontrar muchos consejos sobre cómo acelerar su algoritmo aquí: https://www.chessprogramming.org/Search . Chessprogramming.org también es un recurso muy bueno para desarrollar su motor en general.

about 4 years ago · Juan Pablo Isaza Report

0

Veo dos optimizaciones rápidas, antes de continuar con otra optimización clásica.

No calcule la evaluación de la placa excepto cuando la profundidad = 0. Supongo que calcula la evaluación completa en cada paso, lleva mucho tiempo y es totalmente innecesario.

No copie la pizarra cada vez. También lleva mucho tiempo. Trabaja con un tablero para toda la búsqueda, en el que haces y deshaces movimientos cuando estás haciendo la búsqueda. El pseudocódigo para esto es:

 for move in moves: board.do(move) #the original (not a copy) board has made the move #Alpha-beta stuff like you did board.undo(move) #restore the board
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!