Zauberwürfel-Umgebung
Dieses Modul definiert die Klasse Cube3, die einen 3x3x3 Zauberwürfel in der Half-Turn-Metrik darstellt.
Klasse:
Cube3
: Eine Klasse für einen 3x3x3 Zauberwürfel in der Half-Turn-Metrik.
Cube3
class Cube3()
Eine Klasse für einen 3x3x3 Zauberwürfel in der Half-Turn-Metrik (HTM).
Diese Klasse bietet Methoden zur Manipulation und zum Lösen eines 3x3x3 Zauberwürfels unter Verwendung der Half-Turn-Metrik. Sie definiert den Ausgangs- und Zielzustand des Würfels, verfügbare Züge und Methoden zur Würfelmanipulation.
Darstellung:
Reihenfolge der Seiten:
0
2 5 3 4
1Reihenfolge der Aufkleber auf jeder Seite:
2 5 8
1 4 7
[0] 3 6Indizes des Zustands (jeder beginnt mit
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 15Farben (
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
Attribute:
state
ndarray - Aktueller Würfelzustand, dargestellt als ein Array von Aufkleberfarben.GOAL
ndarray - Fester Zielzustand, dargestellt als ein Array von Aufkleberfarben.moves
list - Liste der möglichen Würfelzüge (Seite und Richtung).allow_wide
bool - Flag, das anzeigt, ob breite Züge (wide moves) erlaubt sind.max_depth
int - Die maximale Verdrehungstiefe für den Datengenerator.sticker_target
dict - Ein Dictionary, das Zug-Strings auf Listen von Ziel-Aufkleberindizes abbildet.sticker_source
dict - Ein Dictionary, das Zug-Strings auf Listen von Quell-Aufkleberindizes abbildet.sticker_target_ix
ndarray - Ein 2D-Numpy-Array, das Zugindizes auf Ziel-Aufkleberindizes für normale Züge abbildet.sticker_source_ix
ndarray - Ein 2D-Numpy-Array, das Zugindizes auf Quell-Aufkleberindizes für normale Züge abbildet.sticker_target_ix_wide
ndarray - Ein 2D-Numpy-Array, das Zugindizes auf Ziel-Aufkleberindizes für breite Züge abbildet.sticker_source_ix_wide
ndarray - Ein 2D-Numpy-Array, das Zugindizes auf Quell-Aufkleberindizes für breite Züge abbildet.
show
def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)
Zeigt den aktuellen Zustand des Würfels an.
Argumente:
flat
bool - Ob der Zustand in flacher Form angezeigt werden soll.palette
list - Liste der Farben zur Darstellung der Aufkleber.
validate
def validate(
state=None,
centered=True
)
Überprüft den Zustand und die Anordnung des Würfels.
Argumente:
centered
bool - Ob die Mittelsteine zentriert sein sollen oder nicht.
Wirft:
ValueError
- Wenn der Zustand oder die Anordnung des Würfels ungültig ist.
reset
def reset()
Setzt den Würfelzustand in den gelösten Zustand zurück.
reset_axes
def reset_axes()
Setzt die Farbindizes entsprechend den angegebenen Mittelfarben zurück. Nützlich, wenn breite Züge (fat moves) angewendet werden oder eine unerwartete Perspektive angegeben wird.
is_solved
def is_solved()
Überprüft, ob sich der Würfel im gelösten Zustand befindet.
finger
def finger(move)
Wendet einen einzelnen Zug auf den Würfelzustand mittels eines Zug-Strings an.
Argumente:
move
str - Zug-String in HTM-Notation.
finger_ix
def finger_ix(ix)
Wendet einen einzelnen Zug über seinen Index an, was schneller ist als .finger
.
Überprüft, ob der Zugindex einem normalen Zug (ix < 18) oder einem breiten Zug entspricht, und wendet die Zustandsänderung mithilfe vorab berechneter Index-Arrays an.
Argumente:
ix
int - Index des anzuwendenden Zugs.
apply_scramble
def apply_scramble(scramble)
Wendet eine Sequenz von Zügen (Scramble) auf den Würfelzustand an.
Argumente:
scramble
str oder list - Sequenz von Zügen in HTM-Notation oder als Liste.
__iter__
def __iter__()
Erstellt einen unendlichen Generator von verdrehten Zuständen und Lösungssequenzen.
Diese Methode ist für das Modelltraining gedacht. Bei jeder Iteration erzeugt sie
einen neuen zufälligen Scramble von max_depth
Zügen und vermeidet dabei triviale Zugsequenzen.
Sie liefert die Historie der Zustände und den entsprechenden Zug, der zu jedem Zustand geführt hat.
Liefert:
tuple[np.ndarray, np.ndarray]: Ein Tupel, das Folgendes enthält:
- X (np.ndarray): Ein (max_depth, 54) Array von Würfelzuständen.
- y (np.ndarray): Ein (max_depth,) Array der Zugindizes, die die Zustände erzeugt haben.
__vectorize_moves
def __vectorize_moves()
Vektorisiert die Operationen zum Ersetzen von Aufklebergruppen für eine schnellere Berechnung.
Diese Methode definiert self.sticker_target
und self.sticker_source
zur Verwaltung der Aufkleberfarben (Ziel wird durch Quelle ersetzt).
Sie definieren die Indizes der Ziel- und Quellaufkleber, damit die Züge vektorisiert werden können.
Dataset
class Dataset(torch.utils.data.Dataset)
Pseudo-Datensatzklasse, die unendlich oft zufällige Scrambles liefert.
Beispielbatch_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
)
Erstellt eine DataLoader-Instanz zum Generieren von zufälligen Zauberwürfel-Scrambles.
Argumente:
batch_size
int - Die Anzahl der Samples pro Batch.num_workers
int, optional - Die Anzahl der Worker-Prozesse, die für das Laden der Daten verwendet werden sollen. Standardmäßig die Anzahl der CPU-Kerne oder 32 (darüber hinaus nimmt der Nutzen ab), je nachdem, welcher Wert kleiner ist.max_depth
int, optional - Die maximale Tiefe der Scrambles. Standardwert ist 20.**dl_kwargs
- Zusätzliche Schlüsselwortargumente, die an den DataLoader-Konstruktor übergeben werden.
Rückgabe:
torch.utils.data.DataLoader
- Eine DataLoader-Instanz, die Batches von zufälligen Scrambles liefert.