search
Este módulo proporciona una función para realizar búsqueda en haz (beam search) y encontrar soluciones para un estado dado.
Función:
beam_search
: Realiza búsqueda en haz para encontrar soluciones en un entorno de Cubo de Rubik.
MAX_BATCH_SIZE
El número máximo de estados que se pasan hacia adelante a través de una DNN a la vez.
beam_search
def beam_search(env, model, beam_width, ergonomic_bias=None, extra_depths=0, max_depth=100)
Realiza búsqueda en haz para encontrar soluciones para un estado mezclado dado.
Argumentos:
env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.model
torch.nn.Module - DNN utilizada para predecir la distribución de probabilidad de los siguientes movimientos para cada estado.beam_width
int - El número máximo de candidatos a mantener en cada paso de la búsqueda.ergonomic_bias
dict or None - Un diccionario que especifica el sesgo ergonómico para los movimientos, si está disponible.extra_depths
int - El número de profundidades adicionales a buscar más allá de la profundidad de la primera solución.max_depth
int - La profundidad máxima a buscar, debe ser igual o mayor que el Número de Dios (20 para el Cubo de Rubik en HTM).
Retorna:
dict
|None
: Con al menos una solución, un diccionario con las siguientes claves:
"solutions"
: Una lista de soluciones óptimas o casi óptimas encontradas durante la búsqueda."num_nodes"
: El número total de nodos expandidos durante la búsqueda."time"
: El tiempo tomado (en segundos) para completar la búsqueda.
De lo contrario, None
.
_reflect_setup
def _reflect_setup(ergonomic_bias, env)
Inicializa el sesgo ergonómico si se proporciona.
Argumentos:
ergonomic_bias
dict or None - Un diccionario que especifica el sesgo ergonómico para los movimientos, si está disponible.env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.
Retorna:
ergonomic_bias
numpy.ndarray - El sesgo ergonómico para los movimientos, si está disponible.env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.
predict
@torch.inference_mode()
def predict(model, batch_x, ergonomic_bias, env)
Predice la distribución de probabilidad de los siguientes movimientos para cada estado.
Argumentos:
model
torch.nn.Module - DNN utilizada para predecir la distribución de probabilidad de los siguientes movimientos para cada estado.batch_x
numpy.ndarray - Lote de estados.ergonomic_bias
dict or None - Un diccionario que especifica el sesgo ergonómico para los movimientos, si está disponible.env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.
Retorna:
batch_logprob
numpy.ndarray - El logaritmo de la probabilidad de cada movimiento para cada estado.
La inferencia con Automatic Mixed Prevision es ligeramente más rápida que la simple precisión media (con model.half()
) por algunas razones.
update_candidates
def update_candidates(candidates, batch_logprob, env, depth, beam_width)
Expande los caminos candidatos con las probabilidades predichas de los siguientes movimientos.
Argumentos:
candidates
dict - Un diccionario que contiene los caminos candidatos, las probabilidades acumuladas y los estados.batch_logprob
numpy.ndarray - El logaritmo de la probabilidad de cada movimiento para cada estado.env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.depth
int - La profundidad actual de la búsqueda.beam_width
int - El número máximo de candidatos a mantener en cada paso de la búsqueda.
Retorna:
candidates
dict - El diccionario actualizado que contiene los caminos candidatos, las probabilidades acumuladas y los estados.
_get_prune_idx
def _get_prune_idx(candidates_paths, allow_wide, depth)
Obtiene los índices de los candidatos a podar en función de los movimientos anteriores.
Argumentos:
candidates_paths
numpy.ndarray - Los caminos de los estados candidatos.allow_wide
bool - Si se permiten movimientos amplios.depth
int - La profundidad actual de la búsqueda.
Retorna:
prune_idx
numpy.ndarray - Los índices de los candidatos a podar.
Usar numba.jit
en realidad ralentiza esta función.
_update_states
def _update_states(candidate_states, candidate_paths, env)
Actualiza los estados en función de los caminos expandidos.
Argumentos:
candidate_states
numpy.ndarray - Los estados de los estados candidatos.candidate_paths
numpy.ndarray - Los caminos de los estados candidatos.env
Cube3 - El entorno del Cubo de Rubik que representa el estado mezclado.
Retorna:
candidate_states
numpy.ndarray - Los estados actualizados de los estados candidatos.
_map_state
def _map_state(candidate_states, target_ix, source_ix)
Realiza el reemplazo de pegatinas a nivel de lote.
Argumentos:
candidate_states
numpy.ndarray - Los estados de los estados candidatos.target_ix
numpy.ndarray - Los índices de destino para el reemplazo de pegatinas.source_ix
numpy.ndarray - Los índices de origen para el reemplazo de pegatinas.
Retorna:
candidate_states
numpy.ndarray - Los estados actualizados de los estados candidatos.
Usar numba.jit
en realidad ralentiza esta función.