2.1. はじめに

Nuorium Optimizer は数理計画問題を解くための汎用ソルバであり, PySIMPLE は数理計画問題を記述するモデリング言語です.

本節は Nuorium Optimizer/PySIMPLE の基本的な機能に関するチュートリアルです. 本節を一読していただければ,Nuorium Optimizer/PySIMPLE の基本的な利用方法がご理解いただけると思います.

2.1.1. 数理計画問題とは

数理計画問題とは,「与えられた条件の下で,望ましさの尺度を表す何らかの関数の最小値(最大値)を求め, さらにその最小値(最大値)を与える不特定要素の値を決定する」という問題です.

上記における,「与えられた条件」は制約条件,「望ましさの尺度を表す関数」は目的関数, 「不特定要素」は変数と一般に呼ばれています. この用語を用いて書き直すと,数理計画問題とは, 「制約条件を満たす範囲における目的関数の最小値(最大値)及びその最小値(最大値)を与える変数を求める問題」 といえます.

例えば,\(x\ge 0\) において \(3x+2\) の最小値を求める問題は,数理計画問題です. この場合,制約条件は \(x\ge 0\),目的関数は \(3x+2\),変数は \(x\) となります.

この問題は数理計画の世界では次のように書かれます:

  • 目的関数: \(3x+2\) → 最小化

  • 制約条件: \(x\ge 0\)

考える間もなく,上記の数理計画問題の最もよい目的関数値は 2(\(x=0\) のとき)となります. このときの変数の値を最適解と呼びます.

最適解を求めることを「数理計画問題を解く」あるいは「最適化する」といいます.

2.1.2. 数理計画問題を解く

sample.py というファイルに以下を記述してみましょう.:

from pysimple import Problem, Variable

problem = Problem(type=min)
x = Variable()
problem += 3*x + 2
problem += x >= 0
problem.solve()

この状態で sample.py のあるフォルダに行き,コマンドプロンプトから python sample.py と入力してみましょう.:

$ python sample.py

[About Nuorium Optimizer]
Nuorium Optimizer 26.1.0 build:f2d78da8
         <with META-HEURISTICS engine "wcsp"/"rcpsp">
         <with Netlib BLAS>
, Copyright (C) 1991 NTT DATA Mathematical Systems Inc.

[Problem and Algorithm]
PROBLEM_NAME                                          Problem
NUMBER_OF_VARIABLES                                         1
NUMBER_OF_FUNCTIONS                                         2
PROBLEM_TYPE                                     MINIMIZATION
METHOD                                           HIGHER_ORDER

[Progress]
<preprocess begin>.........<preprocess end>
<iteration begin>
    res=3.0e-03 .... 2.1e-10
<iteration end>

[Result]
STATUS                                                OPTIMAL
VALUE_OF_OBJECTIVE                                          2
ITERATION_COUNT                                             5
FUNC_EVAL_COUNT                                             8
FACTORIZATION_COUNT                                         6
RESIDUAL                                      2.077775694e-10
ELAPSED_TIME(sec.)                                       0.04

この一連の操作で,あなたは Nuorium Optimizer を使って次の数理計画問題を解いたことになります. ここで python は PySIMPLE をインストールしたときの Python 環境です. 以降,python コマンドは PySIMPLE をインストールしたときの Python 環境を指します.

インタプリタから実行することもできます.python -i と入力してインタプリタを起動させてみましょう.:

$ python -i
Python 3.12.2 (tags/v3.12.2:6abddd9, Feb  6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pysimple import Problem, Variable
pysimple 1.5.0 (2024-01-25 20:40:57 +0900 f8ef972)
Copyright (C) 2019 NTT DATA Mathematical Systems Inc. All Rights Reserved.
>>> problem = Problem(type=min)
>>> x = Variable()
>>> problem += 3*x + 2
>>> problem += x >= 0
>>> problem.solve()
# 以下同様の出力

Windows 環境では Nuorium 統合環境 からも実行できます. インストール時に PySIMPLE が予めインストールされた Python が同梱されており, これは「Python@Nuorium」を選択した状態で実行ボタン (F5) を押すことで実行できます.

../_images/nuorium.png

ユーザが指定する Python を用いる場合には,以下の方法で実行できます.

python コマンドにパスが通っている場合

「デフォルト」を選択して実行ボタン(F5)を押してください. 現在編集中の拡張子を見て, .py である場合にはパスが通っている Python を呼び出します. なお,このような拡張子ごとの「デフォルト」選択時の挙動は, ユーザフォルダ\AppData\Roaming\nuorium\editor\defaultrc.json から設定できます.

python コマンドにパスが通っていない場合

例えば python が「ユーザフォルダ\\Anaconda3」に存在する場合, ユーザフォルダ\AppData\Roaming\nuorium\editor\userrc.json を次のように変更して, 新たに「Python」という実行単位を追加します.

{
    "Python": {
        "command": "ユーザフォルダ\\Anaconda3\\python",
        "args": ["|fullname|"],
        "options": {
            "cwd": "|directory|"
        }
    }
}

ここで用いた実行単位名「Python」は例であり,他の区別可能な名称を用いて構いません.

以上に述べました詳細については,Nuorium 上で [メニューバー] → [ヘルプ] → [Nuorium リファレンスマニュアル (PDF)](F1) の 3.6 節「JSON ファイルの設定方法」をご確認ください.

Nuorium 上でターミナルを起動して,コマンドを実行することもできます. Ctrl-P を押すか,[メニューバー] → [設定] → [シェル設定] で開くシェル設定画面からターミナルを起動します. 起動後,Nuorium 上にプロンプト画面が表示されますので,PySIMPLE をインストールした Python を呼び出します.