Zum Hauptinhalt springen

Erste Schritte

Installation

Um AlphaCube zu installieren, öffnen Sie ein Terminal und führen Sie folgenden Befehl aus:

pip install alphacube

Verwendung

Grundlagen

Die Verwendung von AlphaCube in Python ist so einfach wie folgt:

import alphacube

# Ein trainiertes DNN laden
alphacube.load(model_id="small") # das Standard-Modell

# Den Würfel mit einem gegebenen Scramble lösen
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=1024,
)
print(result)
Ausgabe
{
'solutions': [
"D L D2 R' U2 D B' D' U2 B U2 B' U' B2 D B2 D' B2 F2 U2 F2"
],
'num_nodes': 19744,
'time': 1.4068585219999659
}

Verbesserung der Qualität

Wenn Sie noch kürzere Lösungen wünschen, erhöhen Sie einfach den Parameter beam_width:

alphacube.load()  # model_id="small"
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
)
print(result)
Ausgabe
{
'solutions': [
"D' R' D2 F' L2 F' U B F D L D' L B D2 R2 F2 R2 F'",
"D2 L2 R' D' B D2 B' D B2 R2 U2 L' U L' D' U2 R' F2 R'"
],
'num_nodes': 968984,
'time': 45.690575091997744
}

Zulassen einiger zusätzlicher Züge

Möglicherweise möchten Sie nicht nur die kürzesten Algorithmen erhalten, sondern auch leicht redundante. Auf diese Weise können Sie das Risiko verringern, großartige Algorithmen zu übersehen.

alphacube.load()  # model_id="small"
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
extra_depths=1
)
print(result)
Ausgabe
{
'solutions': [
"D' R' D2 F' L2 F' U B F D L D' L B D2 R2 F2 R2 F'",
"D2 L2 R' D' B D2 B' D B2 R2 U2 L' U L' D' U2 R' F2 R'",
"D R F2 L' U2 R2 U2 R2 B2 U' F B2 D' F' D' R2 F2 U F2 L2",
"L' D' R' D2 L B' U F2 U R' U' F B' R2 B R B2 F D2 B",
"R' F L2 D R2 U' B' L' U2 F2 U L U B2 U2 R2 D' U B2 R2",
"L' U' F' R' U D B2 L' B' R' B U2 B2 L2 D' R2 U' D R2 U2"
],
'num_nodes': 1100056,
'time': 92.809575091997744
}

Anwenden von ergonomischer Gewichtung

Ergonomische Gewichtungen ermöglichen es Ihnen, die Wünschbarkeit bestimmter Züge, die sich schneller und einfacher ausführen lassen, numerisch anzugeben. Um eine ergonomische Gewichtung anzuwenden, geben Sie in der Methode solve ein Wörterbuch ergonomic_bias an. Jedem Zug (z. B. "U", "U'", "U2") wird eine Punktzahl zugewiesen, wobei höhere Punktzahlen ergonomischere Züge anzeigen.

ergonomic_bias = {
"U": 0.9, "U'": 0.9, "U2": 0.8,
"R": 0.8, "R'": 0.8, "R2": 0.75,
"L": 0.55, "L'": 0.4, "L2": 0.3,
"F": 0.7, "F'": 0.6, "F2": 0.6,
"D": 0.3, "D'": 0.3, "D2": 0.2,
"B": 0.05, "B'": 0.05, "B2": 0.01,
"u": 0.45, "u'": 0.45, "u2": 0.4,
"r": 0.3, "r'": 0.3, "r2": 0.25,
"l": 0.2, "l'": 0.2, "l2": 0.15,
"f": 0.35, "f'": 0.3, "f2": 0.25,
"d": 0.15, "d'": 0.15, "d2": 0.1,
"b": 0.03, "b'": 0.03, "b2": 0.01
}

result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
ergonomic_bias=ergonomic_bias
)
print(result)
Ausgabe
{
'solutions': [
"u' U' f' R2 U2 R' L' F' R D2 f2 R2 U2 R U L' U R L",
"u' U' f' R2 U2 R' L' F' R D2 f2 R2 U2 R d F' U f F",
"u' U' f' R2 U2 R' L' F' R u2 F2 R2 D2 R u f' l u U"
],
'num_nodes': 1078054,
'time': 56.13087955299852
}

GPU-Beschleunigung

Wenn Sie eine GPU haben, empfehlen wir dringend, das größte Modell für die bestmögliche Leistung auszuwählen:

alphacube.load(model_id="large")
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
)
print(result)
Ausgabe
{
'solutions': ["D F L' F' U2 B2 U F' L R2 B2 U D' F2 U2 R D'"],
'num_nodes': 903448,
'time': 20.46845487099995
}

Ausführlicher Modus

Zusätzlich können Sie alphacube.set_verbose() aufrufen, um den Fortschritt zu verfolgen. Dadurch wird die aktuelle Suchtiefe in Ihrem Terminal angezeigt.

Modelle und Kompromisse

AlphaCube bietet die drei größten Modelle aus dem EfficientCube-Paper an: "small", "base" und "large".

Obwohl Sie aufgrund ihrer höheren Genauigkeit erwarten könnten, dass das "large"-Modell am besten abschneidet (und "base" besser), ist dies in der Praxis ohne GPU nicht der Fall.

Tatsächlich erweist sich das "small"-Modell ohne GPU als die optimale Wahl für eine CPU-Laufzeit. Der Grund dafür ist, dass CPUs von Natur aus viel Zeit für die Berechnung auf einem DNN aufwenden. Das "small"-Modell erweist sich als das zeiteffizienteste, um ein bestimmtes Maß an Optimalität zu erreichen.

Der Kompromiss zwischen Berechnungsaufwand und Lösungsqualität auf CPUs

Obwohl es bei der Vorhersage der nächsten Züge weniger genau ist als die größeren Modelle, verarbeitet das kleinere Modell einen Batch von Zuständen viel schneller. Wenn Sie keinen Zugriff auf GPUs haben, liefert die Wahl des "small"-Modells mit einer ausreichend großen Strahlbreite im Allgemeinen die besten Lösungen innerhalb desselben Zeitrahmens.

Andererseits weist das größte Modell ("large") bei Einsatz auf einer GPU die höchste zeitliche Effizienz auf, wie in der folgenden Abbildung dargestellt.

Der Kompromiss zwischen Berechnungsaufwand und Lösungsqualität auf einer GPU

CLI-Option

Wenn Sie es vorziehen, AlphaCube über die Befehlszeilenschnittstelle (CLI) zu verwenden, können Sie dies tun:

alphacube \
--model_id large \
--scramble "F U2 L2 B2 F U L2 U R2 D2 L' B L2 B' R2 U2" \
--beam_width 100000 \
--extra_depths 3 \
--verbose

Mit abgekürzten Flags,

alphacube \
-m large \
-s "F U2 L2 B2 F U L2 U R2 D2 L' B L2 B' R2 U2" \
-bw 100000 \
-ex 3 \
-v

Weitere Details finden Sie unter API-Referenz > CLI.

Hinweis: Bitte beachten Sie, dass die CLI-Option das Laden (und Entladen) des angegebenen Modells für jede Anfrage beinhaltet. Daher wäre diese CLI-Option am besten für die einmalige Ausführung des Pakets geeignet.