Среда кубика Рубика
Этот модуль определяет класс Cube3
, представляющий кубик Рубика 3x3x3 в метрике полуоборотов (Half-Turn Metric).
Класс:
Cube3
: Класс для кубика Рубика 3x3x3 в метрике полуоборотов.
Cube3
class Cube3()
Класс для кубика Рубика 3x3x3 в метрике полуоборотов (HTM).
Этот класс предоставляет методы для манипулирования и сборки кубика Рубика 3x3x3 с использованием метрики полуоборотов. Он определяет начальное и целевое состояния кубика, доступные ходы и методы для манипулирования кубиком.
Представление:
Порядок граней:
0
2 5 3 4
1Порядок наклеек на каждой грани:
2 5 8
1 4 7
[0] 3 6Индексы состояния (каждый начинается с
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 15Цвета (
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
Атрибуты:
state
ndarray - Текущее состояние кубика, представленное в виде массива цветов наклеек.GOAL
ndarray - Фиксированное целевое состояние, представленное в виде массива цветов наклеек.moves
list - Список возможных ходов кубика (грань и направление).allow_wide
bool - Флаг, указывающий, разрешены ли широкие ходы.max_depth
int - Максимальная глубина скрамбла для генератора данных.sticker_target
dict - Словарь, сопоставляющий строки ходов со списками индексов целевых наклеек.sticker_source
dict - Словарь, сопоставляющий строки ходов со списками индексов исходных наклеек.sticker_target_ix
ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами целевых наклеек для обычных ходов.sticker_source_ix
ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами исходных наклеек для обычных ходов.sticker_target_ix_wide
ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами целевых наклеек для широких ходов.sticker_source_ix_wide
ndarray - Двумерный массив numpy, сопоставляющий индексы ходов с индексами исходных наклеек для широких ходов.
show
def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)
Отображает текущее состояние кубика.
Аргументы:
flat
bool - Отображать ли состояние в развернутом виде.palette
list - Список цветов для представления наклеек.
validate
def validate(
state=None,
centered=True
)
Проверяет состояние и расположение кубика.
Аргументы:
centered
bool - Должны ли центры быть центрированы.
Вызывает:
ValueError
- Если состояние или расположение кубика неверно.
reset
def reset()
Сбрасывает состояние кубика до собранного.
reset_axes
def reset_axes()
Сбрасывает индексы цветов в соответствии с заданными цветами центров. Полезно при применении широких ходов или при указании неожиданной перспективы.
is_solved
def is_solved()
Проверяет, находится ли кубик в собранном состоянии.
finger
def finger(move)
Применяет один ход к состоянию кубика, используя строку хода.
Аргументы:
move
str - Строка хода в нотации HTM.
finger_ix
def finger_ix(ix)
Применяет один ход, используя его индекс, для более быстрого выполнения, чем .finger
.
Проверяет, соответствует ли индекс хода обычному ходу (ix < 18) или широкому ходу, и применяет
изменение состояния, используя предварительно вычисленные массивы индексов.
Аргументы:
ix
int - Индекс применяемого хода.
apply_scramble
def apply_scramble(scramble)
Применяет последовательность ходов (скрамбл) к состоянию кубика.
Аргументы:
scramble
str или list - Последовательность ходов в нотации HTM в виде строки или списка.
__iter__
def __iter__()
Создает бесконечный генератор разобранных состояний и последовательностей решений.
Этот метод предназначен для обучения модели. На каждой итерации он генерирует
новый случайный скрамбл длиной max_depth
ходов, избегая тривиальных последовательностей.
Он возвращает историю состояний и соответствующий ход, который привел к каждому состоянию.
Возвращает (yields):
tuple[np.ndarray, np.ndarray]: Кортеж, содержащий:
- X (np.ndarray): Массив состояний кубика размером (max_depth, 54).
- y (np.ndarray): Массив индексов ходов размером (max_depth,), которые сгенерировали состояния.
__vectorize_moves
def __vectorize_moves()
Векторизует операции замены групп наклеек для ускорения вычислений.
Этот метод определяет self.sticker_target
и self.sticker_source
для управления цветами наклеек (целевые заменяются исходными).
Они определяют индексы целевых и исходных наклеек, чтобы ходы можно было векторизовать.
Dataset
class Dataset(torch.utils.data.Dataset)
Псевдо-класс набора данных для бесконечной генерации случайных скрамблов.
Примерbatch_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
)
Создает экземпляр DataLoader для генерации случайных скрамблов кубика Рубика.
Аргументы:
batch_size
int - Количество образцов в батче.num_workers
int, optional - Количество рабочих процессов для загрузки данных. По умолчанию равно количеству ядер ЦП или 32 (дальнейшее увеличение не дает прироста производительности), в зависимости от того, что меньше.max_depth
int, optional - Максимальная глубина скрамблов. По умолчанию 20.**dl_kwargs
- Дополнительные именованные аргументы для передачи в конструктор DataLoader.
Возвращает:
torch.utils.data.DataLoader
- Экземпляр DataLoader, который возвращает батчи случайных скрамблов.