nAG数値計算ライブラリ
> 最適化アルゴリズムExample集
> ネルダーミード法による制約なしの非線形最適化
ネルダーミード法による制約なしの最適化
概要:
このExampleでは、ネルダーミード法を用いて制約なしの最適化問題を解いています。ネルダーミード法は、関数の微分を使用せずに最適解を求める直接探索法の一種です。
目的関数:
| タスク | 式 |
|---|---|
| minimize | \(f(x_1, x_2) = e^{x_1}(4x_1^2 + 4x_1x_2 + 2x_2^2 + 2x_2 + 1)\) |
目的関数は、2変数の非線形関数であり、最小化問題として定式化されています。
決定変数:
| 変数 | 範囲 |
|---|---|
| \(x_1\) | 実数 |
| \(x_2\) | 実数 |
制約条件:
このExampleでは、制約条件は特に設定されていません。ネルダーミード法は制約なしの最適化問題に適用されています。
詳細説明:
初期値は \(x_1 = -1\), \(x_2 = 1\) に設定されています。
目的関数 \(f(x_1, x_2)\) は、指数関数とそれに掛け合わされる2次式で構成されています。
ネルダーミード法のパラメータとして、最大関数評価回数
maxcalは100に設定されています。収束判定条件として、関数値の許容誤差
tolfと変数の許容誤差tolxは、いずれもマシンイプシロンの平方根に設定されています。最適解は \(x_1 = 0.5\), \(x_2 = -0.9999\) 付近で見つかり、その時の目的関数値は約0.0000となります。
Exampleの実行コマンド:
python -m naginterfaces.library.examples.opt.uncon_simplex_ex
ソースコード表示コマンド:
python -c "import inspect; from naginterfaces.library.examples.opt import uncon_simplex_ex; print(''.join(inspect.getsourcelines(uncon_simplex_ex)[0]))"
出力結果例:
naginterfaces.library.opt.uncon_simplex Python Example Results.
Nelder--Mead simplex algorithm.
The final function value is 0.0000
at the point x = (0.5000, -0.9999)
マニュアル:
ソース:
#!/usr/bin/env python3
"""`naginterfaces.library.opt.uncon_simplex` Python Example."""
# nAG Copyright 2017-2019.
# pylint: disable=invalid-name
from math import exp, sqrt
from naginterfaces.library import machine, opt
def main():
"""
Example for :func:`naginterfaces.library.opt.uncon_simplex`.
Unconstrained minimum, Nelder--Mead simplex algorithm.
>>> main()
naginterfaces.library.opt.uncon_simplex Python Example Results.
Nelder--Mead simplex algorithm.
The final function value is 0.0000
at the point x = (0.5000, -0.9999)
"""
print(
'naginterfaces.library.opt.uncon_simplex Python Example Results.'
)
print('Nelder--Mead simplex algorithm.')
# The initial guess:
x = [-1.0, 1.]
# The objective function:
funct = lambda x: (
exp(x[0])*(4.*x[0]*(x[0] + x[1]) + 2.*x[1]*(x[1]+1.)+1.)
)
# Other parameters for the optimizer:
maxcal = 100
tolf = sqrt(machine.precision())
tolx = sqrt(tolf)
soln = opt.uncon_simplex(
x, tolf, tolx, funct, maxcal,
)
print('The final function value is {:1.4f}'.format(soln.f))
print('at the point x = ({:1.4f}, {:1.4f})'.format(*soln.x))
if __name__ == '__main__':
import doctest
import sys
sys.exit(
doctest.testmod(
None, verbose=True, report=False,
optionflags=doctest.REPORT_NDIFF,
).failed
)