🌐 JP | 🇬🇧 EN

第5章: 応用と発展

実世界のアプリケーションへのNIMO拡張

📖 読了時間: 15-20分 📊 難易度: 中級 💻 コード例: 4 📝 演習: 2

学習目標

5.1 COMBATによるカスタムロボット統合

NIMOのCOMBAT(Custom Robot)インターフェースにより、独自の実験システムを接続できます。これがNIMOを実際のハードウェアで使用するための鍵です。

COMBATアーキテクチャ

graph LR A[NIMOコア] -->|proposals.csv| B[COMBATインターフェース] B -->|カスタムフォーマット| C[あなたのロボット] C -->|結果| D[COMBATインターフェース] D -->|results.csv| A style A fill:#667eea,color:#fff style B fill:#f093fb,color:#fff style C fill:#11998e,color:#fff

COMBATインターフェースはファイルベースの通信を通じて動作します:

  1. NIMOが選択された候補を含むproposals.csvを書き込む
  2. カスタムスクリプトが提案を読み取り、ロボットを制御
  3. 実験後、スクリプトがrobot_output.csvを書き込む
  4. NIMOが結果を読み取り、最適化を更新
コード例1: カスタムロボットインターフェース
import nimo
import pandas as pd
import time

class CustomRobotInterface:
    """
    ロボットをNIMOに接続するためのテンプレート。
    execute_experimentメソッドを実際のロボット制御に置き換えてください。
    """

    def __init__(self, robot_connection):
        self.robot = robot_connection

    def execute_experiment(self, x1, x2, x3):
        """
        ロボットで単一の実験を実行。
        これを実際のロボット制御コードに置き換えてください。

        Returns:
            float: 測定された目的値
        """
        # 例: ロボットにコマンドを送信
        # self.robot.set_composition(x1, x2, x3)
        # self.robot.start_synthesis()
        # time.sleep(3600)  # 合成を待つ
        # result = self.robot.measure_property()

        # デモンストレーション用にプレースホルダーを返す
        result = x1 * x2 + x3
        return result

    def run_experiments(self, proposals_file, output_file):
        """提案されたすべての実験を実行"""
        proposals = pd.read_csv(proposals_file)
        results = []

        for idx, row in proposals.iterrows():
            print(f"実験 {idx + 1}/{len(proposals)} を実行中")
            value = self.execute_experiment(row['x1'], row['x2'], row['x3'])
            results.append({
                'x1': row['x1'],
                'x2': row['x2'],
                'x3': row['x3'],
                'objective': value
            })

        pd.DataFrame(results).to_csv(output_file, index=False)
        print(f"結果を{output_file}に保存しました")

# NIMOとの使用
def run_with_custom_robot(robot_connection, num_cycles=10):
    robot = CustomRobotInterface(robot_connection)

    for cycle in range(num_cycles):
        # ステップ1: AIが候補を選択
        method = "RE" if cycle == 0 else "PHYSBO"
        nimo.selection(
            method=method,
            input_file="candidates.csv",
            output_file="proposals.csv",
            num_objectives=1,
            num_proposals=3
        )

        # ステップ2: ロボットが実験を実行
        robot.run_experiments("proposals.csv", "robot_output.csv")

        # ステップ3: 結果をNIMOに戻す
        nimo.analysis_output(
            machine="COMBAT",
            input_file="robot_output.csv",
            output_file="results.csv"
        )

        # ステップ4: 候補を更新(COMBATの場合は手動マージ)
        update_candidates_from_results("candidates.csv", "results.csv")

5.2 多目的最適化

実際の材料では、複数の特性を同時に最適化する必要があることがよくあります。例えば、強度と延性の両方を最大化したい場合があります。

多目的最適化(Multi-Objective Optimization)

競合する目的間の最良のトレードオフを表す解を見つけること。最適なトレードオフ解の集合はパレートフロントと呼ばれます。

多目的最適化の設定

コード例2: 多目的設定
import nimo
import pandas as pd
import numpy as np

# 2つの目的列を持つ候補を作成
candidates_data = {
    'x1': np.linspace(0, 1, 11),
    'x2': np.linspace(0, 1, 11),
    'objective1': [np.nan] * 11,  # 例:強度
    'objective2': [np.nan] * 11   # 例:延性
}
df = pd.DataFrame(candidates_data)
df.to_csv('multi_candidates.csv', index=False)

# PTRによる多目的選択
nimo.selection(
    method="PTR",           # パレートベースのトンプソンランキング
    input_file="multi_candidates.csv",
    output_file="proposals.csv",
    num_objectives=2,       # 2つの目的!
    num_proposals=3
)

print("多目的最適化で選択された候補:")
print(pd.read_csv('proposals.csv'))

パレートフロントの理解

graph LR subgraph Pareto[パレートフロント] P1[解A
高強度
低延性] P2[解B
バランス型] P3[解C
低強度
高延性] end P1 --- P2 P2 --- P3 style P1 fill:#667eea,color:#fff style P2 fill:#11998e,color:#fff style P3 fill:#f093fb,color:#fff

多目的最適化は、パレートフロント上の複数の解を返します。その後、どのトレードオフがニーズに最も合っているかは、あなた(または専門家)が選択します。

5.3 制約の処理

実際の材料設計では、しばしば制約があります:

コード例3: 組成制約の処理
import numpy as np
import pandas as pd

def generate_ternary_candidates(num_points=100):
    """
    x1 + x2 + x3 = 1 となる有効な三元組成を生成。
    シンプレックスサンプリングアプローチを使用。
    """
    candidates = []

    # 三元組成のためのグリッドベースアプローチ
    steps = int(np.sqrt(num_points))
    for i in range(steps + 1):
        for j in range(steps + 1 - i):
            x1 = i / steps
            x2 = j / steps
            x3 = 1 - x1 - x2  # 合計 = 1 を確保

            if x3 >= 0:  # 有効な組成
                candidates.append({
                    'x1': x1,
                    'x2': x2,
                    'x3': x3,
                    'objective': np.nan
                })

    return pd.DataFrame(candidates)

# 有効な候補を生成
candidates = generate_ternary_candidates(100)
print(f"{len(candidates)}個の有効な三元組成を生成しました")
print(f"合計チェック: {candidates[['x1', 'x2', 'x3']].sum(axis=1).unique()}")
candidates.to_csv('ternary_candidates.csv', index=False)

5.4 バッチ vs 逐次実験

NIMOは異なる実験戦略をサポートしています:

戦略 num_proposals 使用場面
逐次 1 次の前に各実験から学習
バッチ 3-10 並列実験を実行、より速いスループット
大規模バッチ 10+ ハイスループットスクリーニングシステム
コード例4: バッチサイズ設定
import nimo

# 逐次:実験ごとの学習を最大化
nimo.selection(
    method="PHYSBO",
    input_file="candidates.csv",
    output_file="proposals.csv",
    num_objectives=1,
    num_proposals=1  # 一度に1つ
)

# バッチ:学習とスループットのバランス
nimo.selection(
    method="PHYSBO",
    input_file="candidates.csv",
    output_file="proposals.csv",
    num_objectives=1,
    num_proposals=5  # 並列実験
)

# 大規模バッチ:ハイスループットシステム向け
nimo.selection(
    method="PHYSBO",
    input_file="candidates.csv",
    output_file="proposals.csv",
    num_objectives=1,
    num_proposals=20,  # 多くの並列実験
    physbo_score="TS"  # バッチの多様性のためにトンプソンサンプリング
)

バッチサイズのヒント

バッチ実験を実行する場合、獲得関数としてトンプソンサンプリング(TS)を使用してください。同じバッチ内での冗長な実験を避け、自然に多様な候補を提供します。

5.5 実世界での考慮事項

実験の失敗

実際の実験は時々失敗します。失敗は以下のように処理します:

ノイズのある測定

実際の測定にはノイズがあります。PHYSBOのガウス過程は測定ノイズを自然に処理しますが、以下により結果を改善できます:

5.6 次のステップとリソース

公式リソース

関連AI寺子屋シリーズ

主要論文

  1. Tamura, R., et al. "NIMS-OS: An automation software to implement a closed loop between artificial intelligence and robotic experiments in materials science." Science and Technology of Advanced Materials: Methods (2023)
  2. Ueno, T., et al. "COMBO: An efficient Bayesian optimization library for materials science." Materials Discovery (2016)

演習

演習1: ロボットインターフェースの設計

以下の機能を持つ仮想ロボット用のCOMBATインターフェースを(紙または疑似コードで)設計してください:

  1. 3つの材料ターゲットを持つスパッタリングシステムを制御
  2. 堆積後の膜厚を測定
  3. 電気伝導率を測定

考慮事項:多目的最適化のために2つの測定値(厚さと伝導率)をどのように処理しますか?

演習2: 多目的トレードオフ

2つの目的を持つバッテリー電極材料を最適化しています:

  • 目的1:エネルギー密度(最大化)
  • 目的2:サイクル寿命(最大化)

PTR最適化を実行した後、以下のパレート最適解が得られました:

エネルギー密度サイクル寿命
A95200
B85500
C70800

以下の用途にどの解を選びますか:(a) スマートフォンのバッテリー? (b) 電気自動車のバッテリー? 理由を説明してください。

まとめ

おめでとうございます!

NIMO入門シリーズを完了しました!これで以下の知識を身につけました:

自分の材料問題でNIMOの実験を始めてください。ニーズが増えるにつれて、高度な機能を探求することをためらわないでください!

免責事項

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