Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

123
Vistas
¿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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda