> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 最適化の実行

> セル、パラメータ、目的関数、制約、アルゴリズムを設定し、Ionworks Studio で最適化を実行・確認するための手順を解説します

# 最適化の実行

このガイドでは、Ionworks Studio で最適化を実行するための完全なワークフローを説明します。

## 前提条件

最適化を開始する前に、以下を確認してください:

* バッテリーの[セル仕様](/ja/core-concepts/cells)が定義されていること
* そのセルに対する[パラメータ化されたモデル](/ja/build/parameterized-models)が作成されていること
* 最適化したい内容が明確であること

## ステップ 1: 最適化に名前を付ける（オプション）

最適化リストから識別できるように、最適化に説明的な名前を付けるか、名前を空白のままにして自動生成させることができます。

1. プロジェクトの **Optimizations** ページに移動します
2. **New Optimization** をクリックしてテンプレートを選択します。組み込みのシステムテンプレート（Design または Charge）または作成した[プロジェクトテンプレート](/ja/optimize/templates#template-types)から選択できます。
3. オプションで最適化の**名前**を入力します（例: "Fast charge protocol v2" や "Electrode thickness sweep"）

名前を空白のままにすると、Ionworks がユニークな名前を自動生成します（例: "Optimization a1b2c3d4"）。最適化の詳細ページからいつでも名前を変更できます。

<Tip>
  実行の目標や設定を説明する名前を選びましょう。プロジェクト内に
  複数の最適化がある場合、結果の比較が容易になります。
</Tip>

## ステップ 2: セルとモデルを選択する

最適化に使用するセル仕様とパラメータ化されたモデルを選択します。

### セル仕様

**Cell & Model** セクションで、ドロップダウンからセルを選択します。セル仕様は以下を提供します:

* 公称容量（C-rate を電流に変換するために使用）
* 電圧制限（実験のデフォルト値として使用）
* 化学情報

### パラメータ化されたモデル

次に、最適化中のシミュレーションに使用するパラメータ化されたモデルを選択します。

1. ドロップダウンからモデルを選択します
2. 選択したセルと互換性のあるモデルのみが表示されます
3. モデルのパラメータ値が最適化のベースラインとなります

<Info>
  パラメータ化されたモデルは、すべてのパラメータの開始点を提供します。
  最適化中は、明示的に最適化に追加したパラメータのみが変動し、
  その他はモデルの値のまま維持されます。
</Info>

## ステップ 3: 目的関数を設定する

目的関数は達成したい目標を定義します。各目的関数には実験、ゴール、およびオプションの制約条件が含まれます。

### 目的関数を追加する

1. **Add Objective** をクリックして新しい目的関数を作成します
2. 説明的な名前を付けます（例: "charge\_time", "energy\_density"）

### 実験を定義する

実験は実行するシミュレーションプロトコルを指定します。[UCP 形式](/ja/simulate/universal-cycler-protocol)で入力します:

```yaml theme={null}
- CC Charge:
    - Charge:
        mode: Current
        value: Input["I_charge"]
        ends:
          - "Voltage > 4.2"
- CV Hold:
    - Charge:
        mode: Voltage
        value: 4.2
        ends:
          - "C-rate < 0.05"
```

最適化したいパラメータを参照するには `Input["parameter_name"]` 構文を使用します。

<Info>
  UCP 実験の [`global` 設定](/ja/simulate/universal-cycler-protocol#global-configuration)に
  `initial_temperature` が含まれている場合、オプティマイザはシミュレーションの
  初期温度と環境温度をその値に自動的に設定します（摂氏からケルビンに変換）。
  同様に、`initial_state_type` と `initial_state_value` は初期充電状態または
  電圧の設定に使用されます。これらを別個のパラメータとして追加する必要は
  ありません。
</Info>

### カスタム変数を追加する（オプション）

派生量に基づいて最適化する必要がある場合:

1. Custom Variables セクションで **Add Variable** をクリックします
2. **Variable Name** を入力します（例: "Anode Potential"）
3. **PyBaMM Expression** を入力します（例: `pybamm.CoupledVariable("Negative electrode surface potential difference [V]")`）
4. フィールドからフォーカスを外すと式が検証されます

カスタム変数は、ゴールや制約条件の変数ドロップダウンで利用可能になります。

### ゴールを追加する

ゴールは最大化または最小化する対象を定義します:

1. **Add Goal** をクリックします
2. ゴールを設定します:
   * **Name**: 説明的な名前（例: "minimize\_time"）
   * **Weight**: 相対的な重要度（デフォルト: 1.0）
   * **Action**: "Maximize" または "Minimize"
   * **Variable**: 最適化する出力変数
   * **Metric Type**: 値の抽出方法（以下を参照）
   * **Value**（交差メトリクスの場合）: 交差点

**Metric Type のオプション:**

| タイプ        | ユースケース           | 値フィールド                    |
| ---------- | ---------------- | ------------------------- |
| Maximum    | ピーク値（例: 最高温度）    | 不要                        |
| Minimum    | 最低値（例: 最小アノード電位） | 不要                        |
| Mean       | 平均値              | 不要                        |
| Sum        | 累積合計             | 不要                        |
| PointBased | 単一ポイントの値         | 不要                        |
| Time       | 特定の時間での値         | 秒単位の時間、または時間のリスト（終了時は -1） |
| SOC        | 特定の SOC での値      | 分数としての SOC（0-1）           |
| Voltage    | 特定の電圧での値         | V 単位の電圧                   |

<Note>
  `Time` メトリクスに時間のリストを渡す（ベクトル形式）ことは、サイクル単位やステップ単位の
  サブソリューションをスライスする必要がない、連続的で実験を伴わないソルブでのみサポートされます。
  `DesignObjective` 内では未サポートです。単一の時間値を使用するか、メトリクスを反復
  （サイクル単位 / ステップ単位）メトリクスでラップして対象セグメントを指定してください。
</Note>

### 実験ステップに対するバリデーション

各目的関数には **Validate against experiment steps** トグル（デフォルトで有効）があります。有効な場合、オプティマイザはシミュレーションが実験プロトコルで定義されたすべてのステップを完了したかどうかを確認します。ステップがスキップされたり到達しなかった場合、評価にペナルティが課されます。

最適化によってシミュレーションがすべてのステップを完了する前に終了する可能性がある場合は、このトグルを無効にしてください。例えば、オプティマイザが早期カットオフ条件をトリガーする積極的なパラメータの組み合わせを探索している場合などです。このような場合でも、オプティマイザは不完全な実験に対するペナルティなしに、部分的なシミュレーションから有用な情報を抽出できます。

### 制約条件を追加する

制約条件は遵守すべき制限を定義します:

1. **Add Constraint** をクリックします
2. 制約条件を設定します:
   * **Name**: 説明的な名前（例: "no\_plating"）
   * **Penalty**: 違反に対する重み（デフォルト: 1e6）
   * **Action**: "GreaterThan" または "LessThan"
   * **Constraint Value**: しきい値
   * **Variable**: 制約する出力変数
   * **Metric Type**: 値の抽出方法

**例: リチウム析出の防止**

```
Name: anode_potential_constraint
Action: GreaterThan
Constraint Value: 0
Variable: Negative electrode surface potential difference [V]
Metric Type: Minimum
```

これにより、シミュレーション全体を通じて最小アノード電位が 0V を超えることが保証されます。

## ステップ 4: パラメータを設定する

パラメータはオプティマイザが調整できる値を定義します。

### パラメータを追加する

1. **Add Parameter** をクリックします
2. ドロップダウンからパラメータを選択します（カテゴリ別にグループ化）
3. **Initial Value**（初期値）を設定します（デフォルトではモデルの値）
4. **Lower Bound**（下限値）を設定します
5. **Upper Bound**（上限値）を設定します

<Note>
  実験内で `Input["parameter_name"]` として参照されるパラメータは、
  自動的に "Experiment Inputs" グループに表示されます。モデルパラメータは
  それぞれのグループ（Cell、Anode、Cathode など）に表示されます。
</Note>

### パラメータのバリデーション

最適化の実行前に、Ionworks は追加したすべてのパラメータが少なくとも 1 つの目的関数で実際に使用されていることを検証します。

**有効なパラメータの使用には以下が含まれます:**

* 直接的なモデルパラメータ（例: `Positive electrode thickness [m]`）
* `Input["parameter_name"]` を介して実験ステップで参照されるパラメータ
* 式を通じてモデルパラメータにリンクされたパラメータ
* 制約条件やペナルティの式で使用されるパラメータ
* 初期充電状態パラメータ（例: `Initial SOC [%]`, `Initial voltage [V]`）
* UCP の `global` 設定からの温度パラメータ（例: `Initial temperature [K]`, `Ambient temperature [K]`）

**バリデーションが失敗した場合**、以下を一覧表示するエラーが表示されます:

* 未使用のパラメータ
* モデルが実際に使用しているパラメータ
* 類似のパラメータ名の候補（タイプミスの場合）

**エラーの例:**

```
The following fit parameters are not used by any objective's model
and are not referenced by any expression that maps to a model
parameter: ['Electrolyte viscosity']. The model uses these parameters:
['Positive electrode thickness [m]', ...]. Remove the unused parameters
or add expressions that link them to model parameters.
```

<Tip>
  モデルに直接含まれていないパラメータが必要な場合は、式を介してリンク
  できます。例えば、`scale_factor` パラメータを定義し、
  `"Positive electrode thickness [m]": 100e-6 * scale_factor` のような式で使用します。
</Tip>

### パラメータの範囲

範囲は以下の条件を満たすように選択してください:

* 物理的に現実的であること
* 製造能力の範囲内であること
* 有意義な最適化を可能にする十分な広さがあること
* 非物理的な解を避けるのに十分な狭さであること

## ステップ 5: アルゴリズムを設定する

問題に合わせて最適化アルゴリズムを微調整します:

### オプティマイザ

最適化アルゴリズムを選択します。デフォルトは **Differential Evolution** で、ハイパーパラメータのチューニングなしに信頼性の高い解を見つけるグローバルオプティマイザです。

* **Differential Evolution**（デフォルト） — 適応的な変異と交叉を使用して探索空間を探索する集団ベースのグローバルオプティマイザ。ノイズの多い問題や多峰性の問題に堅牢。内部でグローバル探索を行うため、デフォルトは 1 マルチスタート。
* **XNES / CMA-ES** — 異なる問題構造に適した集団ベースの進化戦略。より広い範囲をカバーするために複数のマルチスタート（デフォルト: 4）を使用。
* **PSO** — 群知能による広範な探索を行うパーティクルスウォームオプティマイザ。デフォルトは 1 マルチスタート。
* **Nelder-Mead** — 勾配フリーのシンプレックス法。高速だが局所最適解に収束する可能性があるため、複数のマルチスタート（デフォルト: 4）を推奨。
* **Bayesian Optimization** — 高コストなシミュレーション向けのガウス過程サロゲートオプティマイザ。パラメータが約 10 個以下で評価予算が限られている問題に対してサンプル効率が高い。デフォルトでは 1 ラウンドあたり 1 候補を提案。
* **TuRBO** — 並列実行される高コストな問題向けの信頼領域ベイズ最適化。各ラウンドで候補のバッチを選択し、観測された改善に基づいて信頼領域を縮小または拡張する。多数のワーカーが利用可能で、パラメータが約 10 個を超える問題でうまく機能する。
* **SOBER** — 求積スタイルの再結合により多様な候補を選択するバッチベイズ最適化。広いバッチが必要な場合に使用。純粋に最良コストを目指す最適化では、TuRBO または Bayesian Optimization を優先してください。

比較表については[最適化の概要](/ja/optimize/overview#optimizer-selection)、各アルゴリズムの選び方の詳細については[設計最適化ガイド](/ja/guide/optimize/design-optimization#choosing-an-optimizer)を参照してください。

<Note>
  サロゲートオプティマイザ（Bayesian Optimization、TuRBO、SOBER）は Python パイプラインからも利用可能です。オプションの `surrogate` インストールエクストラ（`pip install "ionworkspipeline[surrogate]"`）が必要で、`torch`、`botorch`、`gpytorch` がインストールされます。Studio UI ではこれが自動的に処理されます。
</Note>

### 非同期評価モード

分散ワーカーが利用可能な場合、集団ベースのオプティマイザは自動的に**非同期評価モード**を使用します。このモードでは、オプティマイザは候補評価をワーカーに送信し、バッチ全体の完了を待つのではなく、結果が到着するとすぐに処理します。これにより、個々のシミュレーションの所要時間にばらつきがある場合のスループットが向上します。

手動での設定は不要です。インフラストラクチャがサポートしている場合、非同期モードは自動的に有効になります。詳細は[並列化](/ja/optimize/parallelization#非同期評価モード)を参照してください。

### 集団サイズ

集団ベースのオプティマイザである **Differential Evolution** と **PSO** では、デフォルトの集団サイズはフィットパラメータ数に応じてスケールし（DE は `15 × N`、PSO は `10 × N`）、**40 で上限が設定されます**。40 を超える値は、一般的なバッテリーフィットにおいて解の品質を大きく改善することはほとんどありませんが、1 世代あたりのシミュレーション数を線形に増加させ、その結果としてワーカーの需要と実行時間が増大します。

* 問題のパラメータ数が 3 以下の場合、デフォルト値は上限を下回り、そのまま使用されます。
* 問題のパラメータ数が多い場合、この上限により 1 世代がデフォルトで数百回の評価にまで膨れ上がることを防ぎます。
* 特定の問題でより大きな集団サイズが有利な場合は、集団サイズを明示的に上書きすることも可能です（例: Python パイプラインから `DEOptions(popsize=...)` または `PSOOptions(popsize=...)` で指定）。

この上限は*デフォルト*にのみ適用され、明示的に設定した値は変更されません。その他の集団ベースオプティマイザ（XNES、CMA-ES、SNES）はこの影響を受けません。

### マルチスタート数

独立した最適化実行の数を制御します。デフォルトはオプティマイザによって異なります。グローバルオプティマイザ（Differential Evolution、PSO）のデフォルトは 1、ローカルオプティマイザのデフォルトは 4 です。

| 値    | トレードオフ                |
| ---- | --------------------- |
| 1    | 最速; グローバルオプティマイザには十分  |
| 2-4  | ローカルオプティマイザに対して良いバランス |
| 8-16 | 高い信頼性、実行時間が長い         |
| 32   | 最大の信頼性、重要な最適化向け       |

**推奨:** Differential Evolution（デフォルト）の場合は 1 マルチスタートから始めてください。XNES や CMA-ES のようなローカルオプティマイザの場合は 4 から始めてください。実行間で結果に一貫性がない場合は増やしてください。

## ステップ 6: 最適化を実行する

1. **Form Data Preview** セクションで設定を確認します
2. **Create Optimization** をクリックします
3. 進捗を監視できる最適化の詳細ページにリダイレクトされます

### 最適化中

最適化の実行中は、以下を監視できます:

* **Status**: 現在のフェーズ（queued、running、succeeded、failed、または canceled）
* **Progress**: 実行中のマルチスタート
* **Iteration History**: 反復ごとのコスト関数値

### 最適化のフェーズ

最適化は次のステータス値からなる小さなライフサイクルを進みます:

1. **queued**: 計算リソースが利用可能になるのを待機中
2. **running**: マルチスタート最適化が実行され、結果がまとめられている
3. **succeeded**: 最終結果が利用可能
4. **failed**: 実行中にエラーが発生した
5. **canceled**: 終端状態に達する前にキャンセルされた

`succeeded`、`failed`、`canceled` は終端状態であり、最適化はそこから別の状態に遷移しません。これらは Python API が `result["status"]` で返すのと同じ値です。詳しくは [Python API ページ](/ja/optimize/api#getting-an-optimization)を参照してください。

## ステップ 7: 結果を確認する

完了したら、最適化結果を確認します:

### 最適パラメータ

テーブルには、各パラメータについて初期値/ベースライン値と比較した最適値が表示されます。

### パフォーマンス比較

以下の主要メトリクスを比較します:

* **Baseline**: 初期パラメータ値を使用した結果
* **Optimized**: 最適パラメータ値を使用した結果

### 反復履歴

収束プロットは、最適化中にコスト関数がどのように変化したかを示します。以下に注目してください:

* 段階的な減少（良好）
* 大きな正のジャンプ（制約違反）
* 長いフラットな領域（オプティマイザが収束した可能性が高い）

<Info>
  最適化アルゴリズムはコストを最小化するように実装されています。そのため、
  ゴールと制約条件は最適化ループとの統合時にこの規約に合わせて定式化
  されます。これにより、収束は常に最小化として表示されます。
</Info>

### 時系列プロット

ベースラインと最適化されたケースの間でシミュレーション出力（電圧、電流など）を比較し、最適化によってパフォーマンスがどのように改善されたかを理解します。

## 最適化のキャンセル

**Queued** または **Running** 状態の最適化はキャンセルできます。

### 詳細ページから

1. キャンセルしたい最適化に移動します
2. **Cancel** ボタンをクリックします（最適化がアクティブな間のみ表示されます）
3. ダイアログでキャンセルを確認します

### リストページから

1. プロジェクトの **Optimizations** ページに移動します
2. 1 つ以上のアクティブな最適化を選択します
3. **Cancel** 一括アクションをクリックします
4. キャンセルを確認します

すでに完了した最適化は、一括キャンセル時に自動的にスキップされます。

確認すると、最適化ジョブとそのすべての子ジョブ（個別のマルチスタート実行）が **Canceled** 状態に移行します。キャンセル前に完了していた作業は失われます。

<Warning>
  最適化のキャンセルは元に戻せません。結果が必要な場合は、
  新しい最適化を作成して実行する必要があります。
</Warning>

## 最適化の編集

最適化を作成した後、名前と説明はいつでも更新できます。これは、異なる設定を反復しながら最適化リストを整理するのに役立ちます。

### 編集方法

編集ダイアログは 2 つの場所から開くことができます:

* **最適化リストから** — 任意の最適化行の三点メニューをクリックし、**Edit** を選択します
* **最適化詳細ページから** — ヘッダーの **Edit** ボタンをクリックします

ダイアログでは、最適化の**名前**と**説明**を変更できます。**Save Changes** をクリックして適用します。

<Info>
  名前と説明のみ編集可能です。パラメータ、目的関数、制約条件、
  またはアルゴリズム設定を変更するには、最適化をクローンして
  更新された設定で新しいものを作成してください。
</Info>

## 最適化のクローン

完了した最適化の **Clone** をクリックすると、同じセル、モデル、パラメータ、目的関数、アルゴリズム設定が事前入力された新しい最適化が作成されます。これは、初期結果に基づいてパラメータの範囲を狭めたり、新しい制約条件を追加するなど、わずかな調整で再実行したい場合に便利です。

## 最適化の削除

最適化とそのすべての結果を完全に削除できます。詳細ページから 1 件ずつ削除する方法と、リストページから一括で削除する方法があります。

### 詳細ページから

1. 削除したい最適化に移動します
2. **Delete** ボタンをクリックします
3. ダイアログで削除を確認します

### リストページから

1. プロジェクトの **Optimizations** ページに移動します
2. 行のチェックボックスで 1 つ以上の最適化を選択します
3. ツールバーの **Delete** 一括アクションをクリックします
4. ダイアログで削除を確認します

各最適化は個別に削除されるため、失敗があれば行ごとに通知され、残りの選択項目の削除は続行されます。完了時には削除に成功した件数を示すトーストが表示されます。

<Info>
  一括 **Delete** アクションは、`optimization:delete` 権限を持つユーザーにのみ
  表示されます。削除権限を持たないユーザーでも、`optimization:update` 権限が
  あれば一括 **Cancel** アクションは引き続き利用できます。
</Info>

<Warning>
  この操作は元に戻せません。削除した最適化とそのすべての結果は完全に削除されます。
</Warning>

## ベストプラクティス

### シンプルに始める

以下から始めましょう:

* 少ないパラメータ（2-4）
* 広い範囲
* 少ないマルチスタート（2-4）
* 少ない反復回数（50）

問題を理解してから複雑さを増やしてください。

### 制約条件の充足を確認する

最適結果が制約に違反する場合:

* ペナルティ値を増やす
* パラメータ範囲を狭める
* 制約が物理的に達成可能かどうかを確認する

### 結果を検証する

最適化後:

* 最適パラメータでシミュレーションを実行して検証する
* 結果が物理的に妥当かどうかを確認する
* 製造公差を考慮する

### 反復的に改善する

最適化は多くの場合、反復的なプロセスです:

1. 初期最適化を実行する
2. 結果を確認して範囲を調整する
3. パラメータや制約条件を追加/削除する
4. 調整した設定で再実行する

## トラブルシューティング

### ソルバー障害時の部分的な解

ソルバーがシミュレーション中に数値エラー（例: 特定のパラメータの組み合わせによる不安定性）に遭遇した場合、クラッシュする代わりに、障害発生時点までの結果を含む部分的な解を返します。目的関数はこの部分的な時系列を直接使用し、シミュレーションの成功した部分からオプティマイザに実データを提供します。

部分的な解は、評価を完全に失うのではなく、シミュレーションの成功部分から意味のある勾配情報をオプティマイザが受け取るため、収束を改善します。

### 最適化が失敗する場合

* パラメータの範囲が現実的かどうかを確認する
* 実験の構文が有効かどうかを検証する
* 制約条件が達成可能かどうかを確認する
* モデルと実験の互換性を確認する

### 収束が悪い場合

* 最大反復回数を増やす
* パラメータ範囲を狭める
* 目的関数を簡素化する
* 競合する制約条件がないか確認する

### 結果に一貫性がない場合

* マルチスタート数を増やす
* 複数の局所最適解がないか確認する
* 制約条件のペナルティを見直す

## 次のステップ

* [最適化の概要](/ja/optimize/overview)で概念的な理解を深める
* [テンプレート](/ja/optimize/templates)で事前設定された出発点について学ぶ
* [シミュレーション](/ja/simulate/simulations)で基盤となるシミュレーションプロセスを探索する
