メインコンテンツまでスキップ

はじめる

インストール

AlphaCubeをインストールするには、ターミナルを開いて以下のコマンドを実行します:

pip install alphacube

使い方

基本

Pythonでの AlphaCube の使用は、次のように簡単です:

import alphacube

# 学習済みのDNNを読み込む
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=1024,
)
print(result)
出力
{
'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
}

品質の向上

より短い解法が必要な場合は、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)
出力
{
'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
}

少し長めの手順を許容する

最短の手順だけでなく、少し冗長な手順も得たい場合があります。そうすることで、優れた手順を見落とすリスクを減らすことができます。

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)
出力
{
'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
}

エルゴノミックバイアスの適用

エルゴノミックバイアスを使用すると、実行が速く簡単な特定の動作の望ましさを数値で指定できます。エルゴノミックバイアスを適用するには、solveメソッドで ergonomic_bias 辞書を指定します。各動作(例:"U"、"U'"、"U2")にスコアが割り当てられ、スコアが高いほどエルゴノミックな動作を示します。

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)
出力
{
'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アクセラレーション

GPUをお持ちの場合は、最高のパフォーマンスを得るために最大のモデルを選択することを強くお勧めします:

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)
出力
{
'solutions': ["D F L' F' U2 B2 U F' L R2 B2 U D' F2 U2 R D'"],
'num_nodes': 903448,
'time': 20.46845487099995
}

詳細モード

さらに、alphacube.set_verbose() を呼び出して進行状況を追跡することもできます。ターミナルに現在の探索の深さが表示されます。

モデルとトレードオフ

AlphaCubeは、EfficientCubeの論文から 3つの最大モデル を提供しています:"small""base""large"

"large" モデルは精度が高いため最高のパフォーマンスを期待できますが("base" も同様)、GPUがない場合は実際にはそうではありません。

実際、GPUがない場合、"small" モデルがCPUランタイムに最適な選択肢となります。これは、CPUが本質的にDNNの計算に多くの時間を費やすためです。"small" モデルは、ある最適性レベルを達成するのに最も時間効率が良いことが証明されています。

CPUでの計算量と解の品質のトレードオフ

次の手を予測する精度は大きなモデルほど高くありませんが、小さなモデルは状態のバッチをはるかに高速に処理します。したがって、GPUがない場合は、十分に広いビーム幅で「small」モデルを選択すると、通常、同じ時間枠内で最良の解が得られます。

一方、下図に示すように、最大のモデル("large")は、GPUにデプロイされたときに最も高い時間効率を示します。

GPUでの計算量と解の品質のトレードオフ

CLIオプション

コマンドラインインターフェイス(CLI)からAlphaCubeを使用したい場合は、次のようにできます:

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

省略されたフラグを使用すると、

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

詳細については、APIリファレンス > CLI をご覧ください。

注意: CLIオプションでは、リクエストごとに指定されたモデルの読み込み(およびアンロード)が行われることに注意してください。したがって、このCLIオプションは、パッケージを1回実行する場合に最適です。