🌐 JP | 🇬🇧 EN

第2章: NIMOのアーキテクチャ

モジュラー設計の理解

📖 読了時間: 20-25分 📊 難易度: 初級 💻 コード例: 5 📝 演習: 2

学習目標

2.1 3層アーキテクチャ

NIMOは、関心事を明確に分離した3つの主要レイヤーで設計されています。このモジュラーアプローチにより、研究者は様々なAIアルゴリズムと様々なロボットシステムを自由に組み合わせることができます。

graph TB subgraph Layer1[レイヤー1: AI最適化] AI1[PHYSBO
ベイズ最適化] AI2[BLOX
ランダムフォレスト] AI3[PDC
相図構築] AI4[RE
ランダム] AI5[... 他7種] end subgraph Layer2[レイヤー2: ロボットインターフェース] R1[STAN
標準] R2[NAREE
電気化学] R3[COMBAT
カスタム] end subgraph Layer3[レイヤー3: 可視化] V1[履歴プロット] V2[分布図] V3[相図] end Layer1 -->|CSV| Layer2 Layer2 -->|CSV| Layer1 Layer1 --> Layer3 Layer2 --> Layer3 style Layer1 fill:#667eea,color:#fff style Layer2 fill:#11998e,color:#fff style Layer3 fill:#f093fb,color:#fff

モジュラーアーキテクチャ(Modular Architecture)

システムを独立した交換可能なモジュールに分割するソフトウェア設計手法です。各モジュールは明確に定義されたインターフェースを持ち、他に影響を与えることなくコンポーネントを交換またはアップグレードできます。

レイヤー1: AI最適化モジュール

このレイヤーには、次の実験候補を選択するための11種類のアルゴリズムが含まれています:

アルゴリズム 正式名称 最適な用途
RE Random Exploration 初期データ収集
PHYSBO Bayesian Optimization 一般的な最適化(推奨)
BLOX Random Forest 高次元空間
PDC Phase Diagram Construction 多相材料
SLESA Single-Loop Efficient Selection 高速探索
PTR Pareto-based Thompson Ranking 多目的最適化
BOMP Bayesian Opt. Multi-Phase 複雑な相図
ES Evolutionary Strategy 大域的最適化
COMBI Combination Search 離散的組み合わせ
RSVM Ranking SVM 選好学習
WAM Weighted Average Model アンサンブル予測

レイヤー2: ロボットインターフェースモジュール

このレイヤーは、物理的なロボットシステムとの通信を担当します:

レイヤー3: 可視化モジュール

このレイヤーは、最適化の進捗を監視・分析するためのツールを提供します:

2.2 CSVベースのデータフロー

NIMOは、すべてのコンポーネント間のユニバーサルインターフェースとしてCSVファイルを使用します。この設計選択には次のような利点があります:

graph LR A[candidates.csv] -->|selection| B[proposals.csv] B -->|preparation_input| C[robot_input.csv] C -->|ロボット実行| D[robot_output.csv] D -->|analysis_output| E[updated_candidates.csv] E -->|次のサイクル| A style A fill:#f8f9fa style B fill:#667eea,color:#fff style C fill:#11998e,color:#fff style D fill:#f093fb,color:#fff style E fill:#28a745,color:#fff

CSVファイルの形式

NIMO内のすべてのCSVファイルは一貫した形式に従います:

例: candidates.csv
x1,x2,x3,objective
0.1,0.5,0.4,NaN
0.2,0.4,0.4,NaN
0.3,0.3,0.4,1.25
0.4,0.2,0.4,NaN
0.5,0.1,0.4,2.31

重要なポイント

  • 記述子列(x1, x2, x3): 探索空間を定義
  • 目的関数列: 最適化する値(NaN = 未テスト)
  • NaNの目的関数を持つ行は将来の実験候補
  • 値を持つ行はすでにテスト済み

2.3 コアワークフロー関数

NIMOは、完全な最適化ループを形成する4つの主要関数を提供します:

1. selection() - 次の実験を選択

この関数は、AIアルゴリズムを使用して、未テストのプールから最も有望な候補を選択します。

コード例1: selection()の使用
import nimo

# ベイズ最適化を使用して候補を選択
nimo.selection(
    method="PHYSBO",           # 使用するAIアルゴリズム
    input_file="candidates.csv",   # すべての候補を含むファイル
    output_file="proposals.csv",   # 選択された候補の出力
    num_objectives=1,          # 目的関数の数
    num_proposals=3            # 選択する候補の数
)

パラメータの説明:

2. preparation_input() - ロボット用に準備

この関数は、選択された提案をロボットシステムが必要とする形式に変換します。

コード例2: preparation_input()の使用
import nimo

# STANロボットインターフェース用に提案を準備
nimo.preparation_input(
    machine="STAN",            # ロボットシステムの種類
    input_file="proposals.csv",    # 選択された候補
    output_file="robot_input.csv"  # ロボット用フォーマット
)

3. analysis_output() - ロボット結果を処理

ロボットが実験を実行した後、この関数は結果をNIMO形式に戻します。

コード例3: analysis_output()の使用
import nimo

# ロボットからの結果を処理
nimo.analysis_output(
    machine="STAN",            # ロボットシステムの種類
    input_file="robot_output.csv", # 生のロボット結果
    output_file="results.csv"      # 処理された結果
)

4. history() - 進捗を追跡

この関数は、最適化履歴の記録を提供します。

コード例4: history()の使用
import nimo

# 最適化履歴を取得
history_data = nimo.history(
    input_file="candidates.csv",
    num_objectives=1
)

print("発見した最良値:", history_data['best_objective'])
print("実験回数:", history_data['num_experiments'])

2.4 完全なワークフロー例

典型的な最適化サイクルで、すべてのピースがどのように組み合わさるかを見てみましょう:

コード例5: 完全な最適化サイクル
import nimo
import pandas as pd

# 設定
NUM_CYCLES = 10
PROPOSALS_PER_CYCLE = 3

# 初期化: 探索空間を持つ候補ファイルを作成
candidates = pd.DataFrame({
    'x1': [i/10 for i in range(11)],
    'x2': [1 - i/10 for i in range(11)],
    'objective': [float('nan')] * 11
})
candidates.to_csv('candidates.csv', index=False)

# メイン最適化ループ
for cycle in range(NUM_CYCLES):
    print(f"\n=== サイクル {cycle + 1} ===")

    # ステップ1: 候補を選択
    if cycle == 0:
        # 最初のサイクル: ランダム選択を使用
        method = "RE"
    else:
        # 以降のサイクル: ベイズ最適化を使用
        method = "PHYSBO"

    nimo.selection(
        method=method,
        input_file="candidates.csv",
        output_file="proposals.csv",
        num_objectives=1,
        num_proposals=PROPOSALS_PER_CYCLE
    )

    # ステップ2: ロボット用に準備
    nimo.preparation_input(
        machine="STAN",
        input_file="proposals.csv",
        output_file="robot_input.csv"
    )

    # ステップ3: [ここでロボットが実験を実行]
    # シミュレーションでは、目的値を計算します
    # 実際の実験では、robot_output.csvはロボットが生成します

    # ステップ4: 結果を処理
    nimo.analysis_output(
        machine="STAN",
        input_file="robot_output.csv",
        output_file="results.csv"
    )

    # ステップ5: 新しい結果で候補ファイルを更新
    # (NIMOが内部で処理)

    print(f"{PROPOSALS_PER_CYCLE}件の実験が完了")

ワークフローのまとめ

  1. selection(): AIがテストする最良の候補を選択
  2. preparation_input(): ロボット用にデータをフォーマット
  3. [ロボット実行]: 物理的な実験が行われる
  4. analysis_output(): 結果をNIMO形式に戻す
  5. 繰り返し: 新しいデータを使ってより良い選択を行う

演習

演習1: データフローを追跡する

この初期candidates.csvが与えられた場合:

x1,x2,objective
0.2,0.8,NaN
0.5,0.5,1.5
0.8,0.2,NaN

NIMOのselection()が行0(x1=0.2, x2=0.8)を次の実験に選択した場合:

  1. proposals.csvはどのようになりますか?
  2. ロボットがこのサンプルでobjective=2.1を測定した後、更新されたcandidates.csvはどのようになりますか?

演習2: アーキテクチャのマッチング

各NIMOコンポーネントをその役割にマッチさせてください:

  1. PHYSBO
  2. STAN
  3. plot_history
  4. RE

役割: A) ロボットインターフェース、B) ベイズ最適化、C) ランダムサンプリング、D) 可視化

まとめ

免責事項

本コンテンツは教育目的で提供されています。NIMOはNIMSによって開発・保守されています。