トップ > 製品概要 > 派生製品 > SNUOPT > SNUOPT の特徴と機能

SNUOPTの特徴と機能

SNUOPT の特徴や機能等をご紹介します。

S-PLUS 環境とのシームレスな結合

S-PLUS のインタプリター環境から、最適化モデルの定義と実行が可能です。S-PLUS 上で最も基本的な vector や matrix のデータセットは Numerical Optimizer 付属のモデリング言語 SIMPLE に、そのまま受け渡して最適化のデータとして用いることができます。

次は S-PLUS 上の vector を Numerical Optimizer(モデリング言語 SIMPLE)に渡す例です。渡した結果がきちんと解釈されているかその場で対話的に確認することができます。

<< S-PLUS 上の vector を Numerical Optimizer に渡す例 >>
> weight <- c(3,7,10,15,20,30)  # S-PLUS で vector の定義

> weight

[1]  3  7 10 15 20 30

> S <- Set()  # インデックス集合の定義

> weight.simple <- Parameter(index=S,as.array(weight))
    # weight を SIMPLE 側の定数オブジェクト Parameter に
    # vector は as.array() を使って変換したものを渡します。

> weight.simple  # SIMPLE オブジェクトの内容の確認

 1 2  3  4  5  6 

 3 7 10 15 20 30

attr(, "indexes"):

 [1] "*"

> S  # Parameter weight のインデックスの集合の確認

{ 1 2 3 4 5 6 }

統計解析、グラフィック機能を備えた対話的な最適化環境

Windows 環境の Numerical Optimizer と違い、モデルをコンパイルするという手間が不要なため、より直観的なご利用が可能です。具体的には S-PLUS のプロンプトレベルから、対話的にデータの受け渡しの確認や、解の確認をすることが可能です。

統計解析パッケージ S-PLUS のアドインとして作成されているので、S-PLUS が本来持っているデータの前処理、基本的な統計処理、すぐれたグラフィックスなどを自由に利用して最適化が可能です。

S-PLUS 上の matrix は次のように渡すことができます。

<< S-PLUS 上の matrix を渡す例 >>
> m <- matrix(1:12,3,4)

> m  # S-PLUS 上の行列

     [,1] [,2] [,3] [,4] 

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12

> I <- Set()  # 添え字に対応する集合

> J <- Set()

> q <- Parameter(index=dprod(I,J),m)
      # m に対応する SIMPLE オブジェクト q の定義。
      # matrix は array の一種なのでそのまま渡せる。

> q  # 内容確認

  1 2 3  4 

1 1 4 7 10

2 2 5 8 11

3 3 6 9 12

attr(, "indexes"):

[1] "*" "*"

> I  # インデックス集合を確認

{ 1 2 3 }

> J

{ 1 2 3 4 }

次はポートフォリオ最適化において、収益率の時系列から分散共分散行列(S-PLUS の matrix)を求め、SIMPLE オブジェクトに変換する例です(こちらのページもご参照ください)。

<< S-PLUS の matrix を求め SIMPLE オブジェクトに変換する例 >>
> R.60x4  # 4 銘柄、60 期間の収益率の時系列

numeric matrix: 60 rows, 4 columns. 

            A           B           C           D 

 1 -0.0309622  0.05152320 -0.04322870  0.00000000

 2 -0.1201440  0.05933940 -0.05080020 -0.05762910

 3 -0.0509201  0.03636760 -0.01133160 -0.02054870

                      (中略)

58  0.0775582  0.07474740 -0.00324149  0.28394400

59 -0.0201012 -0.14694400 -0.08465290 -0.06738900

60  0.0250640  0.11885200 -0.06949780  0.14310100

> matplot(rownames(R.60x4),R.60x4
       ,names=colnames(R.60x4),type="o")
     # R.60x4 から S-PLUS でグラフを描きます
R.60x4 のグラフ
> Q <- var(R.60x4) 
      # S-PLUS の var 関数を使って
      # R.60x4 の分散共分散行列を求めます

> Q  # Q の内容の確認

          A           B           C           D 

A 0.017788838 0.005730923 0.004552905 0.003779794

B 0.005730923 0.026978759 0.005153147 0.008770707

C 0.004552905 0.005153147 0.005200091 0.004284923

D 0.003779794 0.008770707 0.004284923 0.014216287

> Asset <- Set()  # インデックス集合の定義

> Q.simple <- Parameter(index=dprod(Asset,Asset),Q)
        # Q を SIMPLE 側のオブジェクトに変換します。
        # matrix 型はそのまま渡すことができます。

> Q.simple  # SIMPLE オブジェクトの内容を対話的に確認します

            A           B           C           D 

A 0.017788838 0.005730923 0.004552905 0.003779794

B 0.005730923 0.026978759 0.005153147 0.008770707

C 0.004552905 0.005153147 0.005200091 0.004284923

D 0.003779794 0.008770707 0.004284923 0.014216287

attr(, "indexes"):

[1] "*" "*"

最適化モデル定義と最適化、結果の取得

最適化モデルは S-PLUS 関数として定義することができます。最適化モデルはモデリング言語 SIMPLE で記述します。SIMPLE では最適化の数式のパターンとデータを明確に分離することができますので見通しのよい記述が可能です。最適化の結果についても S-PLUS オブジェクトの形で簡便にとりだすことができます。

<< 最適化の結果を取り出す例 >>
> knapex <- function(weight,price)

{

    S <- Set()

    price <- Parameter(index=S,as.array(price))

    weight <- Parameter(index=S,as.array(weight))

    x <- IntegerVariable(index=S,type=binary)

    j <- Element(set=S)

    Sum(weight[j]*x[j],j) <= 50

    v <- Objective(type="maximize")

    v ‾ Sum(price[j]*x[j],j)

}  # SIMPLE で記述したナップサックモデル

> weight <- c(3,7,10,15,20,30)

> price <- c(4,7,12,13,17,15)  # データの定義

> s <- System(model=knapex,weight,price) 
     # モデルにデータをあてはめる(展開)

> s  # 展開結果の確認

1-1 :  3*x[1]+7*x[2]+10*x[3]+15*x[4]+20*x[5]+30*x[6] <= 50

v: 4*x[1]+7*x[2]+12*x[3]+13*x[4]+17*x[5]+15*x[6] (maximize)

> sol <- solve(s)  # 解く(Numerical Optimizer の起動)

NUOPT 11.1.9 (NLP/LP/IP/SDP module), Copyright (C)
 1991-2009 Mathematical Systems Inc.

           (中略)

STATUS                                                OPTIMAL

VALUE_OF_OBJECTIVE                                         46

SIMPLEX_PIVOT_COUNT                                        13

PARTIAL_PROBLEM_COUNT                                       8

ELAPSED_TIME(sec.)                                       0.00

> xopt <- as.array(current(s,x))
      # 解の内容を S-PLUS の array として取りだす

> xopt  # 内容の確認

 1 2 3 4 5 6 

 1 0 1 1 1 0

attr(, "indexes"):

[1] "*"

> sum(weight*xopt)  # 総重量

[1] 48

> sum(price*xopt)  # 総コスト

[1] 46

豊富な数理計画アルゴリズム

次のような数理計画法アルゴリズムを備えています。

金融工学分野での実績

日本発のソフトウエアとして海外で販売されており、主に金融工学の分野で利用されています。解説書も出版されました。

S+NUOPT