Pythonの環境設定

Python を使うための環境を整備しておく必要があります。いろいろな環境があると思いますが、今回は macOS と Windows でそれぞれ一例を挙げておきます。

1. macOSの環境

ターミナルを使います。

ターミナルを起動し、コマンドを打ち込んでいきます。

まず、以下のコマンドを打ってみました。最初は Python 3.9.6 と表示されました。

1.1 パッケージマネージャー Homebrew のインストール

Version 3.9.6 は Gemini によるとシステムでも使っているので、仮想環境を作って最新のバージョンをインストールした方が良いとのことでした。それでまずインストールの準備としてパッケージマネージャー Homebrew をインストールしました。途中パスワードを聞いてくるので、macOSへログインするときのパスワードを入力しました。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

1.2 Python のインストール

Homebrew がインストールできたら、以下のように Python をインストールします。

インストール後、バージョンを確認します。今度は Python 3.14.2 と表示されました。

Mac mini での実行結果

1.3 フォルダと仮想環境の作成

Python がインストールできたらプログラムを置くフォルダを作成し、そのフォルダ内に仮想環境を作成します。仮想環境を作ることで安全に Python プログラムの開発ができます。

1.4 プログラムの作成と実行

今回は note の記事「Pythonで1✕1キューブの持ち替えグラフ」で最終的に作成したプログラム:

# 1x1キューブの状態遷移グラフの作成
# Version 0.1.2
# Copyright © 2025 Nonki Takahashi.  The MIT License.

import networkx as nx
import matplotlib.pyplot as plt

# --- 1. 定義 ---

# 標準的なルービックキューブの配色と反対色の定義
# U(白) vs D(黄), F(赤) vs B(橙), R(青) vs L(緑)
OPPOSITES = {
    'W': 'Y', 'Y': 'W',  # White vs Yellow
    'G': 'B', 'B': 'G',  # Green vs Blue
    'R': 'O', 'O': 'R'   # Red vs Orange
}

def get_opposite_color(color):
    """指定された色と反対の色を返す"""
    return OPPOSITES.get(color, None)

# U面とF面に対応するR面を定義
def get_r_color(u_color, f_color):
    """U面とF面の色からR面の色を決定する"""
    corners = ['WRB', 'WBO', 'WOG', 'WGR', 'YRG', 'YGO', 'YOB', 'YBR']
    for corner in corners:
        u_pos = corner.find(u_color)
        f_pos = corner.find(f_color)
        f_minus_u = f_pos - u_pos
        if u_pos >= 0 and f_pos >= 0 and f_minus_u in [1, -2]:
            r_pos = f_pos + 1
            if (r_pos > 2):
                r_pos = 0
            return corner[r_pos]

# 標準的な隣接関係の定義 (F=赤, U=白 を基準)
# どの面が隣接しているか、そして特定の操作でどのように回転するかを定義
# (Front, Up) の状態に操作を適用した後の新しい (Front, Up) を返す関数

def apply_operation(state_str, operation):
    """
    現在の状態 (FU形式: 例 'GW') と操作 ('R', 'U', 'F') から、新しい状態を計算する。
    state_str = F + U (例: 'RW' -> Front=Red, Up=White)
    """
    F, U = state_str[0], state_str[1]
    B = get_opposite_color(F)
    D = get_opposite_color(U)
    R = get_r_color(F, U)
    L = get_opposite_color(R)
    
    # 抽象的な色の定義 (W, Y, R, O, B, G) を具体的な軸回転に対応させる

    # U操作 (Y軸周り90度): F -> R, R -> B, B -> L, L -> F
    if operation == 'U':
        return f'{L}{U}'
    
    # R操作 (X軸周り90度): U -> B, B -> D, D -> F, F -> U
    elif operation == 'R':
        return f'{D}{F}'

    # F操作 (Z軸周り90度): U -> R, R -> D, D -> L, L -> U
    elif operation == 'F':
        return f'{F}{L}'
    
    return None 

# --- 2. グラフ構築 ---

G = nx.DiGraph() 
all_colors = ['W', 'Y', 'R', 'O', 'B', 'G']
nodes = []

# 24通りの状態(ノード)の生成
for F in all_colors:
    for U in all_colors:
        if (U != F) and (U != get_opposite_color(F)):
            nodes.append(f'{F}{U}') 

G.add_nodes_from(nodes)

# すべてのエッジ(操作)の追加ロジック
operations = ['U', 'R', 'F'] # U, R, F 操作を定義

# 24個のノードから始まるエッジをすべて追加
for start_node in nodes:
    for op in operations:
        end_node = apply_operation(start_node, op)
        if end_node:
            G.add_edge(start_node, end_node, operation=op)

# --- 3. シェルレイアウト用のノードグループ化 ---

# 3つのシェルを定義。各シェルはU面(上面)の色でグループ化される。
# 例: 'W'シェルは上面が白と黄の8つの状態を含む。
shells = []
for U_color in all_colors:
    shell = [node for node in G.nodes() if (node[1] == U_color) or (node[1] == get_opposite_color(U_color))]
    # ノードが8つ存在することを確認
    if len(shell) == 8:
        shells.append(shell)
    # 24通りの状態が生成できていれば、shellsには3つのリスト(各8ノード)が入る。

# --- 4. グラフの可視化(レイアウトの変更) ---

# スプリングレイアウトはノードを分散させ、クラスターを見つけやすくする
# グラフの構築部分(24ノードの生成)はそのまま使用

plt.figure(figsize=(12, 12))

# shell_layoutを使用し、ノードを3つの同心円状の層に配置
pos = nx.shell_layout(G, nlist=shells)

# ノードの描画 (ここではU面の色でノードを着色)
node_color_map = {'W': 'white', 'Y': 'yellow', 'R': 'red', 'O': 'orange', 'G': 'lime', 'B': 'cyan'}
node_colors = [node_color_map[node[1]] for node in G.nodes()]

nx.draw_networkx_nodes(G, pos, node_size=800, node_color=node_colors, edgecolors='black')

# エッジの描画 (操作ごとに色を変える)
# U操作 (白), R操作 (青), F操作 (赤)
edge_colors = []
for u, v, data in G.edges(data=True):
    op = data.get('operation')
    if op == 'U':
        edge_colors.append('lightgray')
    elif op == 'R':
        edge_colors.append('blue')
    elif op == 'F':
        edge_colors.append('red')
    else:
        edge_colors.append('gray')

nx.draw_networkx_edges(G, pos, edge_color=edge_colors, arrows=True, width=1.5)
nx.draw_networkx_labels(G, pos, font_size=8, font_color='black')

plt.title("1x1 Cube Transformation Graph (Partial D4 Structure for U-face)")
plt.axis('off')
plt.show()

をコピーして以下のように rubik-graph.py として保存し、実行しました。

実行結果は以下のとおりです。

2. Windows の環境

PowerShell 7 (x64) を使います。

以下は PowerShell 7 (x64) のサンプル画面です。PowerShell の最新版があると、冒頭で教えてくれます。気になる方は最新版をインストールしてみてください。

PowerShell 7 (x64)

2.1 Python のインストール

Windows の場合はパッケージマネージャーは使いません。Python を公式サイトからインストールします。

2.2 フォルダと仮想環境の作成

プログラム用のフォルダを作成し、そこに仮想環境を作成します。

2.3 プログラムの作成と実行

プログラムを macOS のときと同様にクリップボードからファイルに保存し、実行します。

実行結果は以下の通りです。

Windows での実行結果

関連項目

コメントを残す