Zum Hauptinhalt springen

env

Rubik's Cube Umgebung

Dieses Modul definiert die Klasse Cube3, die einen 3x3x3 Rubik's Cube in der Half-Turn Metrik repräsentiert.

Klasse: Cube3: Eine Klasse für den 3x3x3 Rubik's Cube in der Half-Turn Metrik.

Cube3

class Cube3()

Eine Klasse für den 3x3x3 Rubik's Cube in der Half-Turn Metrik (HTM).

Diese Klasse stellt Methoden zur Manipulation und Lösung eines 3x3x3 Rubik's Cube unter Verwendung der Half-Turn Metrik bereit. Sie definiert den Anfangs- und Zielzustand des Würfels, verfügbare Züge und Methoden zur Würfelmanipulation.

Repräsentation:

Reihenfolge der Flächen:

   0
2 5 3 4
1

Reihenfolge der Sticker auf jeder Fläche:

  2   5   8
1 4 7
[0] 3 6

Indizes des Zustands (jeweils beginnend 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 Array von Stickerfarben.
  • GOAL ndarray - Fester Zielzustand, dargestellt als Array von Stickerfarben.
  • moves list - Liste der möglichen Würfelzüge (Fläche und Richtung).
  • allow_wide bool - Flag, das angibt, ob weite Züge erlaubt sind.
  • sticker_target dict - Ein Dictionary, das Zugstrings auf Listen von Ziel-Stickerindizes abbildet.
  • sticker_source dict - Ein Dictionary, das Zugstrings auf Listen von Quell-Stickerindizes abbildet.
  • sticker_target_ix ndarray - Ein 2D-NumPy-Array, das Zugindizes auf Ziel-Stickerindizes für normale Züge abbildet.
  • sticker_source_ix ndarray - Ein 2D-NumPy-Array, das Zugindizes auf Quell-Stickerindizes für normale Züge abbildet.
  • sticker_target_ix_wide ndarray - Ein 2D-NumPy-Array, das Zugindizes auf Ziel-Stickerindizes für weite Züge abbildet.
  • sticker_source_ix_wide ndarray - Ein 2D-NumPy-Array, das Zugindizes auf Quell-Stickerindizes für weite 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 Sticker.

validate

def validate(state=None, centered=True)

Überprüft den Zustand und die Anordnung des Würfels.

Argumente:

  • centered bool - Ob die Zentren 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 auf den gelösten Zustand zurück.

reset_axes

def reset_axes()

Setzt die Farbindizes entsprechend der angegebenen Mittenfarben zurück. Nützlich, wenn breite Züge angewendet werden oder eine unerwartete Perspektive angegeben wird.

is_solved

def is_solved()

Prüft, ob sich der Würfel im gelösten Zustand befindet.

finger

def finger(move)

Wendet einen einzelnen Zug auf den Würfelzustand unter Verwendung des Zugstrings an.

Argumente:

  • move str - Zugstring in HTM-Notation.

finger_ix

def finger_ix(ix)

Wendet einen einzelnen Zug unter Verwendung des Zugindex für eine schnellere Ausführung an.

Argumente:

  • ix int - Index des Zuges.

apply_scramble

def apply_scramble(scramble)

Wendet eine Folge von Zügen (Scramble) auf den Würfelzustand an.

Argumente:

  • scramble str or list - Folge von Zügen in HTM-Notation oder als Liste.

__vectorize_moves

def __vectorize_moves()

Vektorisiert die Ersetzungsoperationen der Stickergruppen für eine schnellere Berechnung. Diese Methode definiert self.sticker_target und self.sticker_source, um die Stickerfarben zu verwalten (Ziel wird durch Quelle ersetzt). Sie definieren Indizes von Ziel- und Quellstickern, so dass die Züge vektorisiert werden können.

Dataset

class Dataset(torch.utils.data.Dataset)

Pseudo-Datensatzklasse, um unendlich zufällige Scrambles zu erzeugen.

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 zur Erzeugung zufälliger Rubik's Cube Scrambles.

Argumente:

  • batch_size int - Die Anzahl der Samples pro Batch.
  • num_workers int, optional - Die Anzahl der Worker-Prozesse für das Laden der Daten. Standardmäßig die Anzahl der CPU-Kerne oder 32 (darüber hinaus nimmt der Ertrag ab), je nachdem, was kleiner ist.
  • max_depth int, optional - Die maximale Tiefe der Scrambles. Standardwert ist 20.
  • **dl_kwargs - Zusätzliche Schlüsselwortargumente, die an den Konstruktor von DataLoader übergeben werden.

Rückgabe:

  • torch.utils.data.DataLoader - Eine DataLoader-Instanz, die Batches von zufälligen Scrambles liefert.