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
1Kolejność naklejek na każdej ściance:
2 5 8
1 4 7
[0] 3 6Indeksy 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 15Kolory (
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ładbatch_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ń.