最適化アルゴリズムExample集: ネルダーミード法による制約なしの非線形最適化
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)

マニュアル:

uncon_simplexのマニュアル

ソース:

#!/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
    )

関連情報
Privacy Policy  /  Trademarks