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:
= [-1.0, 1.]
x
# The objective function:
= lambda x: (
funct 0])*(4.*x[0]*(x[0] + x[1]) + 2.*x[1]*(x[1]+1.)+1.)
exp(x[
)
# Other parameters for the optimizer:
= 100
maxcal = sqrt(machine.precision())
tolf = sqrt(tolf)
tolx
= opt.uncon_simplex(
soln
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,
=doctest.REPORT_NDIFF,
optionflags
).failed )