ここでは、数理計画法パッケージ Nuorium Optimizer の FAQ を紹介します。
この FAQ は(株)NTT データ数理システム 数理計画部 Nuorium Optimizer サポートチームによって編集されています。ご意見・ご要望等ありましたら、お気軽に 資料請求・お問い合わせ までご連絡ください。
- 一般
- アルゴリズム
- C++SIMPLE(モデルの書き方)
- C++SIMPLE の記述はどのようなものですか?
- モデルは自分で書くのですか?
- どうすれば C++SIMPLE を習得できますか?
- 整数変数を使いたい。
- 添字の範囲に条件を付けたい。
- a <= x <= b or c <= x <= d のように制約式の or は表現可能ですか?
- 計算の後処理にすごく時間がかかっています。
- 目的関数はなく、とにかく全ての制約を満たす解が欲しいです。
- min または max を使いたい。
- 最適化のアルゴリズムを切りかえる方法を教えてください。
- 文字列を添字とする定数にモデルの中から直接値を与えたい。
- 変数を定数として扱いたい。
- 定数の値を変更したい。
- Parameter 型の値を double 型として扱いたいのですが。
- 変数の初期値はどのようにして与えますか。
- 変数の初期値の設定はどのようなケースで有効なのでしょうか。
- 実行不可能なケースにおいてすごく時間がかかっています。
- Element をイテレータとして利用したい
- モデルのビルドにすごく時間がかかります。
- 異なるバージョンの C++SIMPLE モデルに互換性はありますか?
- データ入出力
- エラー
- 実行不可能(infeasible)と出ました。原因を知ることはできますか?
- 浮動小数点エラーが出ます。
- 「'Parameter' から 'double' に変換できません」と出ます。
- 最適化結果を simple_printf 等でうまく表示できません。
- 「xxx.smp がありません」と出ます。
- result.errorCode で取得できるエラー番号の意味を教えてください。
- 「MOP warning: The hash table is full.Expanded...」と出ます。
- 「モデル xxx のビルドに失敗しました」と出ます。
- 「sdpin: Impossible asdpin」と出ます。
- 「error: (NUOPT 10) IPM iteration limit exceeded.」と出ます。
- 「error: (SIMPLE 67) 参照オブジェクト "x" の添字付けに誤りがあります。」と出ます。
- 「error: (SIMPLE 70) 条件式に現れる要素 x の使い方に誤りがあります。」と出ます。
- 「error: (NUOPT 26) LP/IP module cannot handle NLP.」と出ます。
- 「warning: (SIMPLE 196) 目的関数がコンスタントとなっています。」と出ます。
- 「fatal error C1509: コンパイラの制限 : 関数 'xxx' の例外ハンドラが多すぎます。関数を簡略化してください。」と出ます。
- 「error C2451: 条件式の型 'Equation' が間違っています。」と出ます。
- 「error C2661: 'simple_fprintf' : xx 個の引数を伴うオーバーロードされた関数はありません」と出ます。
- 「error C2679:二項演算子' =':型 'Expression'の右オペランドを扱う演算子が見つかりません」と出ます。
- (SIMPLE 123) データファイルの (xxx) の定義の付近において文法的な誤りがあります(問題のありそうな文字列 "yyy") と出ます。
- インストール
- Nuorium
- Excel アドイン
- 外部接続
- RSIMPLE
- その他
一般
数理計画法とは?
現実の問題を数式で定式化して解を求めることにより意思決定を行うという方法です。定性的な直観力では人間の判断に勝るものはありませんが、
- 複数の地点間で荷物を運ぶとき、どの経路にどの荷物を流せば輸送コスト安?
- 所定の仕事をこなすのに、残業あるいは短期アルバイト社員の雇用どちらが有利?
- どのような配分で商品を作れば原料在庫の範囲内でしかも利益が上がる?
- 季節商品はコスト安な時期に生産してストックしておきたいがその具体的計画は?
- 蓄熱や発電が可能なとき冷暖房機器を最もコスト安で運転する方法は?
- 故障に強い信号ネットワークを作るには?
- 株と債券と現金どのように組み合わせれば予測される価値の変動が少ない?
- 観測データをモデル式でもっとも良く説明するパラメータ値は?
など、ある程度定量的な評価が入る部分にはこの数理計画法が有効な判断材料を提供します。上記はすべて実際の意思決定に数理計画法が用いられている応用例です。
数理計画法は、数理最適化や単に最適化とも呼ばれます。
最適化について解説した「 数理最適化とは 」も是非ご覧ください。
Nuorium Optimizerとは?
数理計画法の適用のためには、現実の問題を最適化問題という形の数式に表現し、それを解く必要があります。Nuorium Optimizer は最適化問題(数式モデルと言います)の表現をモデリング言語 SIMPLE により行う手段を提供します。さらに表現されたものを解くための様々なアルゴリズム 単体法 、 内点法 、 有効制約法 )を備えています。
また Microsoft Excel や R 言語との連係、さらに数式モデルやデータを管理するための GUI を提供します。
詳細は Nuorium Optimizer 概要 をご覧ください。
どこで作られたソフトですか?
Nuorium Optimizer は(株)NTT データ数理システムの自社開発製品です。
導入実績と適用事例は?
適用事例は以下のように多岐にわたっています。
- 船舶スケジューリング計画問題(商社)
- 需要を考慮したシフトスケジューリング(コールセンター)
- 乗務員勤務表作成システム(運輸)
- 配車計画問題(運輸)
- 効率的保線計画(運輸)
- 納期遅れ最小化生産スケジューリング(製造業)
- 在庫最適化(製造業)
- 資材切り出し最適化(製造業)
- 積み付け最適化(製造業)
- 発電機器スケジューリング(製造業)
- 機器運転スケジュール最適化(製造業)
- エネルギーマネジメント(インフラ)
- ネットワーク設計モデル(インフラ)
- 広告配信マッチング(広告代理店)
- データフュージョン(広告代理店)
- キーワード購入最適化(広告代理店)
- 人員割り当てコンサルテーション(コンサル)
- ポートフォリオ最適化(金融)
- 投資比率の算出(金融)
さらに、教育分野では 筑波大学大学院ビジネス科学研究科 等で講義や演習に利用されています。
また、 インタビュー記事 もあわせてご覧ください。
詳細を知りたい方は 資料請求・お問い合わせ よりお問い合わせください。
価格とライセンス形態は?
Nuorium Optimizer のライブラリを組み込んだアプリケーションプログラムを他のコンピュータ上に移動して実行する場合には、ランタイムライセンスが必要になります。
保守契約を結んだユーザは以下のサービスが受けられます。
- 無償バージョンアップ(年 1 回)
- e-mail による技術サポート
- NTT データ数理システム主催によるセミナー・イベントへのご優待
詳細は 資料請求・お問い合わせ よりお問い合わせください。
対応プラットフォームは?
Windows、macOS、主要な Linux ディストリビューション及び UNIX OS に対応しています。詳細は Nuorium Optimizer 対応機種/OS をご覧ください。 主要なパブリッククラウド環境にも対応しています。
(株)NTT データ数理システムはパッケージ販売のみですか?
いいえ、お客様の問題のモデリングや定式化をはじめ、Nuorium Optimizer やその周辺(データベース、GUI)を含む受託プロジェクトをお受けすることができます。Nuorium Optimizer は自社開発したものですので、特別仕様などの実装を低コストで行なうことができます。Nuorium Optimizer の利用方法そのものについてのコンサルティング業務も承ってます。
また、Nuorium Optimizer のデモンストレーションも随時承ってます。デモンストレーションの内容については、お客様のご興味にあわせて柔軟に対応します。
さらに、Nuorium Optimizer 無料セミナーを通して、Nuorium Optimizer を有効に活用するための情報提供も行なっております。その他にも問題例をいただいて実際に Nuorium Optimizer にて求解し、実行時間や結果を伝えるサービスも行っています。
受託プロジェクトやデモンストレーション等については 資料請求・お問い合わせ よりお問い合わせください。最適化アルゴリズムはもちろん、モデリング手法や応用事例に詳しい専任の技術スタッフがお相手します。
モデルとデータとは?
最適化問題とは
$$ \begin{array}{ll} 変数 & x,y \\ 目的関数 & 180x+160y \rightarrow 最小化 \\ 制約条件 & 6x+y \geq 12 \\ & 3x+y \geq 8 \\ & 4x+6y \geq 24 \\ & 5 \geq x \geq 0 \\ & 5 \geq y \geq 0 \\ \end{array} $$ (2つの拠点の最適生産日数 \(x,y\) を求める)
のようなものです。しかし、このような数字を含んだ式の羅列では、データが変化したり、特に問題が大規模になった場合の管理や式の理解が難しくなります。これを
$$ \begin{array}{ll} 変数 & x_j \\ 目的関数 & \sum_j {c_j x_j} \rightarrow 最小化 \\ 制約条件 & \sum_j {a_{ij} x_j} \geq d_i \\ & 5 \geq x_j \geq 0 \\ \end{array} $$
のように問題を一旦抽象的に表現して(モデル記述)、数字の部分(データ)を
$$ c = \begin{pmatrix} 180 \\ 160 \end{pmatrix}, a = \begin{pmatrix} 6 & 1 \\ 3 & 1 \\ 4 & 6 \end{pmatrix}, d = \begin{pmatrix} 12 \\ 8 \\ 24 \end{pmatrix} $$
として別に与えた方が問題の構造が明らかになり、データが変化したり、問題が大規模になった場合にも対処しやすくなります。Nuorium Optimizer の モデリング言語 SIMPLE はこのように数理計画問題をモデルとデータに分離して記述する手段を提供しているので(もちろん分離しない状態での記述も可能です)、大規模モデルでも簡潔にわかりやすく記述できます。
CPU によって性能差はありますか?またマルチコアプロセッサに対応していますか?
CPU のクロック周波数やメモリ帯域幅、キャッシュサイズやコア数などに応じて Nuorium Optimizer の性能が変わります。 CPU によっては発熱を抑えるためにシングルコア動作時のクロック周波数よりもマルチコア動作時のクロック周波数の方が低いため、 Nuorium Optimizer の並列化機能を利用する際はこれら二つのクロック周波数を確認しておくのが推奨です。
以下のバージョンおよびアルゴリズムにおいて、マルチコアプロセッサの効果が出ることがあります。
- V13 以降: アルゴリズム「内点法」において Intel MKL を利用した場合
- V14 以降から V21 まで: Windows 環境において混合整数線形計画問題に対応するアルゴリズム「分枝限定法」で並列化オプションを指定した場合。Intel 社の並列化ライブラリ Intel TBB を用いています。Linux や macOS 環境ではマルチコアプロセッサの効果はありません
- V22 以降: 混合整数線形計画問題に対応するアルゴリズム「分枝限定法」と制約充足問題に対応するアルゴリズム「wcsp タブーサーチ」で並列化オプションを指定した場合。C++11 のスレッドライブラリを用いています
- V27 以降: アルゴリズム「wls」が並列計算に対応
必要なユーザー権限は?
Nuorium Optimizer はユーザー権限に関係なく使えます。ただし、Windows 版のインストールについては Administrator 権限があるユーザーで行う必要があります。
扱える変数の数に制限はありますか。
問題規模に関するソフトウェア的な制限はありませんが、問題の種別(非線形計画問題か整数計画問題かなど)によって現実的に扱える変数の数や計算時間が異なります。
問題の具体的な情報を 資料請求・お問い合わせ までご連絡いただければ、より問題に即した情報をご提供いたします。
アルゴリズム
Nuorium Optimizer が解ける問題の範囲を教えてください。
以下が Nuorium Optimizer が適用可能な数理計画問題の種類とアルゴリズムです。
- 線形計画問題(目的関数と制約式が線形)
- 凸二次計画問題(制約式が線形、目的関数が二次式)
- 混合整数線形計画問題(線形計画法の変数が一部が整数)
- 凸混合整数二次計画問題(凸二次計画法の変数の一部が整数)
- 非線形計画問題(目的関数と制約式がすべて非線形な式)
- 半正定値計画問題(行列の半正定値性に関する制約を含む)
- 離散変数モデル(離散変数のみを含む問題)
- WCSP(重み付き制約充足問題)
- RCPSP(資源制約つきスケジューリング問題)
単一のソフトウェアでこのように広い範囲の手法をカバーしているのが Nuorium Optimizer の特徴です。ただし、汎用パッケージであるため特定の問題に特化したアルゴリズムについては特別仕様による作り込みとなります。
大域的最適解は求まりますか?
一般の非線形計画問題や一部の二次計画問題は局所解の一意性が保証できません。この場合、通常の Nuorium Optimizer のアルゴリズムは局所解のいずれか一つを求めるというものであるため、大域的な最適解は求まりません。初期値を振ってみる、あるいは、適当な制約式を追加するなど問題に特化した処理が必要になります。メタヒューリスティクスアルゴリズムである wcsp タブーサーチや wls は、最適解ではなく近似解(最適である保証がない解)がもとまります。
どの程度の大規模問題が解けますか?
以下に Nuorium Optimizer バージョン 22.1.0 のベンチマーク結果より、制約式あるいは変数の数が 1000 - 500000 となる問題のリストを掲載します。問題は全て混合整数線形計画問題です。
問題 | #制約式 | #変数 | 計算時間(秒) |
---|---|---|---|
MILP1 | 1059 | 8165 | 1388.46 |
MILP2 | 1161 | 1495 | 634.28 |
MILP3 | 1737 | 1042 | 953.45 |
MILP4 | 3117 | 1294 | 1426.77 |
MILP5 | 3255 | 3706 | 1226.96 |
MILP6 | 5150 | 1810 | 1145.42 |
MILP7 | 5282 | 20347 | 594.95 |
MILP8 | 6805 | 885 | 1130.15 |
MILP9 | 7328 | 1204 | 1425.43 |
MILP10 | 7350 | 2221 | 1083.91 |
MILP11 | 7350 | 2221 | 1300.92 |
MILP12 | 9013 | 5997 | 820.27 |
MILP13 | 10218 | 12310 | 734.60 |
MILP14 | 10240 | 9500 | 1382.05 |
MILP15 | 14870 | 17657 | 552.89 |
MILP16 | 18380 | 577 | 872.98 |
MILP17 | 19466 | 18440 | 685.89 |
MILP18 | 34219 | 3708 | 1330.03 |
MILP19 | 34759 | 68343 | 599.90 |
MILP20 | 63009 | 508 | 540.56 |
MILP21 | 164547 | 328819 | 916.51 |
- CPU:Intel(R) Xeon(R) CPU E5-1410 v2 @ 2.80GHz
- メモリ: 32 GB
- キャッシュサイズ:10 MB
Nuorium Optimizer は係数行列の疎行列性を利用した実装によって高速化を実現しているため、問題を解く速度は変数や制約式の数のほか、非零要素の数あるいは係数行列の非零要素のパターンに依存します。また整数変数を含んだ問題は難しさが問題の規模のみに依存しないということが知られています。数十万変数でもすぐに解ける場合もあれば、数百変数でも現実的な時間内で解けない場合があり、計算時間について正確な見積りはより困難になります。
ご自身のモデルがどの程度の計算規模になるかどうかを検証するには Nuorium Optimizer の試用版を用いて検証することをおすすめします。
対応可能な問題の種類と規模を教えてください。
対応可能な問題規模(制約式数、実数変数数、整数変数数)についてはソフトウェア上の制限は設けていませんが、実際にはハードウェア性能に依存します。
また、対応可能な問題規模は問題の種類や内容にも大きく依存します。そのため、はっきりした線引きをすることは難しいのですが、下記情報をガイドラインとしてご利用ください。
- 線形計画問題: 数十万の実数変数に対応可能です。
- 混合整数線形計画問題: 問題内容に大きく依存します。問題の種類によっては実数変数、整数変数合わせて数万程度まで対応可能な場合があります。問題の性質が良ければ、数十万変数の問題にも対応可能です。
- 非線形計画問題: 変数が全て実数の凸二次計画問題であれば数万変数まで対応可能です。それ以外の場合は問題内容に大きく依存します。
制約式数については、その複雑さに大きく依存します。
最適解が Nuorium Optimizer と他ソルバーで異なっています。
数理計画問題では、最適解が複数存在することがあります。最適化ソルバーが求めるのは最適解のうちの一つなので、Nuorium Optimizer と他ソルバーで求められる最適解が異なることがあります。
「IPM iteration limit exceeded」と出たとき、得られた解は制約を全て満たしているのでしょうか。
解が制約を満たしている保証はありません。しかしながらユーザ側でチェックする手段があります。標準出力に
CONSTRAINT_INFEASIBILITY 7.566995919e-010
と表示されるのが「制約の違反量の合計」で、チェックの目安になります。なお内点法はその性質上、変数の上下限制約は必ず満たします。
wcsp タブーサーチとは何ですか?
Nuorium Optimizer に搭載されているアルゴリズム wcsp タブーサーチは、変数が全て整数であるような離散計画問題を対象とした近似解法のアルゴリズムです。割当問題などの実務的な大規模離散計画問題に対して高速に、準最適な実行可能解(制約を満足する解)を発見できます。
wcsp タブーサーチのアルゴリズムについては 整数計画法 に概要があります。
C++SIMPLE(モデルの書き方)
C++SIMPLE の記述はどのようなものですか?
C++SIMPLE は C++ のクラスライブラリとして実装されていますので、C/C++ に非常に似通った外観を持ちます。下記は記述例です。
Variable x;
Variable y;
Objective cost(type=minimize);
cost = 180*x + 160*y;
6*x + y >= 12;
3*x + y >= 8;
4*x + 6*y >= 24;
0 <= x <= 5;
0 <= y <= 5;
変数と目的関数に当たるのは Variable
、 Objective
として宣言し、変数同士の演算によって式そのものを表現します。使う演算子は C/C++ のものと同じです。モデルを抽象化してデータを外から与える場合には、定数データ( Parameter
)、集合( Set
)、添字( Element
)という概念が必要となりますが、その場合には次のような記述となります。
Set N,P;
Element j(set=N),i(set=P);
Variable x(index=j);
Parameter c(index=j),d(index=i);
Parameter a(index=(i,j));
Objective cost(type=minimize);
cost = sum(x[j],j);
sum(a[i,j]*x[j],j) >= d[i];
5 >= x[j] >= 0;
添字を使った和( sum
)の表現など簡潔にモデルが記述できます。
モデルは自分で書くのですか?
はい。Nuorium Optimizer を使うには適用する問題を数式の形で表現して与える必要があります。しかし、数理計画法の定式化には明らかなパターンがあり、ほとんどの応用は既存の例題の一部を組み合わせたり、書き換えるのみで記述可能ですので、最初から式を起こさなければならないということはほとんどありません。
モデルを自分で書くことに不安を感じる方は、まずは Nuorium Optimizer の使い方を学ぶために毎月開催している無料のセミナーにご参加ください。こちらでモデリング言語 C++SIMPLE の基本的な使い方や Nuorium に慣れ親しみ、典型的な問題に対する定式化を学ぶことができます。
その後に、「Nuorium Optimizer C++SIMPLE例題集」を使って興味のある問題から学んでいくと良いでしょう。初歩的なものから実際に使える例まで Nuorium Optimizer を使った数多くの例題が収録されています。Nuorium Optimizer をお持ちの方はサンプルコードをコピー&ペーストするだけで実行することができます。 Nuorium Optimizer マニュアル からマニュアルをダウンロードすることができますので、ご興味がある方は是非ご覧ください。
もし定式化にお困りの際は無料個別相談会や有償コンサルティングの利用をご検討ください。 有償にはなりますが、貴社向けに分野や業界に特化した数理最適化の特別セミナーを開催することも可能です。資料請求・お問い合わせ までお気軽にご連絡ください。
どうすれば C++SIMPLE を習得できますか?
製品のご利用方法については無料セミナーへの参加を推奨いたします。 C++SIMPLE の記述方法を実際に例題を通して記述しながら習得できるコースを用意しております。 一通りの基本的な文法を学べるため、大変オススメです。
既に製品を購入されている場合は以下の段階に分けて習得するのが効率的です。
- 数理モデルの定式化に不慣れである。
- ナップサック問題のような簡単な数理モデルを定式化できる。
- 様々な数理モデルを知っている、もしくは定式化できる。
それぞれの場合で習得方法について述べます。
数理モデルの定式化に不慣れ
Nuorium Optimizer SIMPLEチュートリアル を用意しております。 こちらをご参照ください。
Nuorium Optimizer SIMPLEチュートリアル では数理計画問題とはそもそもどういうものか、 といった基本から紐解きながらソフトウェアの利用方法についても、 簡単な例題を通しながら同時に理解できるよう解説しています。
簡単な数理モデルを定式化可能
既に記述したい数理モデルが具体的であれば、 「変数」「制約条件」「目的関数」などの数式をほとんどそのまま記述することで、 C++SIMPLE が記述できるため、 Nuorium Optimizer C++SIMPLEマニュアル や Nuorium Optimizer Nuoriumスタートガイド を参考に比較的容易に学習をスタートできます。
様々な数理モデルについての知識がある
Nuorium Optimizer C++SIMPLE例題集 には、 豊富な例題が問題文と記述例およびデータとともに掲載されており、 いろいろな具体例を通して C++SIMPLE の実際の記述方法を学べます。
またスキルアップセミナーと題して、 実務の導入も意識したより高度な利用方法について無料で受講できます。 併せてご検討ください。
整数変数を使いたい。
C++SIMPLE で整数変数を定義するには
IntegerVariable x;
のように変数を宣言します。さらに、値として 0 と 1 のみをとる 0-1 整数変数を定義する場合は、
IntegerVariable x(type=binary);
として変数の type 属性を binary とします。
添字の範囲に条件を付けたい。
和の場合は sum 関数中の添字に続けて条件式を書くことによって実現できます。
- 集合 S に含まれる添字 i のみで変数 x[i] の和をとる場合
sum(x[i], (i, i < S)) == 0;
- パラメータ a[i] が 0 の添字 i のみで変数 x[i] の和をとる場合
sum(x[i], (i, a[i] == 0)) == 0;
また、制約式の場合は、制約式の後にカンマで続けて書くことによって実現できます。
- 集合 S に i が含まれる場合のみ変数 x[i] を 1 に等しくさせたい場合
x[i] == 1, i < S;
- パラメータ a[i] が 0 の場合のみ変数 x[i] を 1 に等しくさせたい場合
x[i] == 1, a[i] == 0;
ただし、条件式部分に変数を含めることはできません。
- 変数 y[i] を条件式部分に含める
sum(x[i], (i, y[i] == 0)) == 0; // 誤り
a <= x <= b or c <= x <= d のように制約式の or は表現可能ですか?
0-1 整数変数 y を用いることによって表現可能です。
IntegerVariable y(type=binary);
a * (1 - y) + c * y <= x <= b * (1 - y) + d * y;
こう書くと、 y=0
のときは a<=x<=b
となり、 y=1
の時は c<=x<=d
となります。
計算の後処理にすごく時間がかかっています。
もし Nuorium を使われているのであれば、以下のコマンドで実行時間を短縮できます。
options.noDefaultSolout = 1;
このコマンドで Nuorium が使う結果ファイルを出力しないようにできます。
また、一般に解ファイル(モデル名.sol)の出力には問題規模に応じた時間を必要としますが、解ファイルを必要としない場合は以下のコマンドで解ファイルの出力を抑制することができます。これにより計算の後処理時間が短縮されます。
options.outfilename = "_NULL_";
目的関数はなく、とにかく全ての制約を満たす解が欲しいです。
もし問題が全て 0-1 整数変数のみを使って記述できるのであれば、アルゴリズム wcsp タブーサーチが適しています。 wcsp タブーサーチは、
options.method = "wcsp";
とモデルに記述することにより適用されます。
min または max を使いたい。
min 関数, max 関数は C++SIMPLE で記述可能ですが、通常これらを用いることはお勧めしません。 これらの関数を使うことによって問題が非線形になってしまい求解が難しくなってしまうことと、整数変数を用いた問題に適用できなくなってしまうからです。
ここでは最大値の最小化、最小値の最大化といったタイプの定式化を紹介します。まず、目的関数が
minimize max(a,b)
のような最大値の最小化の場合は、以下のように新たに変数を導入して定式化します。
Variable v;
a <= v;
b <= v;
Objective obj(type = minimize);
obj = v;
最小値の最大化に関しても同様のアプローチで行うことができます。
しかしながら、この方法では最大値の最大化や最小値の最小化を行うことができません。 このような場合でも、問題によって定式化可能なケースもありますので、お気軽に 資料請求・お問い合わせ までご連絡ください。
また、Nuorium Optimizer V10 より WCSP では min/max 関数の機能が強化されました。 具体的には min/max 関数の中で最小(大)値が線形式で定義された場合には非常に高速に処理することができます。
詳細は 最適化メールマガジン バックナンバー ( 2008 Vol.1 ) をご覧ください。
最適化のアルゴリズムを切りかえる方法を教えてください。
モデルファイルに以下のように記述します。指定がないと Nuorium Optimizer は問題の性質によって自動で設定します。 solve
関数を呼ぶ場合は solve();
の前にアルゴリズムを指定します。
LP 用アルゴリズム
- LP 専用内点法
options.method = "higher";
- 単体法(整数計画問題にも対応)
options.method = "simplex";
QP (凸) 用アルゴリズム
- 有効制約法(整数計画問題にも対応)
options.method = "asqp";
SDP 用アルゴリズム
- 線形半正定値計画問題に対する主双対内点法
options.method = "lsdp";
- 信頼領域法を用いた非線形半正定値計画問題に対する主双対内点法
options.method = "trsdp";
一般の非線形計画問題用アルゴリズム
- 一般の非線形計画問題用内点法
options.method = "tipm";
ここではよく使われるアルゴリズムを挙げました。Nuorium Optimizer に備わっている全てのアルゴリズムについては Nuorium Optimizer マニュアル をご参照ください。
文字列を添字とする定数にモデルの中から直接値を与えたい。
a[orange] = 5; // 誤り
のようにすると、コンパイルエラーになります。
a["orange"] = 5; // 正しい
のように引用符 (") で囲ってください。日本語や添字の組みあわせを使うこともできます。
b["みかん"] = 5;
c["みかん,個数"] = 5;
変数を定数として扱いたい。
変数を定数として扱いたい場合は、下記のように変数 x に対して等式制約を追加します。
x == 1;
変数 x が添字付けられており一部の要素についてのみ定数として扱いたい場合は、下記のように記述します。
x[2] == 1;
計算に用いるデータによって定数としたい要素が異なる場合は、モデルファイルに
Set S, Fix(superSet=S);
Element i(set=S), fix_i(set=Fix);
Parameter a(index=fix_i);
Variable x(index=i);
x[fix_i]==a[fix_i];
のように記述し、データファイルに
a = [2] 1;
のように、定数として扱いたい要素の成分のみを定義します。
定数の値を変更したい。
モデルファイルの中で Parameter の値を変更して何度も求解したい場合があります。このような場合 Nuorium Optimizer では VariableParameter
を使用します。下記は VariableParameter vp
を x
の下限として利用する場合の例です。
VariableParameter vp;
...
x >= vp;
...
for(i = 0; i < n; i++){
vp = p[i];
solve();
}
Parameter 型の値を double 型として扱いたいのですが。
Parameter
型の値は
(Parameter型).val.asDouble()
と記述することで double
型として扱うことができます。
変数の初期値はどのようにして与えますか。
パラメータ Parameter
と同様に変数 Variable
に値を設定することにより初期値を設定できます。モデルファイル内で設定する場合は、以下のように記述します。
Variable x(name = "x");
x = 1.0;
上記の記述により変数 x
には初期値 1.0 が設定されます。
初期値の設定は、内点法、分枝限定法、wcsp タブーサーチ及び rcpsp タブーサーチにおいて有効で 他のアルゴリズムでは設定された初期値は探索に利用されません。
分枝限定法ではユーザが設定した初期値が制約式を満たす場合に限り採用されます。
wcsp タブーサーチではオプション wcspInitialValueActivation
を "on"
に設定した場合、ユーザの設定した値を初期値として探索が始まります。
rcpsp タブーサーチでは探索における Activity
の初期値を指定することができます。
変数の初期値の設定はどのようなケースで有効なのでしょうか。
初期値の設定は、内点法、分枝限定法、wcsp タブーサーチ及び rcpsp タブーサーチにおいて有効です。
内点法では設定された初期値を探索の出発点として採用します。特に非線形計画問題においては 以下のようなケースで有効である可能性があります。
- 局所解が大域最適解とは保証されないケース
- 実行可能領域が連結でないケース
- 探索点によっては関数評価で浮動小数点エラーが発生する可能性がある場合
分枝限定法では枝刈りに用いられ、実行可能解が見つかりづらいが別のロジックでは見つけやすい場合などに有効です。
実行不可能なケースにおいてすごく時間がかかっています。
問題が実行不可能な場合 IIS 機能において時間を要する可能性があります。いくつかの方法で IIS 機能をオフにすることが可能です。一つはモデルファイルの solve()
前に下記を追加する方法です。
options.iisDetect="off";
もう一つはパラメータファイル nuopt.prm に下記を追加する方法です。
param:iis=off
Element をイテレータとして利用したい
以下のように Element
に付随する集合を OrderedSet
として宣言します。
OrderedSet S = "1 .. 10";
上記のように記述しますと、 Element
をイテレータとして利用できます。 以下記述例です。
Element i;
for(i=S.first();i<S;i=S.next(i)){
.....
}
OrderedSet
の詳細につきましては「 Nuorium Optimizer C++SIMPLEマニュアル 」や「 Nuorium Optimizer C++SIMPLE例題集 」等を参考にしてください。
モデルのビルドにすごく時間がかかります。
考えられる原因の 1 つに以下が挙げられます。
モデリング言語 C++SIMPLE は大規模な問題に対応するため、構造だけをモデルファイル(.smp ファイル)に書いて、係数の値に相当する部分は全てデータファイル(.dat ファイルや .csv ファイル)に記述する思想で実装されています。
例えば線形制約であれば、モデルファイルに
Set Row,Col;
Element j(set=Col);
Element i(set=Row);
Parameter A(index=(i,j));
Parameter b(index=i);
Variable x(index=j);
sum(A[i,j]*x[j],j) >= b[i];
showSystem();
といった記述をし(モデルの構造を示します)、データファイルにおいて
A = [1 1] 1.5 [1 2] 7.2
[2 1] 3.5 [2 2] 1.2;
b = [1] 8 [2] 2;
と記述してデータを与えます。実行すると showSystem() 命令に対応して以下のように解釈されている様子が伺えます。
1-1 (model.smp:8[1]): 1.5*x[1]+7.2*x[2] >= 8
1-2 (model.smp:8[2]): 3.5*x[1]+1.2*x[2] >= 2
もちろん、この程度の規模であれば
1.5*x[1]+7.2*x[2] >= 8;
3.5*x[1]+1.2*x[2] >= 2;
のようにモデルファイルへ定式を直接書いても時間を要することはありません。
ただ、「式の構造を定義して係数はデータで」という使い方に対応するように、C++SIMPLE の記述は大きな計算負荷を計算機に(特にコンパイラに)強いてしまうため、記述が数万行のレベルになると式の解釈に非常に時間がかかってしまいます。したがって、大規模問題においては問題の構造のみをモデルファイルに記載し、係数データをデータファイルから分離して与えなければ実用的ではないことになってしまいます。
一般的な MILP 問題をモデルとデータを分離した格好で記述した例が milp.zip にあります。このような方法であれば、数万変数程度の大規模問題でもソルバー起動までに大きな時間を所要することはありません。
C++SIMPLE のモデル記述には定式の構造を簡便に記述するための道具や tips があるため、マニュアルや例題集などを見て記述方法がわかりにくい点については、お気軽に 資料請求・お問い合わせ までご連絡ください。
異なるバージョンの C++SIMPLE モデルに互換性はありますか?
モデリング言語 C++SIMPLE は、主要な記述法については後方互換性を保ち続けているため、バージョンアップを行っても C++SIMPLE モデルはそのまま使えます。
しかしながら、定式化が同一でも数理計画アルゴリズムを実行する部分の実装は更新を続けているため、数値計算であるという性質上、旧バージョンと新バージョンで完全に同一の結果を与えることは保証できません。
ただ、総体的に考えてプログラムの安定性と精度、速度は、バージョンアップを行うごとに確実に向上していることを確認しております。
もし、旧バージョンと比べて問題など生じた場合は、お気軽に 資料請求・お問い合わせ までご相談ください。
データ入出力
データの入出力方法を教えてください。
Windows 上または UNIX/Linux 上のテキストファイル(C++SIMPLE 独自の形式、CSV 形式)、Excel のセル、ユーザの作成したプログラム(C/C++ の配列)のいずれからでもデータを与え、また結果を出力することができます。モデルはすべての場合で共通に利用できます。Excel のセルからデータを与える場合には、Nuorium Optimizer が提供する Excel アドインを使って指定します。ユーザの作成したプログラムから与える方法については、外部接続マニュアルに具体的に解説されています。Windows では Visual Studio の環境に、UNIX/Linux では gcc や Solaris の CC 等を使ってユーザプログラムと Nuorium Optimizer を連結して、数理計画モデルにデータを与えることができます。PySIMPLE では Python と、RSIMPLE では R と直接データを受け渡しすることが可能です。
Parameter の値を出力したい。
二つ方法があります。まずは .val.print()
を用いる方法があります。
a.val.print();
より細かい出力を行いたい場合は、 simple_printf
を用います。
simple_printf("a=%lf\n",a);
データを読み込んだ結果、意図通りの式になっているか確認したい。
showSystem
関数を用いて展開された式を確認することができます。
showSystem
関数は最終的に構成される目的関数 Objective
、制約式 Constraint
、対称行列 SymmetricMatrix
の具体的な形を出力します。
showSystem();
とすれば、モデル全体の式の形を見ることができます。
また、 showSystem
の引数に制約式を与えることによって制約式の形を見ることができます。 以下のように制約式オブジェクトを定義し、 showSystem
の引数に入れる必要があります。
Constraint c(index=i);
c[i] = x[i] >= 0;
showSystem(c);
データファイル(.dat)で複数の添字を持つ定数を表現したい。
a = [1 2 3] 1.2 [4 5 6] 2.5;
あるいは、
a = [1,2,3] 1.2 [4,5,6] 2.5;
[ ] の中にスペースあるいはカンマ (,) で区切って添字を並べます。 データファイルでは、引用符 (") でかこった文字列はその中の文字を一つと解釈するという意味ですので、
a = ["1 2 3"] 1.2 ["4 5 6"] 2.5; // 誤り
とすると、a が “1 2 3” および “4 5 6” というそれぞれ空白を含んだ一つの要素で添字付けられていることになってしまいますのでご注意ください。また、
a = ["1,2,3"] 1.2 ["4,5,6"] 2.5; // 誤り
も誤りとなります。
CSV ファイルをモデルのデータとして使う例を教えてください。
// モデル
Set S;
Element i(set=S);
Parameter lower(index = i);
Parameter upper(index = i);
Parameter initial(index = i);
のように定義されたパラメータに対して、データファイル(拡張子 .dat を持つファイル)からデータを与える場合には、
// データファイル
lower = [1] 2.1 [2] 3.5 [3] 7.2;
upper = [1] 3.0 [2] 5.0 [3] 9.6;
initial = [1] 2.5 [2] 4.0 [3] 8.1;
のようになりますが、添字の情報 [1]
, [2]
, [3]
が重複してしまい冗長です。 CSV ファイル(.csv) からデータを与えると次のように比較的簡素に表現できます。
i, lower, upper, initial
1, 2.1, 3.0, 2.5
2, 3.5, 5.0, 4.0
3, 7.2, 9.6, 8.1
最初の行は添字とオブジェクト( Parameter
)の名前を、各行の最初の数字は添字を示しています。ただし、CSV 形式は
Parameter p;
Parameter upper(index=i);
の p
と upper
のように異なる添字を持つオブジェクトを一つのファイルで表現することはできません。データファイルなら、
p = 5;
upper = [1] 3.0 [2] 5.0 [3] 9.6;
のように与えることができます。
次のような二次元の添字の Parameter
( cost
)
Set S,T;
Element i(set=S),j(set=T);
Parameter cost(index = (i,j));
には、C++SIMPLE 固有のデータファイルからは
cost = [1,A] 9.2 [1,B] 3.5 [1,C] 7.2
[2,A] 2.1 [2,B] 1.1 [2,C] 0.1;
のように値を与えますが、CSV ファイルなら次のようにそのままのイメージで与えることができます。
cost, A, B, C
1, 9.2, 3.5, 7.2
2, 2.1, 1.1, 0.1
この場合、最初の行はオブジェクトの名前と、二つ目の添字の値 ( A
, B
, C
) を示しています。各行の最初の数字は一つ目の添字の値 ( 1
, 2
) を示しています。ただし、この場合には一つのファイルで一種類の定数のみしか与えることができません。CSV ファイル形式は大規模なデータに向いている書き方となります。
MPSファイルは扱えますか?
コマンドラインからのみ扱うことができます。
MPS ファイル example1.mps を入力として Nuorium Optimizer を起動するには
% nuopt example1.mps
とします。
詳細は「 Nuorium Optimizer マニュアル 」の「MPSファイル・LPファイル」を参照してください。
パラメータファイル nuopt.prm はどのようにして与えますか?
コマンドラインから実行する場合、パラメータファイルは実行時のカレントディレクトリに置くだけで読み込まれます。 正常に読み込まれると
<reading parameter file: nuopt.prm>
と出力されます。
実行結果に表示される "e" は何ですか?
NUOPT の実行結果中の、
RESIDUAL 2.061428123e-09
等に現れる e
は常用対数の基数 (10) となっています。上記の例では 2.061428123 × (10 の -9 乗) を表します。
エラー
実行不可能(infeasible)と出ました。原因を知ることはできますか?
原因を特定する一般的な方法はありません。しかし、線形制約同士の矛盾が実行不可能性の原因となっている場合には、Nuorium Optimizer にはその原因を特定する実行不可能性要因検出機能 iisDetect があります。
Nuorium Optimizer の実行結果として実行不可能(infeasible)と出た場合、求解後出力される解ファイル(モデルファイル名.sol)に IIS が表示されます。IIS は互いに矛盾する制約条件の組のことです。
例えば、以下のモデルを実行すると
Variable x;
Variable y;
Variable z;
x >= 0;
y >= 0;
z >= 0;
x + y <= -1;
Objective o(type=minimize);
o = x + y + z;
解ファイルに以下の IIS が表示されます。
...
%%
%% IIS
%%
-------------------------------------------------------------
#1 model.smp:7 INFS : y+x
<= -1 ( 0)
-------------------------------------------------------------
...
浮動小数点エラーが出ます。
モデルの中に変数の割り算または log などが入っていないでしょうか。変数は初期値を与えないと初期値 0 と解釈されますので変数の割り算や log は浮動小数点エラーの原因となります。
Variable x(index=i);
1/x[i] >= 5; // 0 割りによるエラー
sum(log(x[i]),i) == 1; // log(0) によるエラー
このような場合には変数に
x[i] = 1;
のようにして初期値を与えます。solve 関数を呼ぶ場合は、初期値は solve();
より前に与えてください。
「'Parameter' から 'double' に変換できません」と出ます。
これは、例えば options.eps
の値を Parameter
で渡すときに出ることがあります。 options.eps
に渡す値は double
型である必要があります。 Parameter
から options.eps
に値を渡すには以下のようにします。
options.maxtim = a.val.asDouble();
他の options.maxtim
、 options.maxitn
なども同様です。
最適化結果を simple_printf 等でうまく表示できません。
最適化の結果を simple_printf
、 .val.print()
、 .val.dump()
等で表示/取得するには、これらの処理を solve()
後に記述する必要があります。
モデルの例を以下に示します。
Variable x;
x >= 7;
Objective o;
o = x;
solve(); // 先に記述
simple_printf("x=%f\n", x); // 結果を表示
solve()
を呼ぶ前は初期値(通常は 0)が表示されます。
「xxx.smp がありません」と出ます。
モデルファイル名にはファイルの名前は英文字から始まる英文字と数字または _ (アンダーバー)の組みあわせを使わねばならない、という制約があり、例えばスペースを含むなど、この制約をはずれた名前を使うとこのようなエラーになる場合があります。
以下のファイル名の場合は動作を保証しません。
1tume.smp
(数字で始まっている)this is my model.smp
(スペースを含む)モデル.smp
(漢字などの全角文字を含む)
以下のようなファイル名なら大丈夫です。
model12.smp
My_model.smp
hock7.smp
result.errorCode で取得できるエラー番号の意味を教えてください。
result.errorCode
は Nuorium Optimizer マニュアル にある「付録A Nuorium Optimizer のエラー/警告メッセージ」の「A.1.1 Nuorium Optimizerのエラー/警告メッセージ」のエラー番号に対応しています。
例えば、 result.errorCode = 10
は内点法の反復回数が上限を越えたことを表します。
「MOP warning: The hash table is full.Expanded...」と出ます。
変数 Variable
や定数 Parameter
等の宣言の数が多すぎる場合、このようなエラーが出ます。「集合」と「添字」を用いることにより、変数や定数の宣言を削減することができます。削減方法については「 モデルのビルドにすごく時間がかかります。 」が参考になります。
また、「集合」と「添字」の記述方法については「 Nuorium Optimizer C++SIMPLEマニュアル 」や「 Nuorium Optimizer C++SIMPLE例題集 」等を参考にしてください。
「モデル xxx のビルドに失敗しました」と出ます。
考えられる原因は様々です。1 つの原因としてモデルファイル xxx.smp が書き込み権限のないフォルダに存在する場合が考えられます。特に Vista 以降の Windows においてはユーザー アカウント制御(UAC)により、例えば C:Files (x86) 以下のフォルダ全てに書き込み権限が与えられていないことがあります。まずはモデルファイル xxx.smp が存在するフォルダに書き込み権限があるかを確認してみてください。
原因が不明の場合は、どうぞお気軽に 資料請求・お問い合わせ までご連絡ください。
「sdpin: Impossible asdpin」と出ます。
大規模問題の計算において表示されることがあります。計算結果に影響はありません。
「error: (NUOPT 10) IPM iteration limit exceeded.」と出ます。
内点法の収束状況が悪化しており、反復回数が上限を越えた場合に本エラーメッセージが出力されます。 このような現象は、問題のスケールの悪さなど、数値的な問題に起因することが多いことが経験上知られています。 この問題に対して万能な解決策を挙げることは難しいのですが、以下の方策により回避できることがあります。
- 初期点を変更する
- 自動スケーリング機能を off にする
options.scaling = "off";
- 反復回数上限を上げる(例えば、デフォルトで 150 であれば 300 にする)
options.maxitn=300;
振る舞いが改善されないようであれば、お気軽に 資料請求・お問い合わせ までご連絡ください。
「error: (SIMPLE 67) 参照オブジェクト "x" の添字付けに誤りがあります。」と出ます。
これは、例えば付けられた添字の次元が誤っている場合に出力されます。 例を挙げると Variable x(index=(i,j))
と 2 次元で宣言されているにも関わらず、
x[1] == 1;
というように 1 次元の添字が付けられていると本エラーが出力されます。 ただし、一見 2 次元の添字を付けているように見える場合にも本エラーが出力されることがあります。 例えば先の例ですと、
x[1,1] == 1;
と記述すると出力されます。 このような int 型の値の並びは、C++SIMPLE の仕様で 2 次元の添字とはみなされません。 こちらを 2 次元の添字とみなす方法はいくつかありますが、詳細については以下をご参照ください。
- 最適化メールマガジン バックナンバー ( 2008 Vol.1 )
- 最適化メールマガジン バックナンバー ( 2008 Vol.2 )
- 最適化メールマガジン バックナンバー ( 2009 Vol.4 )
「error: (SIMPLE 70) 条件式に現れる要素 x の使い方に誤りがあります。」と出ます。
sum 関数や制約式の条件式(添字の範囲を限定する式)に余分な添字が含まれていると、このようなメッセージが出力されることがあります。 例えば、 Element i, j
に対して
x[i] >= 0, j > 3;
は、制約の条件式 j > 3
に制約式 x[i] >= 0
に現れない添字 j
が含まれており不適切です。
「error: (NUOPT 26) LP/IP module cannot handle NLP.」と出ます。
上記メッセージは、Nuroium Optimizer V23 以前の製品をご利用で、非線形計画問題を扱えない LP/IP モジュールを使用していて、非線形の制約式もしくは目的関数を含むモデルを実行した場合に出ます。
「warning: (SIMPLE 196) 目的関数がコンスタントとなっています。」と出ます。
目的関数が変数を含まない場合、このような警告が出力されます。例えば、以下のような記述をした場合です。
Objective obj;
obj = 1;
このような警告が出たときは、データがモデルに適切に渡っていないことが多いです。データが適切に渡っているか確認することをお勧めします。
「fatal error C1509: コンパイラの制限 : 関数 'xxx' の例外ハンドラが多すぎます。関数を簡略化してください。」と出ます。
モデルファイルのサイズが大きい場合に出ることがあります。モデルを見直してモデルファイルのサイズを小さくすることにより回避できる可能性があります。
「error C2451: 条件式の型 'Equation' が間違っています。」と出ます。
上記のメッセージは VariableParameter
を含んだ式を if
や while
の条件文の中に記述したときに出ます。以下記述例です。
VariableParameter vp;
...
if(vp == 1){
...
}
これを回避するために、オブジェクトに .val
を付けます。以下修正例です。
VariableParameter vp;
...
if(vp.val == 1){
...
}
「error C2661: 'simple_fprintf' : xx 個の引数を伴うオーバーロードされた関数はありません」と出ます。
C++SIMPLE の関数 simple_fprintf
は 32 個までの値出力までしか対応しておりません。32 個を超える場合は出力内容を分割する等して対応してください。
「error C2679:二項演算子' =':型 'Expression'の右オペランドを扱う演算子が見つかりません」と出ます。
上記エラーは Expression
を他のオブジェクトに代入しようとした時に出ます。以下記述例です。
Expression e;
Variable x;
x = e; // <- エラー
また、 Variable
を使った式の値を VariableParameter
に代入しようとした時も出ます。以下記述例です。
VariableParameter v;
Variable x;
v = x+1; // <- エラー
上記の場合 Variable
そのものではなく、 .val
を付与した Variable
を利用します。以下修正例です。
VariableParameter v;
Variable x;
v = x.val+1; // <- 正しい
(SIMPLE 123) データファイルの (xxx) の定義の付近において文法的な誤りがあります(問題のありそうな文字列 "yyy") と出ます。
データファイルの文字コードに問題がある可能性があります。 Nuorium Optimizer Windows 版で利用可能なデータファイルの文字コードは Shift_JIS (SJIS) のみです。 異なる文字コードの場合は事前に SJIS に変換してください。 Nuorium のファイルメニューにある「文字コードを指定して保存」から SJIS と指定して変換することも可能です。
インストール
インストールをしたが、スタートメニューの MSI Solutions 下に NUOPT フォルダが存在しない。
ウイルス対策ソフトの影響により Nuorium Optimizer のインストールに失敗した可能性があります。 セキュリティに関する対策後にウイルス対策ソフトを一時的に無効にしたうえでインストールを行ってください。
サンプルファイルを実行すると「ビルドができませんでした」と表示されます。
エラーの原因としていくつかのケースが想定されます。
書き込み権限のないフォルダにあるモデルを実行しようとしている
書き込み権限のあるフォルダにモデルを移動して実行してください。 特に Nuorium Optimizer のインストール先にあるサンプルファイルはそのままでは実行できません。 必ず書き込み権限のあるフォルダ(デスクトップ下など)にサンプルファイルをコピーしてから実行してください。
Visual Studio コンパイラが正常にインストールされていない
Visual Studio の再インストールを行ってください。特に「C++ のツールのインストール」が必要となります。 詳細はインストールガイドをご参照ください。
環境変数 PATH の値が不正になっている
環境変数 PATH の値が不正になっている場合(ダブルクォーテーション (") を含んでいるなど)に正常に動作しない可能性があります。 環境変数 PATH の値を正してからモデルを実行してください。
上記で解決しない場合は 資料請求・お問い合わせ よりお問い合わせください。
Nuorium
Nuorium を起動した際、フリーズしたような状態になる。
ウイルス対策ソフトの影響により Nuorium Optimizer のインストールに失敗した可能性があります。 セキュリティに関する対策後にウイルス対策ソフトを一時的に無効にしたうえでインストールを行ってください。
Excel アドイン
Excel を入出力インターフェースとして使いたい。
Nuorium Optimizer の Excel アドインを利用するのが簡便です。Excel アドインについては Nuorium Optimizer Excelアドインマニュアル をご参照ください。
Microsoft Excel 64bit 版で Excel アドインは使えますか?
Nuorium Optimizer V19 より Excel アドインは 32bit 版、64bit 版 Excel に対応しています。
Excel アドインは Microsoft 365 のブラウザ版に対応していますか。
現状対応していません。
外部接続
Nuorium Optimizer を他のプログラムから呼びたい。
大きく分けて、以下の二つの方法があります。 - Nuorium Optimizer 部分を独立した .exe ファイルにして外部プログラムから別プロセスとして呼ぶ。データの受け渡しはファイルベースで行う。 - Nuorium Optimizer 部分を C++ のライブラリ(静的/動的)にして外部プログラムから関数コールする形で呼ぶ。
前者はデータのやり取りをファイルベースで行うために速度の点では不利ですが、プロセスが分かれており入出力データも見えるので扱いやすいというメリットがあります。 実は Nuorium や mknuopt.bat を使う場合はこちらの方法を利用していることになります。 特に速度を追い求める訳でなければ、こちらの方法をお勧めしてます。
後者は余分なオーバーヘッドがない分高速ですが、比較的高いプログラミングスキルが要求され、扱いが難しいというデメリットがあります。 詳細については「 Nuorium Optimizer 外部接続マニュアル 」をご参照ください。
なお、後者については外部接続のサンプルプログラムがパッケージと一緒に配布されてますのでご参照ください。Nuorium Optimizer のインストール先が
C:\Program Files\NUOPT
の場合、
C:\Program Files\NUOPT\SAMPLES\app
に外部接続のサンプルプログラムがあります。
C++ の配列データを Parameter に代入したい。
readD
関数を用います。例えば、以下の 6 つの要素を持つ配列 d
を Parameter
に代入することを考えます。
double d[] = {1,2,3,4,5,6};
1 次元の Parameter p1
に対しては、
p1.readD(6,d);
とすると
p1[1]=1
p1[2]=2
p1[3]=3
p1[4]=4
p1[5]=5
p1[6]=6
と設定されます。また、2 次元の Parameter p2
に対しては、
p2.readD(2,3,d);
とすると
p2[1,1]=1
p2[1,2]=2
p2[1,3]=3
p2[2,1]=4
p2[2,2]=5
p2[2,3]=6
と設定されます。
readD
関数は多次元の配列を受け付けません。上記のように必ず 1 次元の配列を入力するようにしてください。
詳細は「 Nuorium Optimizer 外部接続マニュアル 」の「C/C++の配列の内容の設定」をご覧ください。
Visual Studio 上で 自作の C++ プログラムと Nuorium Optimizer ライブラリをリンクしようとしましたが、失敗しました。
Debug モードのままリンクをしていないでしょうか。 Nuorium Optimizer ライブラリは Debug モードではリンクできません。 Visual Studio 2005 で Debug モードでリンクしようとすると、以下のようなエラーメッセージが出ます。
>libnuopt_MD_m.lib(AdopterImpl.obj) :
error LNK2001: 外部シンボル "__imp__MessageBoxA@16" は未解決です。
...
>fatal error LNK1120: 外部参照 4 が未解決です。
ご自身の C++ プログラムと Nuorium Optimizer ライブラリを接続される場合は必ず Release モードで行ってください。
また、昔のバージョンで作成した Visual C++ プロジェクトをビルドしたり、コンパイラを変更した場合に 設定の違いでリンクエラーが発生することがあります。
例えば、
1>LINK : fatal error LNK1181:
入力ファイル 'libnuopt_ML_m.lib' を開けません。
と表示された場合は、リンカーの設定で Nuorium Optimizer ライブラリの名前を libnuopt_MD_m.lib または libnuopt_MT_m.lib と 変更することにより解決される場合があります。
また、例えば、
1>libnuopt_MT_m.lib(nrset.obj) :
error LNK2001: 外部シンボル "_GetProcessMemoryInfo@12" は未解決です。
1>C:\Program Files\NUOPT\SAMPLES\app\Release\useSolveQP.exe :
fatal error LNK1120: 外部参照 1 が未解決です。
のように表示された場合はリンカーの依存ライブラリに psapi.lib を追加することにより解決される場合があります。
設定の詳細は「 Nuorium Optimizer 外部接続マニュアル 」を参照してください。
「モジュールのコンピューターの種類 'x64' は対象コンピューターの種類 'X86' と競合しています」と出ます。
64bit コンパイラで外部接続を行う場合は、Visual Studio のプロジェクトを 64bit 構成に変更する必要があります。 設定の詳細については「 Nuorium Optimizer 外部接続マニュアル 」をご参照ください。
RSIMPLE
Nuorium Optimizer に RSIMPLE は付属していますか?
はい、V24 から付属しています。
定数の値を変更したい。
RSIMPLE では可変パラメータを利用します。可変パラメータは Parameter
関数の引数 changeable
に TRUE
を設定することにより宣言します。以下は記述例です。
a <- Parameter(changeable = TRUE)
可変パラメータの値の設定は System
関数で System オブジェクトを作成した後に current
関数で行います。以下はその書式です。
current(System オブジェクト名, 変更するパラメータ名) ~ 変更する値
以下の記述例は a
に 3 という初期値を設定しています。
current(sys,a) ~ 3
変数の初期値を設定したい。
変数に対する代入演算 ~
を用いて具体的な値を与えることができます。以下は記述例です。
v0 <- Variable()
v0 ~ 2.5 # v0 の初期値は2.5 とする
v <- Variable(index=j)
v[j] ~ 1 # v[j] すべてに1 という初期値を設定する
System
関数で System オブジェクトを作成した後に値を設定することもできます。以下はその書式です。
current( システム名, 初期値の設定をする変数) ~ 初期値
以下の記述例は Variable
オブジェクト v0
に初期値 2.5 を設定しています。
sys <- System(m)
current(sys,v0) ~ 2.5
その他
電子版のマニュアルはありますか。マニュアルの内容を教えてください。
Nuorium Optimizer の Nuorium Optimizer マニュアル をご参照ください。
Nuorium Optimizer のバージョンを取得したい。
スタートメニューの「MSI Solutions」->「NUOPT 設定」で開く「NUOPT 設定ツール」の「インストール情報」欄の「バージョン」行から取得できます。 開発版であれば Nuorium の「ヘルプ」->「Nuorium について」で開くウィンドウの「製品」タブで「Nuorium Optimizer」行から取得できます。
mknuopt.bat で作成した exe を実行したときの終了コードは何ですか?
最適化成功時には 0 が、失敗時には 1 が返ります。
Nuorium Optimizer のシリアル番号や EID を知りたい。
スタートメニューの「MSI Solutions」->「NUOPT 設定」で開く「NUOPT 設定ツール」の「インストール情報」欄の「シリアル番号」行または「EID」行から取得できます。 または Nuorium の「ヘルプ」->「Nuorium について」で開くウィンドウの「ライセンス」タブの「SerialNo」行または「EID」行から取得できます。
Nuorium Optimizer は外部との通信を行いますか。
インストール時 (ライセンス登録時) に REST API を用いて通信します。 また,モデリング言語 PySIMPLE をpip コマンドでインストールする際、依存モジュール numpy, scipy がインストールされていない、もしくは 古いバージョンの場合、自動にインストールされ外部と通信が発生します。 インストール時にのみ外部との通信を行い、モデルの実行時等その後の利用時には通信を行いません。
ランタイムライセンスでモデリング言語 PySIMPLE の利用は可能ですか。
詳細については 資料請求・お問い合わせ よりお問い合わせください。