S+NUOPT の特徴や機能等をご紹介します。
S-PLUS 環境とのシームレスな結合
S-PLUS のインタプリター環境から、最適化モデルの定義と実行が可能です。S-PLUS 上で最も基本的な vector や matrix のデータセットは NUOPT 付属のモデリング言語 SIMPLE に、そのまま受け渡して最適化のデータとして用いることができます。
次は S-PLUS 上の vector を NUOPT(モデリング言語 SIMPLE)に渡す例です。渡した結果がきちんと解釈されているかその場で対話的に確認することができます。
> 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 環境の NUOPT と違い、モデルをコンパイルするという手間が不要なため、より直観的なご利用が可能です。具体的には S-PLUS のプロンプトレベルから、対話的にデータの受け渡しの確認や、解の確認をすることが可能です。
統計解析パッケージ S-PLUS のアドインとして作成されているので、S-PLUS が本来持っているデータの前処理、基本的な統計処理、すぐれたグラフィックスなどを自由に利用して最適化が可能です。
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 オブジェクトに変換する例です(こちらのページもご参照下さい)。
> 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 でグラフを描きます
![]()
> 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
|
豊富な数理計画アルゴリズム
次のような数理計画法アルゴリズムを備えています。
- 線形計画法(単体法、内点法)
- 二次計画法(有効制約法、内点法)
- 非線形計画法(内点法、逐次二次計画法)
- 非線形半正定値計画法(内点法)
- 線形混合整数計画法(分枝限定法)
- 混合整数二次計画法(分枝限定法)
- 非線形整数計画法(分枝限定法)
- 離散・制約充足問題(タブ・サーチ)
金融工学分野での実績
日本発のソフトウエアとして海外で販売されており、主に金融工学の分野で利用されています。解説書も出版されました。
