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

ルービックキューブ環境

このモジュールは、ハーフターンメトリック(HTM)における3x3x3ルービックキューブを表すCube3クラスを定義します。

クラス: Cube3: ハーフターンメトリックにおける3x3x3ルービックキューブのクラス。

Cube3

class Cube3()

ハーフターンメトリック(HTM)における3x3x3ルービックキューブのクラス。

このクラスは、ハーフターンメトリックを使用して3x3x3ルービックキューブを操作および解決するためのメソッドを提供します。 キューブの初期状態と目標状態、利用可能な手数、およびキューブ操作のためのメソッドを定義します。

表現:

面の順序:

   0
2 5 3 4
1

各面のステッカーの順序:

  2   5   8
1 4 7
[0] 3 6

状態のインデックス(それぞれ 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

(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

属性:

  • state ndarray - ステッカーの色配列として表現される現在のキューブの状態。
  • GOAL ndarray - ステッカーの色配列として表現される固定の目標状態。
  • moves list - 可能なキューブの手順(面と方向)のリスト。
  • allow_wide bool - ワイドムーブ(2層回し)が許可されているかを示すフラグ。
  • max_depth int - データジェネレータの最大スクランブル手数。
  • sticker_target dict - 手順文字列をターゲットステッカーのインデックスリストにマッピングする辞書。
  • sticker_source dict - 手順文字列をソースステッカーのインデックスリストにマッピングする辞書。
  • sticker_target_ix ndarray - 通常の手順のインデックスをターゲットステッカーのインデックスにマッピングする2D numpy配列。
  • sticker_source_ix ndarray - 通常の手順のインデックスをソースステッカーのインデックスにマッピングする2D numpy配列。
  • sticker_target_ix_wide ndarray - ワイドムーブのインデックスをターゲットステッカーのインデックスにマッピングする2D numpy配列。
  • sticker_source_ix_wide ndarray - ワイドムーブのインデックスをソースステッカーのインデックスにマッピングする2D numpy配列。

show

def show(
flat=False,
palette=["white", "yellow", "orange1", "red", "blue", "green"]
)

キューブの現在の状態を表示します。

引数:

  • flat bool - 状態を展開図形式で表示するかどうか。
  • palette list - ステッカーを表現するための色のリスト。

validate

def validate(
state=None,
centered=True
)

キューブの状態と配置を検証します。

引数:

  • centered bool - センターパーツが正しい位置にあるべきかどうか。

例外:

  • ValueError - キューブの状態または配置が無効な場合。

reset

def reset()

キューブの状態を完成状態にリセットします。

reset_axes

def reset_axes()

与えられたセンターの色に従って色のインデックスをリセットします。 ファットムーブ(2層回し)が適用された場合や、予期しない視点が指定された場合に便利です。

is_solved

def is_solved()

キューブが完成状態にあるかどうかをチェックします。

finger

def finger(move)

手順文字列を使用して、キューブの状態に単一の手順を適用します。

引数:

  • move str - HTM記法の手順文字列。

finger_ix

def finger_ix(ix)

.fingerよりも高速に実行するために、インデックスを使用して単一の手順を適用します。 手順のインデックスが通常の手順(ix < 18)かワイドムーブに対応するかをチェックし、事前に計算されたインデックス配列を使用して状態変更を適用します。

引数:

  • ix int - 適用する手順のインデックス。

apply_scramble

def apply_scramble(scramble)

一連の手順(スクランブル)をキューブの状態に適用します。

引数:

  • scramble str or list - HTM記法の手順のシーケンス、またはリスト。

__iter__

def __iter__()

スクランブルされた状態と解法手順の無限ジェネレータを作成します。

このメソッドはモデルのトレーニングを目的としています。各イテレーションで、 max_depth手数の新しいランダムなスクランブルを生成し、自明な手順シーケンスを回避します。 状態の履歴と、各状態に至った対応する手順をyieldします。

Yields:

tuple[np.ndarray, np.ndarray]: 以下を含むタプル:

  • X (np.ndarray): キューブの状態の (max_depth, 54) 配列。
  • y (np.ndarray): 状態を生成した手順のインデックスの (max_depth,) 配列。

__vectorize_moves

def __vectorize_moves()

高速な計算のために、ステッカーグループの置換操作をベクトル化します。 このメソッドは、ステッカーの色を管理するために self.sticker_targetself.sticker_source を定義します(ターゲットがソースに置き換えられます)。 これらは、手順をベクトル化できるように、ターゲットとソースのステッカーのインデックスを定義します。

Dataset

class Dataset(torch.utils.data.Dataset)

ランダムなスクランブルを無限にyieldするための疑似データセットクラス。

使用例
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
)

ランダムなルービックキューブのスクランブルを生成するためのDataLoaderインスタンスを作成します。

引数:

  • batch_size int - バッチごとのサンプル数。
  • num_workers int, optional - データ読み込みに使用するワーカープロセスの数。 デフォルトはCPUコア数または32(それを超えると効果が減少します)のいずれか小さい方です。
  • max_depth int, optional - スクランブルの最大手数。デフォルトは20です。
  • **dl_kwargs - DataLoaderコンストラクタに渡す追加のキーワード引数。

戻り値:

  • torch.utils.data.DataLoader - ランダムなスクランブルのバッチをyieldするDataLoaderインスタンス。