最適化アルゴリズムExample集: 二次錐計画問題の内点法による解法
nAG数値計算ライブラリ > 最適化アルゴリズムExample集 > 二次錐計画問題の内点法による解法

二次錐計画問題-SOCP(内点法)

このExampleは、二次錐計画問題(SOCP)を内点法で解いています。内点法に基づく二次錐計画法の使用方法を示すことを目的としています。

目的関数:

タスク
minimize \(10x_1 + 20x_2 + x_3\)

決定変数:

変数 範囲
\(x_1\) \(-2 \leq x_1 \leq 2\)
\(x_2\) \(-2 \leq x_2 \leq 2\)
\(x_3\) \(-\infty < x_3 < \infty\)

制約条件:

制約
線形制約1 \(-0.1x_1 - 0.1x_2 + x_3 \leq 1.5\)
線形制約2 \(1 \leq -0.06x_1 + x_2 + x_3\)
二次錐制約 \(x_3 \geq \sqrt{x_1^2 + x_2^2}\)

Exampleの実行コマンド:

python -m naginterfaces.library.examples.opt.handle_solve_socp_ipm_ex

ソースコード表示コマンド:

python -c "import inspect; from naginterfaces.library.examples.opt import handle_solve_socp_ipm_ex; print(''.join(inspect.getsourcelines(handle_solve_socp_ipm_ex)[0]))"

出力結果例:

naginterfaces.library.opt.handle_solve_socp_ipm Python Example Results.
Solve a small SOCP problem.
 E04PT, Interior point method for SOCP problems
 Status: converged, an optimal solution found
 Final primal objective value -1.951817E+01
 Final dual objective value   -1.951817E+01

マニュアル:

handle_solve_socp_ipmのマニュアル

ソース:

#!/usr/bin/env python3
"``naginterfaces.library.opt.handle_solve_socp_ipm`` Python Example."

# nAG Copyright 2019-2020.

# pylint: disable=invalid-name

from naginterfaces.base import utils
from naginterfaces.library import opt

def main():
    """
    Example for :func:`naginterfaces.library.opt.handle_solve_socp_ipm`.

    Second order cone programming based on an interior point method.

    >>> main()
    naginterfaces.library.opt.handle_solve_socp_ipm Python Example Results.
    Solve a small SOCP problem.
     E04PT, Interior point method for SOCP problems
     Status: converged, an optimal solution found
     Final primal objective value -1.951817E+01
     Final dual objective value   -1.951817E+01
    """

    print(
        'naginterfaces.library.opt.handle_solve_socp_ipm '
        'Python Example Results.'
    )
    print('Solve a small SOCP problem.')

    # The problem size:
    n = 3

    # Create the problem handle:
    handle = opt.handle_init(nvar=n)

    # Set objective function
    opt.handle_set_linobj(handle, cvec=[10.0, 20.0, 1.0])

    # Set box constraints
    opt.handle_set_simplebounds(
        handle,
        bl=[-2.0, -2.0, -1.e20],
        bu=[2.0, 2.0, 1.e20]
    )

    # Set linear constraints
    opt.handle_set_linconstr(
        handle,
        bl=[-1.e20, 1.0],
        bu=[1.5, 1.e20],
        irowb=[1, 1, 1, 2, 2, 2],
        icolb=[1, 2, 3, 1, 2, 3],
        b=[-0.1, -0.1, 1.0, -0.06, 1.0, 1.0]
    )

    # Set cone constraint
    opt.handle_set_group(
        handle,
        gtype='Q',
        group=[3, 1, 2],
        idgroup=0
    )

    # Set some algorithmic options.
    for option in [
            'Print Options = NO',
            'Print Level = 1'
    ]:
        opt.handle_opt_set(handle, option)

    # Use an explicit I/O manager for abbreviated iteration output:
    iom = utils.FileObjManager(locus_in_output=False)

    # Call SOCP interior point solver
    opt.handle_solve_socp_ipm(handle, io_manager=iom)

    # Destroy the handle:
    opt.handle_free(handle)

if __name__ == '__main__':
    import doctest
    import sys
    sys.exit(
        doctest.testmod(
            None, verbose=True, report=False,
            optionflags=doctest.ELLIPSIS | doctest.REPORT_NDIFF,
        ).failed
    )

関連情報
Privacy Policy  /  Trademarks