ルービックキューブ環境
このモジュールは、ハーフターンメトリック(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_target
と self.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インスタンス。