env
Entorno del Cubo de Rubik
Este módulo define la clase Cube3 que representa un Cubo de Rubik 3x3x3 en la Métrica de Medios Giros.
Clase:
Cube3
: Una clase para el Cubo de Rubik 3x3x3 en la Métrica de Medios Giros.
Cube3
class Cube3()
Una clase para el Cubo de Rubik 3x3x3 en la Métrica de Medios Giros (HTM).
Esta clase proporciona métodos para manipular y resolver un Cubo de Rubik 3x3x3 utilizando la métrica de medios giros. 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 arreglo de colores de pegatinas.GOAL
ndarray - Estado objetivo fijo representado como un arreglo de colores de pegatinas.moves
list - Lista de posibles movimientos del cubo (cara y dirección).allow_wide
bool - Bandera que indica si se permiten movimientos amplios.sticker_target
dict - Un diccionario que mapea cadenas de movimientos a listas de índices de pegatinas objetivo.sticker_source
dict - Un diccionario que mapea cadenas de movimientos a listas de índices de pegatinas fuente.sticker_target_ix
ndarray - Un arreglo numpy 2D que mapea índices de movimientos a índices de pegatinas objetivo para movimientos normales.sticker_source_ix
ndarray - Un arreglo numpy 2D que mapea índices de movimientos a índices de pegatinas fuente para movimientos normales.sticker_target_ix_wide
ndarray - Un arreglo numpy 2D que mapea índices de movimientos a índices de pegatinas objetivo para movimientos amplios.sticker_source_ix_wide
ndarray - Un arreglo numpy 2D que mapea índices de movimientos a índices de pegatinas fuente para movimientos amplios.
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 es inválida.
reset
def reset()
Restablece el estado del cubo al estado resuelto.
reset_axes
def reset_axes()
Restablece los índices de color de acuerdo con los colores de los centros dados. Útil cuando se aplican movimientos gruesos o cuando se especifica una perspectiva inesperada.
is_solved
def is_solved()
Verifica si el cubo está en el estado resuelto.
finger
def finger(move)
Aplica un solo movimiento en el estado del cubo utilizando una cadena de movimiento.
Argumentos:
move
str - Cadena de movimiento en notación HTM.
finger_ix
def finger_ix(ix)
Aplica un solo movimiento utilizando el índice de movimiento para una ejecución más rápida.
Argumentos:
ix
int - Índice del movimiento.
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 lista.
__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 administrar los colores de las pegatinas (el objetivo se reemplaza por la fuente).
Definen índices de pegatinas objetivo y fuente para que los movimientos puedan ser vectorizados.
Dataset
class Dataset(torch.utils.data.Dataset)
Clase de conjunto de datos pseudo 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, opcional - El número de procesos de trabajadores 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 retorno disminuirá), lo que sea menor.max_depth
int, opcional - La profundidad máxima de las mezclas. Por defecto es 20.**dl_kwargs
- Argumentos de palabra clave adicionales para pasar al constructor de DataLoader.
Retorna:
torch.utils.data.DataLoader
- Una instancia de DataLoader que genera lotes de mezclas aleatorias.