学習目標
- COMBATを使用したカスタムロボットインターフェースを実装する
- 多目的最適化を設定・実行する
- 制約とNIMOの高度な機能を理解する
- 継続学習のためのリソースを知る
5.1 COMBATによるカスタムロボット統合
NIMOのCOMBAT(Custom Robot)インターフェースにより、独自の実験システムを接続できます。これがNIMOを実際のハードウェアで使用するための鍵です。
COMBATアーキテクチャ
COMBATインターフェースはファイルベースの通信を通じて動作します:
- NIMOが選択された候補を含む
proposals.csvを書き込む - カスタムスクリプトが提案を読み取り、ロボットを制御
- 実験後、スクリプトが
robot_output.csvを書き込む - NIMOが結果を読み取り、最適化を更新
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)
競合する目的間の最良のトレードオフを表す解を見つけること。最適なトレードオフ解の集合はパレートフロントと呼ばれます。
多目的最適化の設定
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'))
パレートフロントの理解
高強度
低延性] 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 制約の処理
実際の材料設計では、しばしば制約があります:
- 組成の合計が100%でなければならない
- 特定の元素比率を維持する必要がある
- 物理的に不可能な組み合わせがある
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+ | ハイスループットスクリーニングシステム |
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 実世界での考慮事項
実験の失敗
実際の実験は時々失敗します。失敗は以下のように処理します:
- 失敗した実験を特別な値(例:-999)でマーク
- 失敗した点を最適化から除外
- 次のサイクルで失敗した実験を再実行
ノイズのある測定
実際の測定にはノイズがあります。PHYSBOのガウス過程は測定ノイズを自然に処理しますが、以下により結果を改善できます:
- 複製実験の実行
- 測定値の平均化
- 分析に測定の不確実性を含める
5.6 次のステップとリソース
公式リソース
- NIMO GitHubリポジトリ: ソースコードと例
- PHYSBOドキュメント: 詳細なベイズ最適化ガイド
- NIMSウェブサイト: 研究論文とケーススタディ
関連AI寺子屋シリーズ
- ベイズ最適化入門: コアアルゴリズムのより深い理解
- 能動学習入門: 高度な実験選択戦略
- ハイスループット計算: 計算ワークフローのスケールアップ
主要論文
- 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)
- Ueno, T., et al. "COMBO: An efficient Bayesian optimization library for materials science." Materials Discovery (2016)
演習
演習1: ロボットインターフェースの設計
以下の機能を持つ仮想ロボット用のCOMBATインターフェースを(紙または疑似コードで)設計してください:
- 3つの材料ターゲットを持つスパッタリングシステムを制御
- 堆積後の膜厚を測定
- 電気伝導率を測定
考慮事項:多目的最適化のために2つの測定値(厚さと伝導率)をどのように処理しますか?
演習2: 多目的トレードオフ
2つの目的を持つバッテリー電極材料を最適化しています:
- 目的1:エネルギー密度(最大化)
- 目的2:サイクル寿命(最大化)
PTR最適化を実行した後、以下のパレート最適解が得られました:
| 解 | エネルギー密度 | サイクル寿命 |
|---|---|---|
| A | 95 | 200 |
| B | 85 | 500 |
| C | 70 | 800 |
以下の用途にどの解を選びますか:(a) スマートフォンのバッテリー? (b) 電気自動車のバッテリー? 理由を説明してください。
まとめ
- COMBATインターフェースにより、ファイルベースの通信を通じてカスタムロボットを統合可能
- 多目的最適化はPTRでパレート最適なトレードオフ解を発見
- 制約は候補空間の事前フィルタリングで処理可能
- バッチ実験は学習効率と実験スループットのバランスを取る
- NIMOはPHYSBOや他のNIMSツールを含む大きなエコシステムの一部
おめでとうございます!
NIMO入門シリーズを完了しました!これで以下の知識を身につけました:
- 閉ループ材料最適化の理解
- NIMO最適化のセットアップと実行
- 問題に適したAIアルゴリズムの選択
- 最適化結果の可視化と分析
- 実世界のアプリケーション向けのNIMO拡張
自分の材料問題でNIMOの実験を始めてください。ニーズが増えるにつれて、高度な機能を探求することをためらわないでください!