Zum Hauptinhalt springen

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
1

Reihenfolge der Aufkleber auf jeder Seite:

  2   5   8
1 4 7
[0] 3 6

Indizes 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 15

Farben (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.

Beispiel
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
)

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.