Entorno del Cubo de Rubik
Este módulo define la clase Cube3 que representa un Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro (Half-Turn Metric).
Clase:
Cube3
: Una clase para el Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro.
Cube3
class Cube3()
Una clase para el Cubo de Rubik de 3x3x3 en la Métrica de Medio Giro (HTM).
Esta clase proporciona métodos para manipular y resolver un Cubo de Rubik de 3x3x3 utilizando la métrica de medio giro. Define los estados inicial y objetivo del cubo, los movimientos disponibles y los métodos para la manipulación del cubo.
Representación:
Orden de las caras:
0
2 5 3 4
1Orden de las pegatinas en cada cara:
2 5 8
1 4 7
[0] 3 6Índices del estado (cada uno comenzando con
9 * (n-1)
):2 5 8
1 4 7
[0] 3 6
20 23 26 47 50 53 29 32 35 38 41 44
19 22 25 46 49 52 28 31 34 37 40 43
[18] 21 24 [45] 48 51 [27] 30 33 [36] 39 42
11 14 17
10 13 16
[9] 12 15Colores (
indices // 9
):0 0 0
0 0 0
0 0 0
2 2 2 5 5 5 3 3 3 4 4 4
2 2 2 5 5 5 3 3 3 4 4 4
2 2 2 5 5 5 3 3 3 4 4 4
1 1 1
1 1 1
1 1 1
Atributos:
state
ndarray - Estado actual del cubo representado como un array de colores de las pegatinas.GOAL
ndarray - Estado objetivo fijo representado como un array de colores de las pegatinas.moves
list - Lista de posibles movimientos del cubo (cara y dirección).allow_wide
bool - Bandera que indica si se permiten movimientos anchos (wide moves).max_depth
int - La profundidad máxima de la mezcla para el generador de datos.sticker_target
dict - Un diccionario que mapea cadenas de movimiento a listas de índices de pegatinas de destino.sticker_source
dict - Un diccionario que mapea cadenas de movimiento a listas de índices de pegatinas de origen.sticker_target_ix
ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de destino para movimientos normales.sticker_source_ix
ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de origen para movimientos normales.sticker_target_ix_wide
ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de destino para movimientos anchos.sticker_source_ix_wide
ndarray - Un array de numpy 2D que mapea índices de movimiento a índices de pegatinas de origen para movimientos anchos.
show
def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)
Muestra el estado actual del cubo.
Argumentos:
flat
bool - Si se debe mostrar el estado en forma plana.palette
list - Lista de colores para representar las pegatinas.
validate
def validate(
state=None,
centered=True
)
Valida el estado y la disposición del cubo.
Argumentos:
centered
bool - Si los centros deben estar centrados o no.
Lanza:
ValueError
- Si el estado o la disposición del cubo no son válidos.
reset
def reset()
Restablece el estado del cubo al estado resuelto.
reset_axes
def reset_axes()
Restablece los índices de color según los colores de los centros dados. Útil cuando se aplican movimientos anchos (fat moves) o cuando se especifica una perspectiva inesperada.
is_solved
def is_solved()
Comprueba si el cubo está en el estado resuelto.
finger
def finger(move)
Aplica un único movimiento al estado del cubo usando una cadena de movimiento.
Argumentos:
move
str - Cadena de movimiento en notación HTM.
finger_ix
def finger_ix(ix)
Aplica un único movimiento usando su índice para una ejecución más rápida que .finger
.
Comprueba si el índice del movimiento corresponde a un movimiento normal (ix < 18) o a un movimiento ancho y aplica
el cambio de estado utilizando arrays de índices precalculados.
Argumentos:
ix
int - Índice del movimiento a aplicar.
apply_scramble
def apply_scramble(scramble)
Aplica una secuencia de movimientos (mezcla) al estado del cubo.
Argumentos:
scramble
str or list - Secuencia de movimientos en notación HTM o como lista.
__iter__
def __iter__()
Crea un generador infinito de estados mezclados y secuencias de solución.
Este método está destinado al entrenamiento del modelo. En cada iteración, genera
una nueva mezcla aleatoria de max_depth
movimientos, evitando secuencias de movimientos triviales.
Produce el historial de estados y el movimiento correspondiente que llevó a cada estado.
Produce:
tuple[np.ndarray, np.ndarray]: Una tupla que contiene:
- X (np.ndarray): Un array de (max_depth, 54) con los estados del cubo.
- y (np.ndarray): Un array de (max_depth,) con los índices de los movimientos que generaron los estados.
__vectorize_moves
def __vectorize_moves()
Vectoriza las operaciones de reemplazo de grupos de pegatinas para un cálculo más rápido.
Este método define self.sticker_target
y self.sticker_source
para gestionar los colores de las pegatinas (el destino es reemplazado por el origen).
Definen los índices de las pegatinas de destino y origen para que los movimientos puedan ser vectorizados.
Dataset
class Dataset(torch.utils.data.Dataset)
Clase de pseudo-dataset para generar infinitamente mezclas aleatorias.
Ejemplobatch_size = 1024
dl = get_dataloader(batch_size)
for i, (batch_x, batch_y) in zip(range(1000), dl):
batch_x, batch_y = batch_x.to(device), batch_y.device().reshape(-1)
get_dataloader
def get_dataloader(
batch_size,
num_workers=min(os.cpu_count(), 32), max_depth=20,
**dl_kwargs
)
Crea una instancia de DataLoader para generar mezclas aleatorias del Cubo de Rubik.
Argumentos:
batch_size
int - El número de muestras por lote.num_workers
int, optional - El número de procesos de trabajo a utilizar para la carga de datos. Por defecto, es el número de núcleos de CPU o 32 (más allá del cual el rendimiento disminuye), el que sea menor.max_depth
int, optional - La profundidad máxima de las mezclas. Por defecto es 20.**dl_kwargs
- Argumentos de palabra clave adicionales para pasar al constructor de DataLoader.
Devuelve:
torch.utils.data.DataLoader
- Una instancia de DataLoader que produce lotes de mezclas aleatorias.