数値最適化

数値最適化

このノートブックでは、EvoXを使用して粒子群最適化(PSO)アルゴリズムによりAckley関数を最適化するためのステップバイステップのチュートリアルを提供します。PSOアルゴリズムとAckley最適化問題は、どちらもEvoXフレームワーク内の組み込みコンポーネントとして統合されています。

まず、PSO(アルゴリズム)、Ackley(問題)、およびStdWorkflowEvalMonitor(ワークフロー)を含む必要なすべてのモジュールをインポートします。

import torch

from evox.algorithms import PSO
from evox.problems.numerical import Ackley
from evox.workflows import StdWorkflow, EvalMonitor

ここで、PSOアルゴリズムをインスタンス化します。以下の設定を指定します:

  • pop_size: 粒子群(個体群)のサイズ。
  • lb および ub: 探索空間における各次元の下限と上限。
  • その他のパラメータはすべてデフォルトです。詳細なAPIを参照してください。
# Define the algorithm
algorithm = PSO(pop_size=100, lb=-32 * torch.ones(10), ub=32 * torch.ones(10))

次に、EvoXの数値問題にあるAckley関数を選択します。

# Define the problem
problem = Ackley()

最適化プロセス中に必要な情報を追跡するために、EvalMonitorインスタンスを作成します。

# Define the monitor
monitor = EvalMonitor()

StdWorkflowクラスは、アルゴリズム、問題、およびモニターを統合するための標準化されたプロセスを提供します。

# Define the workflow
workflow = StdWorkflow(algorithm=algorithm, problem=problem, monitor=monitor)

setup()を呼び出すとコンポーネントが初期化され、ワークフローが最適化ステップを実行する準備が整います。

一定の反復回数(この例では100回)だけ最適化を実行します。各反復において、step()メソッドはPSOアルゴリズムを更新し、Ackley関数で新しい候補解を評価し、モニターを通じてそれらの適応度(fitness)を追跡します。

# Perform the Ackley function optimization procedure
for _ in range(100):
    workflow.step()

最後に、ワークフローからmonitorサブモジュールを取得し、これまでに発見された上位の解(topk_solutions)とそれに対応する目的関数値(topk_fitness)にアクセスします。そして、最良の結果とそれに関連する解を出力します。

# Get the best solution and its fitness
population = monitor.topk_solutions
fitness = monitor.topk_fitness
print(f"The best solution is:\n{population},\nwith the minimum value:\n{fitness}")
monitor.plot()