Przejdź do głównej zawartości

env

Środowisko Kostki Rubika

Ten moduł definiuje klasę Cube3 reprezentującą Kostkę Rubika 3x3x3 w metryce półobrotowej (Half-Turn Metric).

Klasa: Cube3: Klasa dla Kostki Rubika 3x3x3 w metryce półobrotowej (Half-Turn Metric).

Cube3

class Cube3()

Klasa dla Kostki Rubika 3x3x3 w metryce półobrotowej (HTM).

Ta klasa dostarcza metody do manipulowania i rozwiązywania Kostki Rubika 3x3x3 przy użyciu metryki półobrotowej. Definiuje ona stan początkowy i docelowy kostki, dostępne ruchy oraz metody do manipulacji kostką.

Reprezentacja:

Kolejność ścianek:

   0
2 5 3 4
1

Kolejność naklejek na każdej ściance:

  2   5   8
1 4 7
[0] 3 6

Indeksy stanu (każdy zaczyna się od 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

Kolory (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

Atrybuty:

  • state ndarray - Aktualny stan kostki reprezentowany jako tablica kolorów naklejek.
  • GOAL ndarray - Stały stan docelowy reprezentowany jako tablica kolorów naklejek.
  • moves list - Lista możliwych ruchów kostki (ścianka i kierunek).
  • allow_wide bool - Flaga wskazująca, czy dozwolone są ruchy szerokie (wide moves).
  • max_depth int - Maksymalna głębokość mieszania dla generatora danych.
  • sticker_target dict - Słownik mapujący ciągi znaków ruchów na listy indeksów naklejek docelowych.
  • sticker_source dict - Słownik mapujący ciągi znaków ruchów na listy indeksów naklejek źródłowych.
  • sticker_target_ix ndarray - Dwuwymiarowa tablica numpy mapująca indeksy ruchów na indeksy naklejek docelowych dla ruchów normalnych.
  • sticker_source_ix ndarray - Dwuwymiarowa tablica numpy mapująca indeksy ruchów na indeksy naklejek źródłowych dla ruchów normalnych.
  • sticker_target_ix_wide ndarray - Dwuwymiarowa tablica numpy mapująca indeksy ruchów na indeksy naklejek docelowych dla ruchów szerokich.
  • sticker_source_ix_wide ndarray - Dwuwymiarowa tablica numpy mapująca indeksy ruchów na indeksy naklejek źródłowych dla ruchów szerokich.

show

def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)

Wyświetla aktualny stan kostki.

Argumenty:

  • flat bool - Czy wyświetlać stan w formie płaskiej.
  • palette list - Lista kolorów do reprezentacji naklejek.

validate

def validate(
state=None,
centered=True
)

Sprawdza poprawność stanu i ułożenia kostki.

Argumenty:

  • centered bool - Czy środki powinny być wyśrodkowane, czy nie.

Zgłasza:

  • ValueError - Jeśli stan lub ułożenie kostki jest nieprawidłowe.

reset

def reset()

Resetuje stan kostki do stanu rozwiązanego.

reset_axes

def reset_axes()

Resetuje indeksy kolorów zgodnie z podanymi kolorami środków. Przydatne, gdy stosowane są ruchy szerokie (fat moves) lub gdy określono nieoczekiwaną perspektywę.

is_solved

def is_solved()

Sprawdza, czy kostka jest w stanie rozwiązanym.

finger

def finger(move)

Wykonuje pojedynczy ruch na stanie kostki, używając ciągu znaków ruchu.

Argumenty:

  • move str - Ciąg znaków ruchu w notacji HTM.

finger_ix

def finger_ix(ix)

Wykonuje pojedynczy ruch, używając jego indeksu, co jest szybsze niż .finger. Sprawdza, czy indeks ruchu odpowiada ruchowi normalnemu (ix < 18) czy szerokiemu, i stosuje zmianę stanu przy użyciu wstępnie obliczonych tablic indeksów.

Argumenty:

  • ix int - Indeks ruchu do wykonania.

apply_scramble

def apply_scramble(scramble)

Stosuje sekwencję ruchów (mieszanie) do stanu kostki.

Argumenty:

  • scramble str or list - Sekwencja ruchów w notacji HTM jako ciąg znaków lub lista.

__iter__

def __iter__()

Tworzy nieskończony generator pomieszanych stanów i sekwencji rozwiązań.

Ta metoda jest przeznaczona do trenowania modelu. W każdej iteracji generuje nowe losowe mieszanie o głębokości max_depth ruchów, unikając trywialnych sekwencji ruchów. Zwraca (yield) historię stanów i odpowiadający im ruch, który doprowadził do każdego stanu.

Zwraca (yields):

krotka[np.ndarray, np.ndarray]: Krotka zawierająca:

  • X (np.ndarray): Tablica stanów kostki o wymiarach (max_depth, 54).
  • y (np.ndarray): Tablica indeksów ruchów o wymiarach (max_depth,), które wygenerowały stany.

__vectorize_moves

def __vectorize_moves()

Wektoryzuje operacje zamiany grup naklejek w celu szybszych obliczeń. Ta metoda definiuje self.sticker_target i self.sticker_source do zarządzania kolorami naklejek (docelowy jest zastępowany przez źródłowy). Definiują one indeksy naklejek docelowych i źródłowych, aby ruchy mogły być zwektoryzowane.

Dataset

class Dataset(torch.utils.data.Dataset)

Klasa pseudo-zbioru danych do nieskończonego generowania losowych mieszań.

Przykład
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
)

Tworzy instancję DataLoader do generowania losowych mieszań Kostki Rubika.

Argumenty:

  • batch_size int - Liczba próbek w jednej partii.
  • num_workers int, optional - Liczba procesów roboczych używanych do ładowania danych. Domyślnie jest to liczba rdzeni procesora lub 32 (powyżej której korzyści maleją), w zależności od tego, która wartość jest mniejsza.
  • max_depth int, optional - Maksymalna głębokość mieszania. Domyślnie 20.
  • **dl_kwargs - Dodatkowe argumenty słownikowe do przekazania do konstruktora DataLoader.

Zwraca:

  • torch.utils.data.DataLoader - Instancja DataLoader, która zwraca (yields) partie losowych mieszań.