3. 基本操作
この章では、最初のEvoX最適化タスクの実行方法を案内します。EvoXの起動と最適化プロセスの初期化、EvoXプロジェクトの設定(アルゴリズムと問題の選択および組み立て)、そして最適化プロセスを制御するための一般的な基本コマンド(またはメソッド)について説明します。簡単な例を通じて、EvoXの基本的な使い方を学びます。
起動と初期化
インストールの確認後、EvoXを使用して最適化スクリプトの作成を開始できます。任意のPython環境(ターミナル、Jupyter Notebook、IDEなど)でEvoXをインポートできます。
まず、EvoXとその関連モジュールをインポートし、簡単な最適化タスクを初期化しましょう。例として、粒子群最適化(PSO)アルゴリズムを使用して古典的なAckley関数を最適化します。Ackley関数は、既知のグローバル最適値が((0,0,\dots,0))にある一般的なベンチマーク関数であり、デモンストレーションに適しています。 以下は、最適化の起動と実行方法を示す最小限のEvoXサンプルコードです:
import torch
from evox.algorithms import PSO # PSOアルゴリズムをインポート
from evox.problems.numerical import Ackley # Ackley最適化問題をインポート
from evox.workflows import StdWorkflow, EvalMonitor # 標準ワークフローとモニターをインポート
# 1. 最適化アルゴリズムと問題を定義
algorithm = PSO(
pop_size=50, # 集団サイズ50
lb=-32 * torch.ones(2), # 決定変数の下限:2次元ベクトル、各-32
ub= 32 * torch.ones(2) # 決定変数の上限:2次元ベクトル、各32
)
problem = Ackley() # 最適化問題:Ackley関数(デフォルトの次元はアルゴリズムに一致)
# 2. ワークフローを組み立て、結果を追跡するモニターを追加
monitor = EvalMonitor()
workflow = StdWorkflow(algorithm, problem, monitor)
# 3. ワークフローを初期化
workflow.init_step() # アルゴリズムと問題の内部状態を初期化
# 4. 最適化の反復を実行
for i in range(100):
workflow.step() # 最適化を1ステップ進める
# 5. 結果を取得(例:最適値を表示)
best_fitness = monitor.get_best_fitness() # モニターから最良の適応度値を取得
print("反復完了、現在見つかった最良の適応度値:", float(best_fitness))
上記のコードには以下のステップが含まれています:
- まず、PSOアルゴリズムのパラメータを設定します:集団サイズ50、2次元の探索空間で範囲は[-32, 32]。
- 次に、Ackley問題を定義します(Ackley関数はデフォルトで2次元として定義されています)。
- 標準ワークフロー
StdWorkflowを作成し、アルゴリズムと問題を組み立て、最適化プロセスデータを記録するモニターEvalMonitorを渡します。 - 次に、
workflow.init_step()を使用して初期化プロセスを完了します。これにより、集団、乱数シード、その他の内部状態が自動的に初期化されます。 - その後、ループを実行して
workflow.step()で100回の反復を連続的に実行します。step()が呼び出されるたびに、アルゴリズムは新しい解を生成し、適応度を評価し、最適解に継続的に近づきます。 - 最後に、モニターが提供する
get_min_fitness()メソッドを使用して、反復プロセス中の最良の適応度値を取得し、表示します。
このスクリプトを実行すると、最適化の反復結果が表示されます。例えば:
反復完了、現在見つかった最良の適応度値: 9.5367431640625e-07
ループ内で中間結果を明示的に表示していないため、中間結果は表示されません。ただし、最終的な適応度値に基づいてアルゴリズムが収束したかどうかを判断できます。例えば、Ackley関数の最適値は0であり、出力が0に近い場合、PSOがグローバル最適に近い解を見つけたことを示します。print(monitor.history)を呼び出してモニターが記録した履歴データを表示したり、monitor.plot()を使用して収束曲線をプロットすることもできます(Plotlyなどの可視化サポートが必要です)。
注意:
StdWorkflowはEvoXが提供する標準最適化プロセスのカプセル化です。内部的に、従来の進化アルゴリズムに見られる「初期化-反復更新」ロジックを実装し、アルゴリズムと問題の間のインタラクションをカプセル化しています。ほとんどの簡単なアプリケーションでは、StdWorkflowを直接使用すれば十分です。EvalMonitorは、最適化プロセス中のパフォーマンスメトリクスを収集・表示するためのget_best_fitness()やplot()などのメソッドを実装するモニターです。初心者は一時的に、各反復の最良の結果を後で分析するために記録する記録帳として理解できます。
上記の例では、アルゴリズムの選択、問題の定義、ワークフローの組み立てを含むEvoXプロジェクトの基本設定を作成しました。一般的に、EvoXプロジェクトの設定には以下のステップが含まれます:
-
最適化問題の選択/定義: どの最適化問題を解決しようとしているかを明確にします。例えば、数学関数を最適化する場合、EvoXは
evox.problemsモジュールの下に多くの組み込み問題(Sphere、Rastrigin、Ackleyなどの古典的な関数)を提供しており、直接使用できます。問題が組み込みでカバーされていない場合は、独自に定義できます(後の章で説明)。問題を設定する際には、通常、決定変数の次元とその値の範囲を知る必要があります。 -
最適化アルゴリズムの選択/設定: 問題のタイプに基づいて適切な進化アルゴリズムを選択します。EvoXは
evox.algorithmsの下に、単目的アルゴリズム(PSO、GA、CMA-ESなど)や多目的アルゴリズム(NSGA-II、RVEAなど)を含む豊富なアルゴリズムセットを提供しています。アルゴリズムを選択した後、集団サイズ(pop_size)やアルゴリズム固有のパラメータ(GAの交叉確率や突然変異確率など)などのアルゴリズムパラメータを設定する必要があります。ほとんどのアルゴリズムは、集団を初期化するために変数の範囲(下限lbと上限ub)と問題の次元を必要とします。多目的アルゴリズムを使用する場合は、目的の数(n_objs)も指定する必要があります。EvoXのアルゴリズムは一般的なハイパーパラメータのデフォルト値を提供していることが多いですが、初心者はタスクに基づいてこれらのパラメータを調整することで、より良いパフォーマンスを得ることを検討すべきです。 -
ワークフローの組み立て: アルゴリズムと問題のインスタンスが準備できたら、それらをワークフローに「組み立て」る必要があります。ワークフローは完全な最適化プロセス制御を表します。EvoXでは、通常
StdWorkflowを使用してアルゴリズムと問題を組み合わせます。最適化の進捗を監視したい場合は、ワークフローにモニター(EvalMonitorなど)を追加できます。モニターは必須ではありませんが、デバッグや分析時に非常に役立ちます。ワークフローの組み立ては通常1行のコードで済みます:workflow = StdWorkflow(algo, prob, monitor)。 -
初期化: ワークフローの初期化メソッドを呼び出して最適化を開始します。EvoXの最新バージョンでは、1回の呼び出しで初期化プロセスを完了する便利な
StdWorkflow.init_step()メソッドが提供されています。 -
反復の実行: ループを使用して
workflow.step()を繰り返し呼び出し、進化プロセスを前進させます。各呼び出しは1回の反復を実行し、アルゴリズム内部で「新しい解の生成 -> 評価 -> 選択」などのステップが含まれます。反復中に、モニターを使用してリアルタイムの結果を観察できます。例えば、数世代ごとに現在の最良の適応度を表示するなどです。終了条件はニーズに基づいて設定できます。一般的なものには、固定世代数(例:100世代実行)や、監視メトリクスが収束した場合の停止(例:数世代にわたって大きな改善がない場合)があります。 -
結果の取得: 反復終了後、アルゴリズムから最終結果を抽出する必要があります。例えば、最良の解とその目的値です。EvoXでは、これらは通常モニターを介して取得されます。例えば、
EvalMonitor.get_best_fitness()は最良の適応度値を返します。最良の解ベクトルを取得するには、問題オブジェクトに評価中に最良の候補を保存させるか、モニターのインターフェースを使用する方法があります。EvoXの標準実装では、EvalMonitorは各世代の最良の個体と適応度を記録し、そのプロパティを通じてアクセスできます。monitor.historyが履歴を保存していると仮定すると、最後の世代から最良の個体を取得できます。もちろん、EvalMonitorをスキップして、ループ後にアルゴリズムオブジェクトを直接クエリすることもできます。これはアルゴリズムの実装に依存します。カスタムアルゴリズムがget_best()を実装しているか、状態に最良の個体を保存している場合は、直接抽出できます。ただし、EvoXは純粋関数とモジュール性を重視しているため、結果は通常モニタリングモジュールを介してアクセスされます。
これらのステップに従うことで、最適化タスクのコードを明確に構造化できます。初心者にとって重要なのは、アルゴリズム-問題-ワークフローの三者がどのように連携するかを理解することです:アルゴリズムは解の生成と改善を担当し、問題はその品質を評価し、ワークフローはそれらを反復ループに接続します。
次に、EvoXで利用可能な基本コマンドと関数呼び出しを紹介し、最適化プロセスの理解を深めます。
基本コマンドの概要
EvoXを使用する際に、慣れておきたいよく使用されるメソッドと関数があります。これらは「コマンド」として機能します:
ワークフロー関連メソッド
-
StdWorkflow.init_step(): 初期化。最適化プロセスを起動するためのクイックスタートコマンドで、スクリプトの最初によく使用されます。アルゴリズムと問題の両方の初期化ロジックを呼び出し、初期集団を生成し、適応度を評価します。この後、ワークフローには初期状態が含まれ、反復の準備が整います。 -
StdWorkflow.step(): 最適化を1ステップ進めます。各呼び出しにより、アルゴリズムは現在の集団状態に基づいて新しい候補解を生成し、評価し、次世代を選択します。ユーザーは通常、ループ内でこれを複数回呼び出します。step()関数は通常何も返しません(内部状態はワークフロー内で更新されます)が、古いバージョンでは新しい状態を返す場合があります。初心者は、戻り値を気にせずに単に呼び出すだけで構いません。
モニター関連メソッド
EvalMonitorを例にすると、一般的なメソッドには以下が含まれます:
EvalMonitor.get_best_fitness(): 記録された最低の適応度(最小化問題の場合)または最高の適応度(最大化問題の場合。モニターは通常これを区別します)を返します。現在の最良の結果を知るのに便利です。EvalMonitor.get_history()またはmonitor.history: 各世代の最良値などの完全な履歴を取得します。収束傾向の分析に便利です。EvalMonitor.plot(): 収束曲線やパフォーマンス曲線をプロットします。グラフィカル環境またはNotebookが必要です。モニターは通常Plotlyを使用してグラフをレンダリングし、アルゴリズムのパフォーマンスを視覚的に評価するのに役立ちます。 内部的に、モニターは各世代の評価回数とその結果を記録します。通常、介入する必要はなく、必要なときにデータを抽出するだけです。
アルゴリズム関連メソッド
-
Algorithm.__init__()メソッド: アルゴリズムの初期化メソッド。変数は通常evox.core.Mutable()でラップされ、ハイパーパラメータはevox.core.Parameter()でラップされます。 -
Algorithm.step()メソッド: 特定のシナリオやカスタムアルゴリズム/問題を使用する場合、アルゴリズムのstep()メソッドを直接呼び出すことがあります。これは通常、アルゴリズムの反復ロジック全体をカプセル化しています。 -
Algorithm.init_step()メソッド:init_step()メソッドにはアルゴリズムの最初の反復が含まれます。オーバーライドされない場合は、単にstep()メソッドを呼び出します。典型的なケースでは、最初の反復は他の反復と変わらないため、多くのアルゴリズムではカスタムinit_step()が不要な場合があります。ただし、ハイパーパラメータの調整を含むアルゴリズムでは、ここでハイパーパラメータや関連変数を更新する必要がある場合があります。
デバイスと並列制御
.to(device)メソッド: プログラム内で計算デバイスを切り替える必要がある場合は、PyTorchの.to(device)メソッドを使用してテンソル(torch.Tensor)をGPU/CPUに移動します(torch.randnなどの一部のPyTorchメソッドもデバイスの指定が必要です)。一般的に、torch.set_default_device()を使用してデバイスをcuda:0に設定すると(システムがサポートしており、EvoXと依存関係が正しくインストールされていることを前提とします。torch.cuda.is_available()で確認してください)、ほとんどのEvoXの高性能並列計算は自動的にGPU上で実行されます。カスタムアルゴリズム、問題、またはモニターを作成する際に、新しいテンソルを作成したりデバイスに敏感なPyTorchメソッドを使用する場合は、deviceをcuda:0として明示的に指定するか、torch.get_default_device()を使用して、異なるデバイス間での計算によるパフォーマンス低下を避けることを推奨します。
初心者にとって、上記のメソッドは典型的な最適化タスクを処理するのに十分です。要するに:問題/アルゴリズムの初期化 - モニターの設定 - ワークフローの組み立て - 実行と結果の取得が最も一般的なEvoXのワークフローです。これらをマスターすれば、EvoXを使用して基本的な最適化タスクに取り組むことができます。
次の章に進む前に、例を修正してみてください:PSOを別のアルゴリズムに切り替えたり、Ackley関数を別のテスト関数に置き換えたり、モニターを使用してより多くの情報を抽出したりしてください。これにより、EvoXプロジェクトの設定の柔軟性を実感できます。