2019 年 4 月

目次 .................................................................................................................................... 1
まえがき .............................................................................................................................. 6
この小冊子が対象とする読者 ................................................................................................ 6
この小冊子を、どのように読むか ............................................................................................ 7
IVE で MOSEL 言語を使う .................................................................................................... 7
プログラミング言語環境の使い方 ........................................................................................... 8

第 1 章 イントロダクション .............................................................................................. 9
1.1 数理計画法 .................................................................................................................... 9
1.2

Xpress Product Suite ............................................................................................... 10

1.2.1 製品バージョンについて............................................................................................. 12

第 2 章 モデルを作成する .......................................................................................... 13
2.1 例題 ............................................................................................................................. 13

Ⅰ Getting Started with Mosel................................................................................... 16
第 3 章 線形計画法のモデルをインプットし、そして、解く........................................ 16
3.1 Xpress-IVE を起動し、新しいモデルを生成する ............................................................. 16
3.2 LP モデル ................................................................................................................... 18
3.2.1 Mosel プログラムの一般的な構造 ................................................................................ 18
3.2.2 問題を解く ................................................................................................................. 19
3.2.3 アウトプットの印刷 ...................................................................................................... 19
3.2.4 フォーマッティング ...................................................................................................... 19
3.3 エラーを修正し、モデルをデバッグする ......................................................................... 20
3.3.1 デバッキング .............................................................................................................. 23
3.4 モデルを解き、最適化についての諸統計類を確認し、解を見る ...................................... 24
3.4.1 文字列のインデックス付け ......................................................................................... 26

第 4 章 データ・ハンドリング ........................................................................................ 28
4.1 ファイルからのデータ・インプット ..................................................................................... 28
4.2 Xpress-IVE を起動し、新しいモデルを生成する ............................................................. 29
4.3 パラメータ .................................................................................................................... 30
4.4 修正した後のモデル ..................................................................................................... 31

第 5 章 ユーザ定義のグラフを描く ............................................................................. 33
1
MSI 株式会社 Copy right©2015 All rights reserved

5.1 問題の拡張 .................................................................................................................. 33
5.2 最適化のループ ............................................................................................................ 33
5.3 ユーザの求めるグラフを描く .......................................................................................... 34
5.4 これらのフィーチャーを持った最終的なモデルファイル foliodata.mos .............................. 36

第 6 章 混合整数計画（MIP） ..................................................................................... 39
6.1 問題の拡張 .................................................................................................................. 39
6.2 MIP モデル 1： 銘柄数を制限する ................................................................................. 39
6.2.1 Mosel によるインプリメンテーション .............................................................................. 40
6.2.2 解を分析する ............................................................................................................. 41
6.3 MIP モデル 2： 各銘柄の最低投資額の条件を入れる .................................................... 45
6.3.1 MOSEL で実行する..................................................................................................... 46

第 7 章 二次計画法 ...................................................................................................... 48
7.1 問題の説明 .................................................................................................................. 48
7.2 QP ................................................................................................................................ 49
7.2.1 Mosel で実行する ....................................................................................................... 49
7.3 MIQP ............................................................................................................................ 52
7.3.1 Mosel によるインプリメンテーション .............................................................................. 53
7.3.2 解を分析する ............................................................................................................. 54

第 8 章 ヒューリスティックス ......................................................................................... 57
8.1 バイナリ変数を固定して行うヒューリスティック ................................................................. 57
8.2 Mosel で実行する .......................................................................................................... 58
8.2.1 サブルーチン ............................................................................................................. 60
8.2.2 Optimizer のパラメータと機能 ..................................................................................... 61
8.2.3 トレランスを比較する .................................................................................................. 63

第 9 章 Mosel モデルをアプリケーションに埋め込む .............................................. 64
9.1 deployment テンプレートをどのようにして生成するか ...................................................... 64
9.2 BIM ファイル ................................................................................................................. 65
9.3 テンプレートを修正する ................................................................................................ 66
9.3.1 Mosel モデルの実行 .................................................................................................. 66
9.3.2 パラメータ ................................................................................................................. 66
9.3.3 VB アウトプットの出力先 .............................................................................................. 67
9.4 マトリックス・ファイル ...................................................................................................... 68
2
MSI 株式会社 Copy right©2015 All rights reserved

9.4.1 マトリックスのエクスポート ............................................................................................ 68
9.4.2 マトリックスのインポート ............................................................................................... 68
9.5 Optimization Modeler の開発 ....................................................................................... 70
9.5.1 モデルファイルの準備................................................................................................. 70
9.5.1.1 プロジェクト・アーカイブ ............................................................................................ 71
9.5.2 Optimization Modeler GUI を起動させる .................................................................... 71
9.5.2.1 新規の Optimization Modeler プロジェクトをスタートする ......................................... 72
9.5.2.2 Optimization Modeler プロジェクトを調査する ......................................................... 73
9.5.2.3 モデルデータを修正・編集する................................................................................. 75
9.5.2.4 データシナリオを比較する ....................................................................................... 76

Ⅱ Getting started with BCL ...................................................................................... 78
第 10 章 線形計画問題に入力し、それを解く ........................................................... 78
10.1 BCL でのインプリメンテーション .................................................................................... 78
10.1.1 初期化 ..................................................................................................................... 79
10.1.2 構成......................................................................................................................... 79
10.1.3 モデルを解く............................................................................................................. 80
10.1.4 アウトプットの印刷 ..................................................................................................... 80
10.2 プログラムのコンパイルと実行 ...................................................................................... 80
10.3 ファイルからのデータ・インプット ................................................................................... 82
10.4 アウトプット・ファンクションとエラーの扱い .................................................................... 85
10.5 マトリックスのエクスポート ............................................................................................ 86

第 11 章 混合整数計画法 .......................................................................................... 87
11.1 拡張問題の説明 ......................................................................................................... 87
11.2 MIP モデル 1：様々な株の保有数を制限する .............................................................. 87
11.21 BCL によるインプリメンテーション .............................................................................. 88
11.2.2 ソリューションを分析する ........................................................................................... 89
11.3 MIP2： 各銘柄の最低投資額の条件を入れる .............................................................. 91
11.3.1 BCL によるインプリメンテーション ............................................................................... 91

第 12 章 二次計画法 ................................................................................................... 94
12.1 問題の説明 ................................................................................................................ 94
12.2 QP .............................................................................................................................. 94
12.2.1 BCL で実行する ........................................................................................................ 95
12.3 MIQP ......................................................................................................................... 98
3
MSI 株式会社 Copy right©2015 All rights reserved

12.3.1 BCL によるインプリメンテーション ............................................................................... 98

第 13 章 ヒューリスティックス ..................................................................................... 101
13.1 バイナリ変数を固定して行うヒューリスティック ............................................................. 101
13.2 BCL で実行する ........................................................................................................ 101

Ⅲ Getting started with the Optimizer................................................................... 108
第 14 章 マトリックスのインプット ............................................................................... 108
14.1 マトリックス・ファイル .................................................................................................. 108
14.2 インプリメンテーション ............................................................................................... 108
14.3 プログラムのコンパイルと実行 .................................................................................... 109

第 15 章 線形計画法（LP） の問題をインプットし、解く .......................................... 111
15.1 マトリックス表示 .......................................................................................................... 111
15.2 Xpress-Optimizer によるインプリメンテーション ........................................................... 112
15.3 コンパイルと問題の実行 ............................................................................................. 113

第 16 章 混合整数計画法 .........................................................................................115
16.1 問題の拡張についての説明 ....................................................................................... 115
16.2 MIP1： ポートフォリオに組み込む銘柄数を制限する .................................................... 115
16.2.1 マトリックスによる表現 .............................................................................................. 116
16.2.2 Xpress-Optimizer で実行する .................................................................................. 116
16.3 MIP2： 各銘柄の最低投資額の条件を入れる ............................................................. 118
16.3.1 マトリックスによる表現 .............................................................................................. 119
16.3.2 Xpress-Optimizer で実行する .................................................................................. 119

第 17 章 二次計画法 ................................................................................................. 121
17.1 問題の説明 .............................................................................................................. 121
17.2 QP ............................................................................................................................ 121
17.3 マトリックス表示 ......................................................................................................... 122
17.4 Xpress-Optimizer で実行する ................................................................................... 122

Appendix A さらに理解を深めるには ....................................................................... 126
A.1 Xpress のインストレーション、ライセンシング、トラブルシューティング ............................ 126
A.2 ユーザー・ガイド、参照マニュアル、その他の資料 ....................................................... 126
A.2.1 モデル作成 ............................................................................................................. 126
4
MSI 株式会社 Copy right©2015 All rights reserved

A.2.2 Mosel....................................................................................................................... 126
A.2.3 BCL ......................................................................................................................... 126
A.2.4 Optimizer ................................................................................................................ 127
A.2.5 その他のソルバーおよび解法 ................................................................................... 127

Appendix B グロッサリー ............................................................................................ 128

5MSI 株式会社 Copy right©2015 All rights reservedまえがき
この『Xpress 入門書』という小冊子は、様々な最適化問題を解くために Xpress を使用してどのようにモデル化し、解くかを学ぶための理解しやすい入門書です。この小冊子では、線形問題 (Linear
Programming)、混合整数問題 (Mixed Integer)二次計画問題 (Quadratic Programing)を、Mosel
言語を使用したモデリング方法や、Xpress-Optimizer を使用した解法を掲載しております。
上記の「Mosel モデル」を扱うとき、グラフィカル・ユーザ・インタフェース Xpress-IVE を使います。またこの高水準言語を使用する場合には、モデルを定義する方法として、下記に示す 2 通りの代替的な方法があります。一つは、プログラミング言語環境で、モデルビルダーライブラリ Xpress-BCL を使ってモデルを定義する方法とマトリックス形式で Optimizer に直接入力する方法です。
使用法を説明するにあたり、この小冊子の全体で様々な最適ポートフォリオ選択問題の例題として取り上げています。その他の最適化問題は、”Applications of Optimization with Xpress-MP”（Dash Optimization、2002）に掲載しております。
--*----*--*--*--*--*---*--*---*---*---*---*---*--*---*---*---*---*---*---*---*---*-この小冊子は、Xpress を使用した様々な問題の定式化方法および、解法を掲載しております。小冊子の構成上、基本的な特定機能を取り上げているため Xpress の全機能を説明するものではありません。
<<Xpress 日本配給元 MSI の WEB サイトでは Xpress に関連するホワイトペーパーや各種参考資料、マニュアルを数多く掲載しております。是非、お役立てください>>>>Xpress 日本配給元 MSI WEB サイト：http://www.msi-jp.com/xpress/>>Xpress を初めてご使用の方へ：http://www.msi-jp.com/xpress/biginners.html
・Xpress ダウンロード、マニュアル、例題等を掲載したページです。
>>学習広場：http://www.msi-jp.com/xpress/learning/square/
・Xpress 学習に関する様々な資料を網羅したページです。
--*--*--*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*-この小冊子が対象とする読者
この小冊子は、様々な Xpress 製品の概要やどのように、グラフィカル環境で使用する高水準言語を使用し定義したモデルの使用法を説明しています。本書はソフトウェアのご評価を希望される方にとって、評価の手始めに理想的な一冊となっております。
本書は、線形計画モデルの作成法から出発し、章を追うごとに新しい機能を追加的に実装していきます。Xpress を初めてお使いの方にとって、本書の説明文を確認しながら、少しずつ Xpress の機能や使用法を学び、モデルを数学的に表現することから始め、アプリケーションにモデルを組み込む
6
MSI 株式会社 Copy right©2015 All rights reserved

方法が掲載されている章（9 章）まで読み進めたり、ご自身が学びたい章まで必要に応じて本書をご活用頂ければ幸いです。また上級者向けの最適化技術ヒューリスティック法で解を得る方法も本書に掲載しております。（8 章）
この小冊子が取り上げているトピックは多岐にわたるため、Xpress の使用頻度が少ない方にとってもXpress の使用法などを素早く再確認する際に大変便利な内容となっております。
この小冊子を、どのように読むか
Xpress Product Suite を使用したモデル作成や、作成したモデルの解を得る方法のイントロダクショ
ンや概要をすべて把握するには、本書のすべてに目を通す必要がありますが、特定のトピックにご関心をお持ちの方は、下記のように本書の一部、または章を抜粋してご使用ください。

IVE で MOSEL 言語を使う
本書の最初で示しているアプローチは、問題と解の分析を視覚的に説明しているため、Xpress を初めてご使用の方、数理計画法の初心者や新しいモデルを迅速に開発して現実の場で活用したい方に推奨しているアプローチです。例えば、線形計画法（LP） モデルを開発し、それを何らかの既存アプリケーションに埋め込みたい場合、最初に 4 章を読み、次いで、Mosel モデルを、どのようにしてアプリケーションに埋め込むのかが説明されている 9 章をご確認ください。
Xpress を使用した二次計画（QP） 問題の作成法や解法については、少なくとも 1 章から 3 章、4 章の最初の部分、そして 7 章をご確認ください。また、混合整数二次計画（MIQP） の作成法、解法については、混合整数計画（MIP）を説明している 6 章も併せてご確認ください。ご自身のソリューショ
ンアルゴリズムの実行や、ヒューリスティックを Mosel 言語で実装する方法を知りたい場合は、1 章
7
MSI 株式会社 Copy right©2015 All rights reserved

から 3 章までを読み、次いで、4 章の最初を読んだ後、MIP に関する説明が掲載れている 6 章、それからヒューリスティック関する説明が掲載されている 8 章をご確認ください。

プログラミング言語環境の使い方
プログラミング言語環境でアプリケーション開発を行う場合、2 つのオプションが用意されています。
モデルビルダーライブラリ BCL を使用する方法と問題を直接 Xpress-Optimizer に入力する方法があります。
モデル作成のサポートが必要かつツールを選択するにあたりモデルの実行スピードに重点を置く場
合、モデルビルダーライブラリ BCL をご使用ください。BCL で定義されるモデルオブジェクトにより生成されるコードは、数学的なモデルと相対的に近いのでメンテナンスが容易になります。
BCL は、LP、MIP、および、QP 問題のモデリングをサポートします。（10- 12 章）BCL のモデルイン
プットは、13 章の例で示す通り Xpress-Optimizer を直接呼び出して、ソリューションアルゴリズムの定義と結合することができます。Optimizer への直接アクセスは、マトリックス生成ルーチン（LP 、MIP、および、QP 問題についての 15-17 章参照）を持つアプリケーションを使用した低レベルな統合が主となり、外部で生成した標準フォーマット（MPS または LP）（14 章）で与えられたマトリックスを解くために提供されています。Optimizer の特定機能に直接アクセスできるため、LP、MIP、QP 問
題の解法に自身のアルゴリズムを使用する研究者や専門家に高い評価を頂いております。

8
MSI 株式会社 Copy right©2015 All rights reserved

第 1 章 イントロダクション
1.1 数理計画法
数理計画法は、数学的な最適化のテクニックです。製造業、輸送業、テレコミュニケーション、金融業、人員計画などの多様な分野で現実世界の多くの問題が「数理計画問題」として定式化され、利用されています。数理計画問題は、一組の変数、これらの変数の関係を示す制約式、そらに、最大化、または、最小化される目的関数から成っています。数理計画法の問題は、通常、変数、制約式、および、目的関数のタイプに従って分類されます。線形計画法（LP） 問題には、よく知られている効率的なアルゴリズム（シンプレックス法、内点法）が適用できます。このタイプの問題では、すべての制約式、および、目的関数は、変数の一次式で表現され、変数は、連続変数であり、通常、非負の実数なら、どのような値でも取れます。幸い、多くのアプリケーション問題が、このカテゴリーに含まれる問題です。そして、数十万または、数百万の変数と制約式からなる問題が、Xpress-Optimizer のような、市場で販売されている汎用的な数理計画法ソフトウェアによって、ルーチン的に解かれています。しかし、LP を使っている研究者や実務家は連続変数が離散的な性質（すなわち、yes/no、または、1、2、3、…）を表すには不十分であることにすぐに気付き、混合整数計画法（MIP） が開発されましたが、MIP では、LP と同じように、制約式と目的関数は一次式ですが、変数は、離散的な数
値、または連続的な数値が取れます。このタイプの問題を解くために、LP のテクニックに、離散的な変数の実行可能値を調べる方法が（分枝限定法）が追加されました。このような枚挙型の方法は、相対的に小さい問題であっても、コンピュータの計算処理量が爆発的に増大するため、MIP 問題
を解くとき、常に最適解を求めるのは現実的とはいえません。しかし、近年のコンピュータ・スピードの向上、さらに重要なのは、アルゴリズムが大幅に改善されたこと（例えば、カッティングプレーン・テク
ニックや特別な分枝法）により、従来よりも大きい問題に取り組むことができ、現実世界の状況を、より厳密にモデル化できるようになりました。比較的、効率的に処理できるもう一つの種類の問題は、二次計画法（QP） の問題です。これらの問題は、制約式は線形ですが、目的関数に二次項を持っています。変数は、連続変数でも離散的な変数でもかまいません。もし、変数が離散的な変数である
場合、混合整数二次計画法（MIQP） の問題になります。本書の 7 章、および、12 章で、両方のケースの例を示します。もっとも難しいのは、非線形な制約式や目的関数を持つ問題です。この問題
を非線形計画法（NLP） 問題と呼びます。このような問題の良い（部分最適）解を得るには、ヒューリ
スティックな方法や近似解を得る方法（approximation methods） がよく使われます。このタイプの問題を解く 1 つの方法が、逐次線形計画法（SLP: Successive Linear Programming） で、Xpress-MP suite にこのソルバーが入っていますが、本書では、このトピックについて詳しく説明致しません。モデルを作成し、モデルを解き、そして『解』を実行することは、通常一直線に進む工程ではありません。モデルを作成するときにミスを犯します。そして、ミスの多くは最適化プロセスを行い、アンバウンデッドな解を得たとき、実行不能解を得たとき、または私達の直観と一致しない答えを得た
りすることで、初めて発覚します。このような解を得た場合、モデルを良く調べ、モデル内のミスを正し、モデルを再度解き、得た最適解をさらに詳しく分析するという繰返し作業が必要です。このプロセス
9
MSI 株式会社 Copy right©2015 All rights reserved

中に、制約式を追加したり、または誤って入れてしまった制約式を削除したり、誤ったデータを訂正したり、以前は必要と考えていなかった新しいデータを集めたる必要性も出てくるかもしれません。

この小冊子を読み進むと、読者はテキスト形式の記述から数理計画モデルを作成し、解を得るまでの全ステップを経験できます。以下の章では、結果の分析をサポートする方法のイントロダクション
を含め、様々な改善方法やモデルへの追加、モデルの再定式化などについて学びます。一般的に数理計画法のアプリケーション開発とは、開発したモデルを他のアプリケーションに組込み、会社の情報システムの一部にする作業も含まれます。

1.2

Xpress Product Suite

様々なユーザの多様なニーズやお好みに対応するため、Xpress 製品 Suite には、モデルを作成し、最適化を行うためのツールがいくつかあります。
1. 高級言語
Xpress-Mosel 言語により、ユーザは、数学の数式表記に近い形式でモデルを定義でき、またそれを使って同一環境で解を得られます。Mosel のプログラミング機能であるこの高級言語の中で、ソリューションアルゴリズムを、直接実行することができます。Mosel は、スタンドアロンとして使えますしまたその他、多くのツール、特にグラフィカルなディスプレイを提供する Xpress-IVE 開発環境を通して使うこともできます。Mosel 環境は、「モジュール概念」に基づいて構築されているので、Mosel 環境への追加が認められています。 FICO 社から提供されているモジュールには、Xpress-Optimizer（LP 、MIP、QP） 、Xpress-SLP、（例えば、ODBC 経由による）データ・ハンドリング機能、システム
機能へのアクセスなどがあります。さらに、Mosel ネイティブインタフェース経由で、ユーザは必要に応じて（例えば、問題固有データの処理を行う、外部のソルバーや、ソリューションアルゴリズムと接続するなどの）ユーザ自身のモジュールを定義することで新しい機能を、Mosel 言語に追加することができます。

10
MSI 株式会社 Copy right©2015 All rights reserved

2. 埋め込みライブラリ
数理計画モデルを大規模なアプリケーションに埋め込む方法に、2 つのオプションがあります。最初のオプションは、Mosel 言語を使って開発したモデルを、Mosel ライブラリを通して、プログラミング言
語環境（例えば、C、C++、Java など）から実行し、アクセスします。また、一部のモジュールでは、プログラミング言語環境から、それらの機能に、直接、アクセスすることもできます。2 番目のオプションは、
モデルビルダーライブラリ Xpress-BCL のサポートを受け、プログラミング言語の中で、モデルを直接、開発する方法です。BCL により、ユーザは専門のモデリング言語と類似したオブジェクト（変数、制約式、インデックスセット）を使ってモデルを定式化できます。すべてのライブラリが、C、C++、Java、
および、Visual Basic（VB） で利用可能です。

3. ソルバーへダイレクトにアクセス
一番低いレベル、すなわちもっとも直接的なレベルでは、ライブラリという形式、または、スタンドアロ
ンで、Xpress-Optimizer、Xpress-SLP に、直接アクセスできます。この機能は、Optimizer を専門の
マトリックス生成ルーチンを持つアプリケーションに埋め込む際に」便利です。Xpress の上級ユーザ
は、例えば、以前に Mosel や BCL で生成したマトリックスを使って、いろいろなインタフェースを通しては利用できない Optimizer の特別な機能を使いたい場合があるでしょう。
上記の 3 つアプローチで、高水準言語は、確かに数理計画法への最も理解しやすいアクセスでしょう。したがってこの小冊子では、Xpress-Mosel 言語を使った問題の定義方法、その問題の求解法や Mosel ライブラリを使い、作成されたモデルをアプリケーションに埋め込む方法を重点的に説明していきます。以下では、Mosel モデルをベースに、グラフィカル・ユーザ・インタフェース Xpress-IVE
を使い、Xpress-IVE の持つ機能を有効活用してデバッグ、解の分析、ディスプレイする方法を説明します。
この小冊子では、直接プログラミング言語環境のなかで、どのように数理計画法問題を定式化し、そして解くかについても説明していきます。この説明は BCL、または直接 Xpress-Optimizer ライブラリ
11
MSI 株式会社 Copy right©2015 All rights reserved

を使用したモデル作成サポートを利用します。BCL では、モデルは、その数学的な表現に近い形式
で定式化されるため理解しやすく、メンテナンスしやすいものとなります。この小冊子では、Mosel で使われるのと同じ問題を使って、BCL の使い方について説明します。この小冊子の最後の部分で、（例えば、Mosel や BCL などの、別のツールにより生成される）ファイルのマトリックス形式の問題やア
プリケーションプログラムにあるマトリックスを、どのように、直接 Optimizer に入力するかを説明します。また、Optimizer ライブラリを直接、使う機能はモデルをアプリケーションに埋め込む方、Xpressの上級ユーザ向けです。数理計画法の初心者にはお勧めできません。

1.2.1 製品バージョンについて
この冊子に掲載されている Mosel の例題は、Xpress7.7 を使用しています。（Mosel 3.6.0）IVE の画像
はリリース 7.0.1 を使用しています。（IVE 1.20.05）モデラーの例題は、Xpress7.8 で開発しています。
BCL の例題は Xpress7.2 で提供している BCL4.40 で開発しています。Optimizer の例題はXpress7.1(Optimizer 21.0.3)で開発しています。例題をその他製品バージョンで実行した場合、アウ
トプットが異なる場合があります。特に、アルゴリズムの改良や Xpress-Optimizer のデフォルト設定の修正が LP サーチの動きや MIP 分枝限定法の細部がが異なる場合があります。IVE インターフェー
スは次回のリリース版で新しい機能が追加されるため変更点が若干ありますがこの冊子に掲載されている動作には影響がありません。

12
MSI 株式会社 Copy right©2015 All rights reserved

第 2 章 モデルを作成する
この章では、記述的に書かれた現実の世界の問題を、どのように数学モデルに変換するかについて、詳細に説明します。ここで使用する例題：最適ポートフォリオ選択問題は、この小冊子全体で使用していく問題です。
数理計画法に関する経験値は必要ありませんが、読者が未知の量を表すのに使用する x や y な
どの記号の使用や、これらの変数を使う簡単な一次式や一次不等式に慣れていることを前提とします。例えば、

は、「x で示されている量と y で示されている量の合計は、6 以下であるか、6 でなければならない」ということを示しています。また、読者は、「一組の変数の合計」という考え方にも慣れている必要があります。例えば、producei という表現で製品 i の生産量が示されるとするなら、ITEMS という集合のす
べての品目の全体の生産量は、下記のように表現されます。

これは、「集合 ITEMS の中のすべての製品 i の生産量を合計する」ということを意味しています。
この小冊子でよく使われるもう一つの数学記号は、∀という全称記号（「集合に属するすべてにたいして」と読む）です。例えば、仮に、ITEMS が要素 1、4、7、9 から成っているとすると、上の表現は、下記の不等式全体の省略表現となります。

上記のような数学的表記法の使用を拒まないなら、モデル作成言語を使うことは簡単です。

2.1 例題ある投資家は、一定の金額を投資したいと考えています。彼は、投資対象として 10 種類の証券（株式）を評価しています。彼は、１年間での投資リターンを評価しようとしています。下の表は、個々の株がどこの国の株か、またリスクカテゴリー(R：高いリスク、N： 低いリスク)を示し、さらに予想収益率（ROI） を示しています。投資家は投資についてある方針を持っています。リスク分散に、どの株に投資してもよい額は最大で資本金の 30%です。さらに彼は少なくとも資本金の 50%は北米の株式に投資し、最大三分の一はハイリスクの株に投資したいと考えています。最大の予想リターンを得るた
13
MSI 株式会社 Copy right©2015 All rights reservedめには、資金をどの株式に、それぞれ、いくらずつ投資したらよいのでしょうか。

数学的モデルを作成するために、まず、最初に、ソリューションを得るために必要な決定が何であるかを識別しましょう。このケースでは、各株式をいくらずつ、ポートフォリオに入れたらよいか、ということです。したがって、意思決定変数を定義します。この変数は、各株式に投資される資金を示します。ということは、これらの変数は 0 から 1 までの間の値を取ることを意味します（したがって、1は投下資本の全体を意味します）。実際、すべての変数は、投資家が銘柄ごとに投資しようとしている最大金額で制限されています。
すなわち、最大でも投資額の 30%です。こうして、下の制約式は、変数の 取りうる値を制限します。（「SHARES のすべての s に関して･･･」と読んで下さい)。この問題の数学的な定式化の中で、SHARES により、投資家が投資の対象としている銘柄の集合を表し、RETs により、銘柄ごとの 1 株あたりの予想 ROI の集合を表します。また NA は、北米銘柄の部分集合を表し、RISK はハイリスク
銘柄の集合を表します。投資家は、用意している資本を、すべて、投資したいと思っています。すな
わち、いろいろな銘柄に投下される資金割合を合計すると 100%にならなければなりません。このこと
を下の等式で表現します。

続いて、投資家が決めた二つの方針を表現する必要があります。すなわち、最大でも、ハイリスク銘
柄に投資する金額は、全体の 1/3 と決めていますので、以下の制約式を得ます。

また、この投資家は、少なくとも投資する金額の 50%は北米銘柄に投資する方針があるので、以下の制約式を得ます。

これら二つの制約式は不等式の制約式です。投資家の目的は、すべての銘柄への投資リターンを最大化することです。すなわち、下記の値を最大化することです。

14
MSI 株式会社 Copy right©2015 All rights reservedこれが、この数学モデルの目的関数です。上の制約式、および、目的関数をまとめると、下記のようなこの問題の数学的モデルの定式化が得られます。

次の章ではこの数学的なモデルを Mosel モデルに変換し、Xpress-Optimizer で解く方法を説明します。また、第 10 章では、この目的のための BCL の使用法、第 15 章では、モデル作成サポート
を使わずに、このモデルを Optimizer に直接入力する方法を説明します。

15
MSI 株式会社 Copy right©2015 All rights reservedⅠ Getting Started with Mosel
第 3 章 線形計画法のモデルをインプットし、そして、解く
この章では、第 2 章で定式化した例題の Mosel モデルへの変換方法、モデルを Optimizer に直接入力する方法を説明します。
・Xpress－IVE を起動する・

Mosel ファイルを作成し、保存する・Mosel 言語を使い、モデルを入力する

・

エラーを訂正し、モデルをデバッグする・モデルを解き、IVE の LP 最適化ディスプレイを理解する・解を見て、確認し、現実世界の問題という観点から、その妥当性を検証して、正しいかどうかを理解する。

第 10 章では、同じ例題を、BCL を使ってどのように定式化し、解くかを、また、第 15 章では、
Xpress-Optimizer に、直接、問題は入力して解く方法について説明します。

3.1 Xpress-IVE を起動し、新しいモデルを生成する
これから、Xpress-IVE のグラフィカル環境で、Mosel モデルを開発し、実行してみましょう。
Xpress-IVE の標準インストールが済んでいればデスクトップのアイコンをダブルクリックもしくは、の順で進み、プログラムを起動させてください。また、DOS ウィンドウに ive とタイプ入力するか、または PC 内にモデルがある場合はモデルファイル（拡張子.mos を持つファイル）をダブルクリックするとプログラムが起動します。起動後、Xpress-IVE はいくつかの枠に分割されているウィンドウが表示されます。

16
MSI 株式会社 Copy right©2015 All rights reservedこのウィンドウの上部には、メニューバーとツールバーがあります。左側のウィンドウは poject bar であり、底部には info bar が、そして、右のウィンドウは run bar です。これらの bar は、View メニューを使ったり、トグルボタンを使ったりして調整できます。元の表示に戻るには View>>Repair
Window Layout を選択するか restore ボタン

を選択します。真ん中の灰色のウィンドウは、ワーキングファイルが表示される場所です。
新しいモデルファイルを作成するには、File >>New を選択するか、ツールバーの最初のボタンをクリックして下さい。これにより、ダイアログウィンドウが開き、ここでディレクトリを選び、新しいファイルの名前を入力します。ここでは、新しいファイルの名前として、foliolp という名前を入力しましょう。
Mosel ファイルの拡張子.mos は自動的に付加されます。選択を確定するために、Save をクリックして下さい。こうすると、IVE の真ん中のウィンドウは、灰色から白に変わり、カーソルがその最上段に置かれ、モデルを入力する準備が整いました。

17
MSI 株式会社 Copy right©2015 All rights reserved

3.2 LP モデル
前章の数学的モデルは、IVE では、以下のような Mosel モデルに変換できるでしょう。

ここでたった今、上に書いたことが「何を表現しているか」を理解しましょう。

3.2.1 Mosel プログラムの一般的な構造
どの Mosel プログラムも、キーワード model から始まり、その後ろに、ユーザが選択したモデル名が続きます。そして、Mosel プログラムは、キーワード end-model で終わります。
すべてのオブジェクトは、それらがアサインメント・ステートメントにより、明確に定義されない限り、
declarations セクションで宣言されなければなりません。例えば、は、Return が線形の制約式であり、それに、下の内容が割り当てられています。
18
MSI 株式会社 Copy right©2015 All rights reserved

・SHARES は、いわゆる range set－ すなわち、ここの連続する整数の集合（このケースでは、1から 10 まで)

・

RISK と NA は、簡単な整数の集合

・

RET は、セット SHARES によってインデックスを付けた実数の配列であり、その値
は declarations で割り当てられる・

frac は、セット SHARES によってインデックスを付けられる mpvar という変数の配列。これらはこのモデルの決定変数。

モデルは、次いで、目的関数、2 つの線型の不等式の制約式、1 つの等式の制約式、および、
変数の取り得る数値の上限（アッパー・バウンズ）を定義します。数学モデルの中で、forall ループを使用したのと同じように、集合 SHARES のインデックス付けに forall ループを使用します。

3.2.2 問題を解く
maximize というコマンドにより、線形の目的関数 Return の値を最大化するために、
Xpress-Optimizer が呼ばれます。Mosel 自身はソルバーではないので、モデルの最初で、下記のステートメントにより、Xpress-Optimizer を使うことを指定します（モジュール
mmxprs の説明は、「Mosel 言語の参照マニュアル」に掲載しています）。

目的関数 Return を定義する代わりに、次のように書いても同じです。

3.2.3 アウトプットの印刷
Mosel プログラムの最後の 2 行により、変数すべての最適解と解の値が印刷されます。
空のラインを追加プリントするには、単純に、（argument なしで）writeln とタイプして下さい。単一のラインにいくつかのアイテムを書くには、writeln ではなく、write を使って下さい。

3.2.4 フォーマッティング
より読みやすくするために、モデル内での字下げ、スペース、および、空行を追加しました。これらはMosel では無視されます。
改行：下のように、セミコロンで分離することで、いくつかのステートメントを単一のラインに書くことができます。

19
MSI 株式会社 Copy right©2015 All rights reservedしかし、特別な「ライン終わり」を示したり、継続を示す文字はありませんので、複数の行に跨るステートメントのすべての行は、演算子（+ 、>、=など）、または、’ ,’のような文字で終わらせ、そのステートメントが終わっていないことを明確にします。また、上のプログラム例に見るように、Mosel でコメン
ト行を入れるには、先頭に、！を入れます。複数行のコメント行を入れるには、！ではじめ！で終わらせます。

3.3 エラーを修正し、モデルをデバッグする
前のセクションでモデルを入力したので、それを実行しましょう。実行とは、すなわち,この最適化問
題を解き、結果を取り出すことです。Build >>Run を選択するか、runbutton

をクリックして下さい。

最初にモデルのランを行うとき、おそらく、`Compilation failed. Please check for errors.' というメッセージが出てくるでしょう。例えば、下の Figure 3.2 に示すように、一番下のウィンドウに、Mosel により生成されたエラーメッセージが表示されます。

前のセクションでリストされているモデルは、正しく入力されたものが表示されていますが、このモデルを入力する時、意識的に間違えて入力してみて下さい。例えば、RET から始まる行の最後の ‘ ]‘ を入力しなかったとします。そうすると、それに対応するエラーメッセージが出てきますので、それをクリックすることにより、モデルに対応したラインがハイライトされます。この場合、出てくるエラーメッ
20
MSI 株式会社 Copy right©2015 All rights reservedセージは下記の通りです。

このメッセージをクリックすることで、シンタックス・エラーのある下記の行がハイライトされます。

この例では、明らかに閉じ括弧を追加して、RET の定義を完結する必要があります。
定義が次の行に跨ぐ場合は、この行の最後の位置にコンマを追加し、定義が次の行に続くことを明示します。次に、下記のようなメッセージが出てきたとします。
ここをクリックすると、という行がハイライトされます。
warning は、モデルの実行を妨げませんが、Mosel コンパイラは、このラインには意味がないと言っているので、なにかが間違っているにちがいありません。ここでエラーを見つけるのには、非常に注意深く書かれていることを調べる必要があります。そうすると、ここでは、 ‘ := ‘ ではなく、’= ‘ が使われていることがわかります。Return は、右辺の合計に対応すると定義されなければならなかったので、このステートメントは意味がないと判定されたのです。このエラーを訂正した後に、再び、モデルを実行せようとした場合、次のエラーメッセージの修正を忘れていたので、下記のメッセージが出てきました。

21
MSI 株式会社 Copy right©2015 All rights reserved上記のエラーは下記の行にあります。

maximize という手順は、モジュール mmxprs によって定義されています。しかし、実は、Mosel モデルの最初に、下記の行を入れるのを忘れていました。これを追加すると、モデルは正しくコンパイルされ、エラーメッセージは出てこなくなりました。

モジュールから何が提供されているかを簡単に知るために、モジュールブラウザという機能があります。これを利用するには、Modules >>List available modules と選択するか、ボタンをクリックして下さい。これにより、一つのウィンドウが開きますが、そこには、インストールされている
Xpress で利用可能なモジュールがリストされており、また個々のモジュールにより Mosel 言語に追加されている機能（サブルーチン、タイプ、定数など）を詳細にチェックすることができます。
ユーザは、モデルをタイプ入力しているときに、Mosel キーワードの正しい名前を思い出せないときには、IVE エディタのコード完成(code completion)機能を使えます。これには、CRTL とスペースバー
キーをホールドダウンして、キーワードのリストを出し、必要なものを選択して下さい。

22
MSI 株式会社 Copy right©2015 All rights reserved

3.3.1 デバッキング
ユーザがモデルに実行して欲しいことを、モデルが実際に実行してくれるか、どうかを保証することにはなりません。例えば、データの初期設定を忘れたとか、または変数と制約式が意仮に、モデルがMosel の観点から文法的に正しいとしても、当然のことですがこのような理由から、Mosel により生成されたものが何であるかを、十分マトリックスをチェックする必要があります。こうして、モデルを実行
して解く前に、一時、先に進むのを休止します。ここで、Build >>Options を選択するか、run options
buttonをクリックして下さい。表示されるダイアログウィンドウの中で Pause のところの view

matrix をチェックし、Apply で確認して下さい。こうしておくと、モデルのランを実行すると、ランを実行する前に、IVE workspace の右側の run bar で、マトリックスが表示されます。

上の部分に、マトリックスの一般的な構造が示され、そして、下の部分では、単一の係数にズームイ
ンでき、その値が示されます。このディスプレイは、正の係数を青で示し、負の係数は赤、0 の係数は、白、または、灰色で表示します。このモデルでは、3 つの制約式が示されていますね。ここでは、常にマトリックスの制約式は、モデルでの定義の順番の逆になっているので、気を付けて下さい。上で示したマトリックスディスプレイでは、そのままでは、Mosel モデルで与えた変数名は式のモデルで使った名前を Optimizer にロードすることができます。それには、Optimize を呼ぶ前に（すなわち、
maximize (Return)の前に）、下記の行を追加します。モデルのランを実行する前に、モデルに小さな追加を行うと、変数と制約式のモデルで使った名前を Optimizer にロードすることができます。それには、Optimize を呼ぶ前に（すなわち、maximize (Return)の前に）、下記の行を追加します。
setparam("XPRS_LOADNAMES", true)
こうすると、マトリックスディスプレイは、モデルで使った名前を表示するようになります。こうすると、ス
23
MSI 株式会社 Copy right©2015 All rights reservedクリーンディスプレイの中で、もう一つ、別の変化が起こります。今度は、workspace の左のウィンドウ
を見て下さい。そこには、モデルで定義されたすべてのエンティティが表示されています。そこで、’+ ‘ サインをクリックすると、すべての情報を見ることができます。
カーソルをいろいろなエンティティ上をゆっくり動かすと、その時点での、それらのエンティティの内容、およびステータスが表示されます。これにより、ユーザは、例えば、インデックスセットやデータ配列の内容をチェックし、配列 frac は、実際に、10 個の変数から成っているということが確認できます。
ユーザは、またエンティティをダブルクリックして新しいウィンドウを出し、エンティティの値の完全な内容を見ることもできます。これは、配列が大きいときに、特に便利です。さらにエンティティをクリッ
クすると、infobar に、エディタで記述された文が示されます。
モデルの実行中にエンティティの値などを確認するには、IVE debugger を使います。
Debug>>Start/Continue を選択し、デバックのスタートや停止は ボタンをクリックしてください。
デバックメニュー内のデバックボタンでは標準的なデバック作業(例えば、ブレイクポイントの設定、カーソル位置でモデルを実行する、またはモデルをステップ・バイ・ステップで実行する)が行えます。
モデルの実行に進むには、pause button をクリックして下さい。また、モデルの実行を止めるためには、stop button をクリックして下さい。

3.4 モデルを解き、最適化についての諸統計類を確認し、解を見る
前のセクションで説明したように、モデルを実行するには、Build >>Run を選択するか、
run button

をクリックする必要があります。実行が成功すると、スクリーンディスプレイは、

Figure3.5 のように変わります。

24
MSI 株式会社 Copy right©2015 All rights reservedこの解は、ポートフォリオは銘柄 1、3、5、6、および、9 からなり、そのとき、最大のリターンと銘柄 6 に各 30%、銘柄 3 に 20%、銘柄 9 に 13.3333%、銘柄 5 に 6.6667%が使われます。ここで、すべての制約
式が、実際に満たされていることは容易に確認できます。この解では、確かに 50%が北米銘柄に投資されており（銘柄 1 と銘柄 3)、33.33%がハイリスク銘柄です。（銘柄 3 と銘柄 9）
ここで、Stats タブを選び、Figure3.6 の詳細な LP optimization information を得ます。
ウィンドウの上の部分は、オリジナル、および、presolve 後のマトリックスについての統計が示されます。ここで、presolve とは、マトリックスを簡略化したり、変換したりするいくつかの数値的な操作を適用することを意味します。中央部分は、どの LP アルゴリズムが使われたかを（この例では、Simplex法）、また、イタレーションの数、そして、このアルゴリズムが要した時間の長さを示します。下の部分
は、IVE の様々なディスプレイにより必要とされたオーバーヘッド時間をリストします。この問題は非常に小さいので、ほぼ即座に解かれました。この問題では、「制約式」の項に目的関数のみがリストされていることに注意して下さい。
モデルによりプリントされるものよりも、さらに詳細なソリューション情報を見るには、ウィンドウのエンティティディスプレイに行き、’ + ‘サインをクリックして、変数と制約式を開いて下さい。いろいろなエンティティの上でカーソルをゆっくり動かすと、すべてのソリューション情報が表示されます（大きい配列の場合は、エンティティをダブルクリックして、エンティティ値の内容をすべて表示する新しいウィンドウを開いて下さい）これは、このモデルで名前を割り当てられた唯一の制約式であるからです。
25
MSI 株式会社 Copy right©2015 All rights reserved

3.4.1 文字列のインデックス付け
アウトプットを、もっと、読み易くするために、数字によるインデックスを、ストリング(文字列）によるインデックスで置き換えるのはよいアイディアです。この例題では、下記の 3 行の declaration line を下記の表現に置換します。

ここで、インデックスを使い RET 配列の初期化を行います。

ここまで進んでくると、これ以上の変更はありません。
修正したモデルを foliolps.mos としてセーブします。ストリング・インデックスで置き換えたモデルを解き、プリントすると下記のようになり、この方が、結果が読みやすくなります。

26
MSI 株式会社 Copy right©2015 All rights reservedもちろん、エンティティディスプレイにもまたこれらの文字列で表記されます。

27
MSI 株式会社 Copy right©2015 All rights reserved

第 4 章 データ・ハンドリング
この章では、Mosel のデータ・ハンドリングについての基本機能について説明します。
・ Mosel 固有のフォーマットによるデータの読み込み、書き込みのための Initializationブロック
・ フリーフォーマットによるファイルへのデータアウトプット・ ファイル名、数値的制約式のパラメータ化（parameterization）
・アウトプットのフォーマティング

4.1 ファイルからのデータ・インプット
Mosel では、外部ファイルから、いくつかの方法でデータの読み込み、また書き出しができます。理解
しやすくするためここでは、解説をテキストフォーマットのファイルに限定します。例えば Mosel は、
ODBC 接続を使って、データをスプレッドシートやデータベースと交換するための特別なモジュールも持っていますが、これはこの本の範囲を越えていますので、興味のある読者はこれらのモジュールについてのドキュメントを参照して下さい。
これから使うデータファイル folio.dat は、以下の内容を持っています。

モデルファイルと同じように、データファイルの中でも、’! ‘ を前につけて、単一ラインのコメント行が挿入できます。すべてのデータエントリは、モデルの中の対応するエンティティに与えられた名前でレイベル (label)されます。データアイテムは、blank、tabulation、linebreak、または、comma で区切ります。ここで、第 3 章の Mosel モデルを次のように修正します。

前のモデル foliolp.mos とは異なり、すべてのインデックスセットとデータ配列は、dynamic object とし
28
MSI 株式会社 Copy right©2015 All rights reserved

て作られています。すなわち、これらのサイズは、モデルの作成時点では未知です。後で、ファイル
folio.dat から読み込まれるデータによって設定されます。オプションで、ファイルからの初期設定の後に、それらを静的にセットすることもできます。これにより、後で宣言され、これらのセットでインデックスを付けられる配列の扱いが効率的になります。さらに重要なことは、仮にセットが動的のために、検出できない’out of range’ エラーを静的にセットする事により、Mosel がチェックすることができす。
ここでは、セット SHARES を明示的に設定していないことに注意して下さい。これらは、配列 RETが読まれたとき、自動的に埋められます。さらに、ここでは、データを初期設定した後に、したがって、
インデックスセットが知られた後に、変数を declare していることに注意して下さい。

4.2 Xpress-IVE を起動し、新しいモデルを生成する
前のセクションの initializations from と同様、Mosel には、initializations to もあります。
これは、標準フォーマットでデータを書き出すためのものです。しかし、ファイルに、IVE のアウトプッ
ト・ウィンドウに表示さているテキストを、そっくりそのまま、あるファイルに書き出したい場合は、次のよ
うにして、手続き fopen と手続き fclose を call し、このテキストのプリントを囲むだけです。

fopen の最初のアーギュメントは、アウトプットファイルの名前であり、2 番目は、それをどのモードで開くかを示します。上の設定では、モデルを再実行すると、アウトプットのファイルの内容は置換されます。既存のファイル内容に新しいアウトプットを付加するには、下記のようにします。

また、アウトプットの体裁をよくしたい場合には、例えば、下のようにします。

関数 strfmt は、ストリング、または、数をプリントするのに、最小のスペースを確保することを示します。2 番目のアーギュメントの負の値は、印刷が左詰で行われることを意味します。3 番目のアーギュ
メントはオプショナルなアーギュメントで、これで小数点の後の桁数を指定できます。このフォーマッ
トされた方法で、アウトプットファイルは以下のようになります。

29
MSI 株式会社 Copy right©2015 All rights reserved

4.3 パラメータ
一般に、良いモデル作成のスタイルと考えられていることは、できるだけ生の数字を直接、定義して、実行の際にそれらを外部のソースから読み込むようにします。そうすると、モデルは、用途が広くなり、いろいろな目的に使えるようになって、融通が利くモデルになり、容易に何度も再使用できるようになります。したがって、Mosel では、例えば、ファイル名や数字の定数をパラメータという形で定義することが可能です。これらのパラメータの値は、モデル自身に手を加えることなく、実行のときに修正できます。ここの例で言えば、インプット/アウトプットファイルをパラメータとして定義したり、また、制約式やバウンズの定数(’RHS: right hand side’) についても同様です。これらのパラメータ定義は、モデルファイルの最初（uses ステートメントのすぐ後）のに置く必要があります。

勿論、この方式を使うときは、モデルの他の部分のファイル・ネームやデータの値もパラメータに置き換えなければなりません。IVE によってモデルを実行する時に、これらのパラメータの設定を修正す
るには、Build >>Run を選択するか、run button

をクリックして下さい。開かれるダイアログボック

スで、Usemodelparameters というフィールドにチェックを入れ、次の行で、パラメータの新しい値を入力します。例えば、Figure4.1 のように、結果の出力ファイルの名前を変更し、MAXRISK とMAXVAL の値を修正します。

30
MSI 株式会社 Copy right©2015 All rights reservedIVE の開発環境でモデルを単純にランするのではなく、テストや実験（バッチモード、コマンドライ
ンインタフェースを使っているスクリプト）、最終的な開発（8 章を見てください）の場合には、パラメータの利用がとても重要であることを、是非、記憶に止めておいて下さい。例えば、種々のパラメー
タ設定でバッチファイルを書き、モデル foliodata.mos を繰り返し実行し、毎回、アウトプットを違うフ
ァイルに書きたいとします。そんな場合、単に以下の４行をバッチファイルに追加すればよいのです（そして、コマンド mosel で呼び出されるスタンドアロンバージョンの Mosel でモデルを実行します。）

パラメータ使用のもう一つの利点は、モデルが BIM ファイル（portable, compiled Binary Model files
として配布される場合、それらのモデルをパラメータでランするようにしておけば、モデル自身を開示する必要がなく、したがって、知的所有権を保護できます。

4.4 修正した後のモデル
この章で解説したすべての機能をモデルファイル foliodata.mos は、次のようになります。

31
MSI 株式会社 Copy right©2015 All rights reserved

32
MSI 株式会社 Copy right©2015 All rights reserved

第 5 章 ユーザ定義のグラフを描く
この章では IVE を使って、どのようにしてユーザ定義のグラフを描くかについて説明します。表示したいグラフは、異なるパラメータ設定によって、モデルを繰り返し実行した結果をグラフにするものです。したがって、最初に、下記の事項について、Mosel 言語で簡単なアルゴリズムを書く例題を使って説明していきます。
・ 制約式を定義し直す
・最適化を繰り返す
・ソリューション情報を保存する・ユーザーグラフを定義する：点、線、レイベル
・簡単なプログラム作成（ループと選択）

5.1 問題の拡張
最適ポートフォリオ選択で考慮してきたデータ（第 2 章の表を参照）に加え、この投資家は、銘柄別の予想リターンの偏差の推定値を手に入れました。これらの逸脱の評価も手近に持っています（Table 5.1） 。この投資家は、この追加的な情報も使って、ハイリスク銘柄への投資の最大値を変化させながら、LP モデルを実行させ、その結果をグラフとして表示したいと思っています。そこでは、
リスクの尺度として偏差を使って、結果として得られる全体のリターンをプロットします。

5.2 最適化のループ
ここで、前から使ってきたモデル foliodata.mos を、銘柄別ハイリスク値（パーセンテージ）をベースに、修正して、問題を繰り返し最適化しようとしています。
具体的には、モデルは、以下のアルゴリズムを実施するように変換されます。
1.

パラメータによって不変を保つモデルの部分の定義は変わります。

2.

すべてのパラメータ値に対して、

・ハイリスク値のパーセンテージを制限している制約式を再定義する
33

MSI 株式会社 Copy right©2015 All rights reserved

・

その結果として得られる問題を解く

・もし、実現可能解が得られたら、解をセーブする

3.

結果をグラフに表示する個々の最適化の後に、結果として得られる解の値、および、全体の推定偏差を蓄えるために、以下の 2 つの配列を宣言します。

下のコーディングにより、ハイリスク銘柄の上限を制限している制約式の定義と問題を解く手順の部
分のループが導入されます。このループを繰返すとき、前の定義を無効にすることができるように、この制約式に Risk とうい名前を付けます。もし制約式に名前がないときは、ループを実行すると、毎回、新しい制約式が追加されますが、既存の制約式は置換されません。

上では、forall ループの 2 番目のフォーム、すなわち forall／do を使いました。いくつかのステート
メントがループに含められているときには、このフォームは使われなければなりません。このループは、
end-do で終わります。上のコードでの、もう一つの新しいフィーチャーは、if/then/else/end-if ステートメントです。ここでは、最適解が見つかった場合にのみ、その問題の値をセーブしたいと考えています。ここで、解のステータスは関数 getprobstat によって得られ、それが、「最適解であるかどうか」
は 、 定 数 XPRS_OPT で テ ス ト さ れ ま す 。 選 択 ス テ ー ト メ ン ト は 、 if/then/end-if 、 お よ び 、
if/then/elif/then/else/end-if というもう 2 つの別の形式も持っています。ここで、elif/then は、数回、繰り返えすこともできます。もっと多くの例、および、Mosel で利用可能なループや選択ステートメント
に関する網羅的な説明については、「Mosel ユーザーガイド」を参照して下さい。
5.3 ユーザの求めるグラフを描く
これで、グラフを描くために必要なすべてのデータを集めました。グラフ機能はモジュール mmive
により提供されます（詳しくは、「Mosel 言語参照マニュアル」を参照ください）。したがって、これは、モデルの最初でロードする必要があります。それには、下記の行を追加します。
34
MSI 株式会社 Copy right©2015 All rights reserved続いて下記の行により、グラフを描きます。

ユーザのグラフは、IVE の workspace の右のウィンドウに表示されます。タブ Usergraph を選んで、それをフォアグラウンドに移動させて下さい。以上の操作で、以下のアウトプットを得ます（いろいろな制約式の相互作用のため、予想に反して、結果として生じているグラフは直線ではありません）。

このグラフだけでなく、入力データを示すレイベルを付けたポイントも表示できます（plot2 は低リス銘
柄、高リスク銘柄は plot3） 。

35
MSI 株式会社 Copy right©2015 All rights reserved

セット SHARES ‐ RISK は、「RISK に含まれていない、SHARES のすべてのエレメント」を意味することに注意して下さい。こうすると、アウトプットは下記のようになります。

5.4 これらのフィーチャーを持った最終的なモデルファイル foliodata.mos
この章で議論したすべてのフィーチャーを持つ完全なモデルファイル foliodata.mos は、次のように
36
MSI 株式会社 Copy right©2015 All rights reserved

なります。ここで、2 つのモジュール mmxprs と mmive は、単一の use ステートメントにより、ロードできることに注意して下さい。偏差データは、オリジナルのデータ・ファイルに追加してもよいですし、ここに示されているように、他のファイルから読むこともできます。

37
MSI 株式会社 Copy right©2015 All rights reservedこの問題は、制約式 Risk の小さい限界値ではインフィージブルです。したがって、このグラフに加え、以下のテキストアウトプットが表示されます。

38
MSI 株式会社 Copy right©2015 All rights reserved

第 6 章 混合整数計画（MIP）
この章では、第 3 章で作成したモデルを混合整数計画（MIP） に拡張します。ここでは、下記について説明します。
・

離散的な変数を定義する

・

IVE の MIP オプティマイザーのディスプレイを理解し、使いこなす

6.1 問題の拡張
この投資家は、少量の株式保有をしたくないと考えています。したがって、銘柄別の保有について、
次のようなことができないかと考えています。
1. ポートフォリオに入れる銘柄数を制限する
2. ある銘柄がポートフォリオに入るなら、その銘柄の保有金額が総投資額に占める割合をあるレベ
ル以上に設定（MINVAL） したい（投資資本の、少なくとも 10%）。
以下では、これらの二つの制約式を、二つの別個のモデルを使って、どのように扱うかを示します。

6.2 MIP モデル 1： 銘柄数を制限する
投資の対象となるいろいろな銘柄から、ポートフォリオに入れる銘柄数を制限するためには、銘柄数をカウントできなければなりません。そのために、第 2 章で作成したモデルに、二つ目の、buy という変数のセットを導入します。これらの変数はインディケータ変数（indicator variable） 、すなわち、
バイナリ変数(binary variable)です。変数は、ある銘柄がポートフォリオに入ると 1 という値を取り、入らない場合は 0 という値をとります。ここで、次の制約式を導入し、銘柄数の最大数を
MAXNUM に制限します。この制約式で、セット変数の変数

は、解の中で、最大でも、MAXNUM 個のみが値 1 を同時に取ることができるということを表現しています。

ここで、新しいバイナリ変数

を、ポートフォリオに選ばれたすべての銘柄の数量を表す変数

fracs に結びつける必要があります。表現したい関係は、「もし、ある銘柄がポートフォリオに選ばれる
ならば、それは、銘柄数の一つとして、全体の中でカウントされる」、換言すると、’if fracs >0, then=1’ ということです。以下の不等式により、このことを定式化します。

もし、ある s で、がノンゼロであるならば、は 1 という値になります。逆に言えば、もし、は 0 より大きくなければならず、したがって、が 0 であるなら、そうすると、も 0 であり、銘柄 はポートフォリオに全たく取り入れられないことを意味します。ここで、これらの制約式が、が 1 という値を取り、かつ、が 0 という値を取る可能性を排除しないことに注意して下さい。

39
MSI 株式会社 Copy right©2015 All rights reservedしかし、このケースでは、これは問題ありません。なぜならば、解で、が 1 という値を取り、かつ、が 0 という値をとっても、これらの両方の変数が 0 であるのと同じ効力を持つからです。

6.2.1 Mosel によるインプリメンテーション
第 3 章で開発された LP モデルを、（第 4 章で導入したファイルから、データの初期設定を行い）、
新しい変数と制約式で拡張します。新しい変数がバイナリであるという事実（すなわち、それらが 0という値と 1 という値のみを取る変数であること）は、Mosel の中で、’is_ binary‘ という表現を持った制約式で定義します。もう一つの、よく見られる普通のタイプの離散的な変数は、整数変数(integer variable)です。これらの変数は、与えられた下限と上限の間の整数値のみを取れます。このタイプの変数は、Mosel の中で、’is_ integer‘ という表現を持った制約式で定義します。以下のセ ク シ ョ ン （ MIP model2 ） で は 、 も う 一 つ の 離 散 的 な 変 数 、 す な わ ち 、 半 連 続 変 数(semi-continuous variable)の例を見ます。

40
MSI 株式会社 Copy right©2015 All rights reserved

上のモデル、で forall ループの 2 番目の形式、すなわち、forall/do を使いました。ループがいくつかのステートメントをまたがる場合には、この形式のループを使う必要があります。
同等のことを以下のように書くこともできます。

6.2.2 解を分析する
問題の実行を、ひとまず、ポーズし（Build >> Options を使うか、または、run button

をクリックする）、マトリックスを視覚化すると、以下のディスプレイを得ます。

41
MSI 株式会社 Copy right©2015 All rights reservedこれまでの章の LP マトリックスより、現在のマトリックスには、もっと多くの行（制約式）と列（変数）があります。ここで、という制約式は、という形式に変換されていることに注意して下さい。これは、マトリックスでは、すべての変数は、=、 、 の左側（左辺）にあるように表示するからです（Mosel でも、制約式をこの標準型で保存します）。
モデルを実行すると、その結果として、以下のアウトプットを得ます（ソリューションの information ウィ
ンドウのタブ’ Output/input’を選ぶ）。

この解で得られる最大のリターンは、もともとの LP 問題のそれより小さくなっていますが、これは、制約式を追加したためです。要求されたように、このポートフォリオは 4 つの銘柄から構成されています。ここで、ソリューション情報を詳細に見ましょう（タブ Stats） 。

42
MSI 株式会社 Copy right©2015 All rights reservedここには、Global search という、MIP-固有の情報が、ディスプレイの中央部に含まれています。ここで経験したように、いくつか（またはすべて）の変数に整数条件を追加して、LP モデルを MIP モデルに変えることは、比較的に容易です。しかし、MIP を解くためのアルゴリズムについては、同じことは言えません。なぜならば、MIP 問題は、繰り返し、何度も、何度も、LP 問題を解くことで解かれるからです。このとき、最初は、整数条件を無視して、問題は LP として解かれます（LP 緩和）。そして、現在の解では整数条件を満たしていないある離散的な変数を選び、この変数の新しい上限や下限を追加して、この変数の取る値が整数値になるようにして行きます。ここで、各 LP 解をノード（node） で示し、これらのノードをバウンドの変更や追加された制約式で結んで行くと、「木」のような形をした構造が得られます。これが分枝限定法のツリー（Branch- and-Bound tree） です。分枝についての情報は、問題を解くのに、いくつの分枝限定のノードが必要であったかを示します。この問題では、解くのに必要であったノードは 1 個ですみ、次々とノードを探って行く必要はありませんでした。
Xpress-Optimizer では、デフォルトで、MIP の前処理のために、あるアルゴリズムを実行します（アルゴリズムの設定の詳細については、「Optimizer Reference Manual」を参照）。これには、MIP の解が存在しない LP の実行可能領域の一部を自動的にカットするための制約式の追加をする「カットの自動生成」が含まれています。この問題のサイズは非常に小さいので、前処理により、容易な問題になり、したがって、この問題は、即座に、解かれました。maximize を呼び、再実行を行う前に、モデルに下記の行を付け加えると、MIP の前処理の一部、すなわち、自動カット生成機能がスイッチ・オフ
されます。
43
MSI 株式会社 Copy right©2015 All rights reservedこの状態で、同じ問題を解くと、今度は、解を得るまでに、ノードを 25 個も調べているのが判ります

したがって、今度は、タブ BB tree を選択すると、分枝限定法のツリーを表示できます

44
MSI 株式会社 Copy right©2015 All rights reserved

ツリーのノードは、異なるカラーコードで表示されます。ここで、整数解が見つかったノードは、緑色の四角形で表示され、最適解は大きな緑色の四角形で表示されます。赤い小さなドットは、LP 緩和の実行不能解を示しています。ツリーのノードの上でカーソルを動かすことによって、ノード番号、分枝のために選ばれた変数などの追加的な情報が表示されます。マトリックスのディスプレイと同様に、
Branch-and Bound アルゴリズムを休止することができます。こうして、探索ツリーの構造を詳細に調べることができます。
そして、（Build >> Options を選択するか、または、run options button

をクリック global search

entry をチェックし、Apply で確認して下さい。こうすると、モデルを実行すると、ノードごとに実行を休止するので、ユーザは、探索ツリーの構築状況をフォローできます。実行を継続するには、pause
button をクリックして下さい。実行を中止する場合は、stop button をクリックします。

6.3 MIP モデル 2： 各銘柄の最低投資額の条件を入れる
2 番目の MIP モデルを定式化するために、ここで、再び、第 2 章、および、第 3 章の LP モデ
ルから始めます。定式化したい新しい制約式は、「もし、ある銘柄がポートフォリオの中に組み込まれるならば、少なくとも、その銘柄の保有金額が総投資額に占める割合をあるレベル以上に設定し（MINVAL） たい（ここでは、投資資本の少なくとも 10%）」ということです。今度は、セット変数 fracsのすべてを、単純に、0 と MAXVAL の間の値を取るように制約する代わりに、それらを MINVALと MAXVAL の間の数値を取るか、または、0 という値を取るように制約します。このタイプの変数は半連続変数(semi-continuous variable)と呼ばれます。新しいモデルでは、fracs のバウンズを、以45
MSI 株式会社 Copy right©2015 All rights reserved

下の制約式によって置き換えます。

6.3.1 MOSEL で実行する
下のモデル

は、第 3 章で開発された LP モデルを、（第 4 章で導入したファイルから、データの初期設定行い）、新しい変数と制約式で拡張したものもで、MIP モデル 2 を実行します。
モデル内で、セミ連続変数は、’is_ semcont ’ 制約式で定義されます。
MOSEL で扱えるもう一つの、類似したタイプの整数変数は、0 という値を取るか、与えられた下限と上限の間の整数値を取る変数です。この変数は、いわゆる、半連続整数変数（semi- continuous
integer） と呼ばれています。モデル内で、セミ連続整数変数は、’is_ semint ’ 制約式で定義されます。3 番目のタイプは、部分整数変数(partial integer)で、与えられた下限からある限界値までは整数値を取り、この値を越えると連続変数となるものです。これは、’is_ partint ’ 制約式で定義されます。

46
MSI 株式会社 Copy right©2015 All rights reservedこのモデルを実行すると、以下のアウトプットが得られます（ solution information ウィンドウのOutput/input を選択して下さい）。

ポートフォリオには 5 つの銘柄が選ばれます。そして、各銘柄は、総投資金額の最低 10%、最大 30%の間にあります。追加された制約式のため、最適な MIP 解の値は、この場合も、最初の LP 解の値よりも小さくなります。

47
MSI 株式会社 Copy right©2015 All rights reserved

第 7 章 二次計画法
この章では、第 3 章で作成したモデルを二次計画法(Quadratic Programming)のモデルに、そして、
第 6 章の最初の MIP モデルを混合整数二次計画法(Mixed Integer Quadratic Programming)のモデルに拡張します。この章は、下記について説明します。
・二次式の目的関数を定義する・問題を少しずつ定義して、問題を解く
・ IVE の MIP optimization display を理解して、活用する
第 12 章では BCL でこれまで使ってきた例題の定式化および解く方法を解説し、第 17 章では、QP問題を直接 Xpress-Optimizer でインプットし解く方法を解説します。

7.1 問題の説明
この投資家は、もっと、別の角度から、このポートフォリオ選択問題を見ることもできます。すなわち、
予想リターンを最大化し、ハイリスクの投資部分を制限するのではなく、あるレベルのリターンを達成
しながら、リスクを最小化することです。この投資家は、証券投資の予想リターンの分散/共分散マト
リックスの推定値を得る、という Markowitz のアイデアを使おうと思っています。（例えば、ハードウェ
ア銘柄とソフトウェア銘柄の会社の価値は連動する傾向があるが、人々は、新しいコンピュータやコ
ンピュータゲームで遊ぶことに飽きるとさらに劇場に行くようになるので、演劇プロダクションの成功とは、逆の相関がある、と考えるのがこの考え方の一つの例です。）カナダの財務省証券の利回りは確
実なのに対して、劇場プロダクション銘柄のリターンは大幅に変動します。予想リターン、および、分
散／共分散マトリックスは、下表に示されています。

質問 1：ある特定された最小の目標利回りを得ることを前提にして、分散を最小化するには、投資家
はどのような戦略を採用するべきか。
質問 2：ある特定された最小の目標利回りを得ることを前提にして、仮に、投資家が、最大でも 4 つの銘柄を選びたいとするならば、どれが、最小の分散を持つ投資戦略だろうか。最初の質問により、
問題は、二次計画法問題、すなわち目的関数が二次項を持ち、制約式が一次制約式である数理計画問題になります。2 番目の質問により、銘柄の数を数えるために、離散的な変数の導入が必要と
48
MSI 株式会社 Copy right©2015 All rights reservedなり、したがって、問題は、混合整数二次計画問題になります。これらの 2 つのケースは、以下の 2
つのセクションで別々に議論します。

7.2 QP
第 2 章で作成したモデルを、問題を新しい観点から見ると、下記の変更を行う必要があります。
・新しい目的関数は、リターンの合計ではなく、平均分散(meanvariance)となる
・ リスクに関係する制約式が消える
・目標利回りという新しい制約式を追加する
新しい目的関数は、下記で表されるポートフォリオの平均分散です。

ここで、VARst は、すべての銘柄の分散/共分散マトリックスです。これは、二次の目的関数です。
目的関数に、自乗された変数、例えばや二つの変数が掛け合わされる、例えば、のような項があると、その目的関数は「二次の目的関数」であると言われます。
目標利回りの制約式は、下記のようになります。

北米銘柄への投資の限度、すべての資金を投資すること、および各銘柄への投資の上限は、このモデルにも適用されます。したがってこのモデルの数学的モデルは以下のようになります。

7.2.1 Mosel で実行するモデルの実行には、Xpress-Optimizer モジュール mmxprs だけでなく、QP モジュール mmquad をロードする必要があります。QP モジュール mmquad は、二次形式の定義に必要な機能を Mosel
言語に追加します（mmquad については、「Mosel 言語参照マニュアル（Mosel Language
Reference Manual） 」を参照）。QP モジュール mmquad をロードすると、二次形式の目的関数の最適化機能 maximize や minimize を使えるようになります。このモデルは、これまでのモデルとは異49
MSI 株式会社 Copy right©2015 All rights reservedなるデータファイルを使います。

ここでは、ストリングインデックス(string index [文字列のインデックス])ではなく、数字のインデックスを使っていることに注意してください。モデルでセット SHARES が定義されているので、ファイル内のすべてのデータエントリにインデックスタプルをリストする必要はありません。リストされているタプル
は、判りやすくするためだけのものです。

50
MSI 株式会社 Copy right©2015 All rights reservedこのモデルを解くと、以下のようなソリューションアウトプットが出てきます（solution information
window の Output/input） 。

第 5 章で示されたアルゴリズムと同じように、TARGET にいろいろな値を設定し、この問題を何度か解いて、その結果を目標リターン/標準偏差グラフにプロットして、「効率的なフロンティア」を知ることができます。

51
MSI 株式会社 Copy right©2015 All rights reserved

7.3 MIQP
ここで、前の QP モデルのすべての制約式の下で、最大でも MAXNUM という数の銘柄のみポート
フォリオに入れる条件をモデルに入れましょう。すでに、第 6 章で、どのようにこれを行えばよいかを見ました。すなわち、バイナリ変数のセットを追加することにより、下記のように連続変数に論理的にリンクすることでした。

この関係により、もし、は 1 になり、また、>0 ならば、すなわち、がポートフォリオに選ばれるならば、変数が 0 であるならば、は 0 でなければならないということにな

ります。

52
MSI 株式会社 Copy right©2015 All rights reserved

7.3.1 Mosel によるインプリメンテーション
前の QP モデルを修正する、すなわち、以下の行を、前節の QP モデルの終わりに追加します。その後この問題を、1 回の実行で、まず QP モデルとして解き、続けて、MIQP モデルとして解きます。

MIQP モデルを実行すると、下記のような解を得ます。

ポートフォリオの中の銘柄数についての制約式を追加したので、最小分散は、QP 問題の解のそれよりも、2 倍以上大きくなります。

53
MSI 株式会社 Copy right©2015 All rights reserved

7.3.2 解を分析する
それではここで、ソリューション・ディスプレイを見てみましょう。Stats ウィンドウを選択すると、以下の情報が見られます。

これは、おそらく LP ソリューション・アルゴリズムを除くと、MIP 統計と、非常によく似ています。このケー ス で は 、 こ の 問 題 の LP 緩 和 は 、 Newton-Barrier algorithm で 解 か れ て い ま す 。
Branch-and-Bound ツリーが、複数のノードを持っているので、結果として得られた探索ツリーを見ることもできます（ウィンドウ BB tree） 。

54
MSI 株式会社 Copy right©2015 All rights reserved

探索の中で、2 つの整数実行可能解が見つかりました（緑色の四角形）。最もよい解は、少し大きめのサイズの四角形でハイライトされています。ウィンドウの Objective を開くと、見つかった 2 つの解の詳細が見られます（Figure 7.4）

55
MSI 株式会社 Copy right©2015 All rights reservedこのウィンドウの上半分は、得られた MIP 解と LP 緩和解の間のギャップを示しています。このウィンド
ウの下半分は、見つけられた解の絶対値、および、残余のオープン・ノードの LP 緩和から得られた「最良の下限バウンド曲線」のグラフを示しています。この曲線は、終わりの部分で、最良解の値に繋がっています。これは、この解の optimality が証明されたことを意味しています。optimality の証明や最良解を見つけることはできませんが、探索を例えば、あるノード数だけ行った後、中止するという選択を行うこともできます。

56
MSI 株式会社 Copy right©2015 All rights reserved

第 8 章 ヒューリスティックス
この章では、バイナリ変数を固定して、ヒューリスティックな方法で解を得ることについて説明します。
説明の中には下記の事柄が含まれています。
・サブルーチンを持つ Mosel モデルを構造化する

・パラメータを設定する、ベイシス（基底）をセーブし、ベイシスを戻す、変数のバウンド(bound)を修正することにより、Xpress-Optimizer とインタラクトして、ヒューリスティックな方法で解を得る
手順

第 13 章で、BCL を使って、同じヒューリスティックをどのように実行するかについて説明します。

8.1 バイナリ変数を固定して行うヒューリスティック
ここで行おうとするヒューリスティックは、下記のステップが必要です。
1.

LP 緩和を解き、最適解のベイシスをセーブする。

2.

丸めのヒューリスティックス(rounding heuristic)：もし、対応する変数 frac の値が 0 に近ければ、バイナリ変数 buy を 0 に固定する。また、対応する変数 frac の値が、比較的に大きければ、バイ
ナリ変数 buy を 1 に固定する。

3.

こうして得られた MIP 問題を解く。

4.

ここで、整数実行可能解が得られたら、その中の最良解をセーブする。

5.

すべての変数のバウンドをもともとのバウンドにリセットして、もともとの問題をコンピュー

タにリストアして、セーブしておいたベイシスをロードする。
6.

もともとの MIP 問題を解くが、このとき、ヒューリスティック・ソリューションの最良解の値を「カットオフ値」として使う。

上のステップ 2割合を示す変数 frac は 0.3 という上限を持つので、「比較的大きな値」として、例えば、0.2 を使います。普通、一般に、個々のアプリケーションでは、バイナリ変数にたいしては、
こで、ε はを使います。このような、非常に小さな値です。

ステップ 6「カットオフ値」を設定する意味は、解の探索を行うときに、この値よりも良い値を持つソリューションを見つけようとすればよく、したがって、あるノードの LP 緩和の解が、この値よりも悪ければ、そのノードは切れます。なぜなら、このノード、および、その先に繋がる子孫のノードの整数実行可能解は、このノードの LP 緩和解よりも悪くなるからです。

57
MSI 株式会社 Copy right©2015 All rights reserved

8.2 Mosel で実行する
第 2 章で作成したモデル

を、問題を新しい観点から見ると、下記の変更を行う必要があります。
ここで、第 6 章の MIP 1 モデルを使い、バイナリ変数を固定して、ヒューリスティックな方法で解を得る方法を実行します。サブルーチン（より正確に proedure） という形式で定義されたヒューリスティッ
クにより、モデル自体には、最小限の変更を行います。ここでは、最初の部分で、というキーワードを使ってこの手続を宣言し、標準のコールで maximization 機能を呼び出して問題を解く前に、このヒューリスティック・ソリューションを実行します。ソリューションの印刷も、この変化に対応して変更されています。

58
MSI 株式会社 Copy right©2015 All rights reserved

59
MSI 株式会社 Copy right©2015 All rights reservedこのモデルを理解するには、もっと、詳細な説明が必要でしょう。

8.2.1 サブルーチン
Mosel のサブルーチンは、モデル自体と類似した構造を持っています。procedure は、キーワード
procedure で始まり、その後ろに、procedure の名前が続き、end-procedure で終わります。同様に、関数は、キーワード function で始まり、その後ろに、function の名前が続き、
60
MSI 株式会社 Copy right©2015 All rights reservedend-function で終わります。この両方のタイプサブルーチンは、アーギュメントのリストからなり、また、
function の場合は、さらに、return type も示されなければなりません。例えば、と い う 関 数 は 、 イ ン プ ッ ト の ア ー ギ ュ メ ン ト と し て 、 整 数 integer と ス ト リ ン グ を 持 つ 配 列
array(range)ofstring を持ち、そして real を返えします。上で見るように、サブルーチンは
1 つ（または、いくつかの）の declarations ブロックを持てます。サブルーチンで定義されたオブジェ
クトはローカルに有効であるだけで、サブルーチンの終わりで削除されます。サブルーチンの定義はverloaded が可能です。すなわち、単一のサブルーチンは、異なるアーギュメントの組み合わせを取ることができます。Mosel、および、そのモジュールで定義されたサブルーチンは、それがどのような も の であれ 、新 しい定 義 が、少 な く とも 1 の ア ーギ ュメ ン トが、既 存 の 定 義 と異 な れ ば 、
overloaded が可能です。サブルーチン定義の詳細な説明と例については、「Mosel User Guide」を参照して下さい。

8.2.2 Optimizer のパラメータと機能パラメータ
ヒューリスティックのソリューションは、Xpress-Optimizer のパラメータ設定を使って始まります。
IVE では、すべてのパラメータ、および、モジュールから提供される他の機能は、module browser
でリストできることを記憶して下さい。それには、Modules >> List available modules を選択するか、または button

をクリックして下さい。Optimizer のパラメータの詳細な説明は、「Optimizer

Reference Manual」を参照して下さい。すべてのパラメータは、Mosel のサブルーチン setparamと getparam によりアクセスできます。（この例では、最初モジュール mmxpr でアウトプットの印刷が行われるようにしています。）その結果、Output/input window では、プリントされるものよりさらに多くの情報が表示されます。Optimizer からのアウトプットは、カラーバーでハイライトされます（LP 部
分は青、MIP 部分はオレンジ）。
カットの自動生成（パラメータ XPRS_CUTSTRATGY） およびヒューリスティックス（パラメータ）の切り替えはオプションですが、ここの問題では、presolve 機能（パラ
メータ XPRS_PRESOLVE でセットして行うマトリックスに加える前処理で、モデルサイズを小さくし、ニューメリカルな特性を改善する）を行わないようにしないといけません。なぜなら、解く過程でOptimizer の中の問題とインタラクトしますが、Optimizer によりマトリックスが変更されていない場合のみ、インタラクションが正しく行えるからです。
パラメータの設定に加え、Xpress-Optimizer が使うフィージビリティ・トレランスも調べる必要がある
場合もあります。Xpress-Optimizer は、整数のフィージビリティ、ソリューション・フィージビリティのチ
ェックに、デフォルトでのオーダーのトレランス値を使います。例えば、パーフォーマンスの比61

MSI 株式会社 Copy right©2015 All rights reserved較をして解を評価するときには、トレランスを考慮することが重要です。
最適化ステートメント
ここでは、という追加的なアーギュメントを持つ、maximization procedure の新しいバージョンを使いますが、これは、一番、上のノードの LP 緩和のみを解きたいこと（そして、まだ、
この段階では、MIP 問題全体のソリューションを求めていないこと）を意味します。アルゴリズムを停止した場所から継続してＭＩＰで解くには、アーギュメントを使用します。これは、overloaded subroutine の定義の例です。
セーブ、および、ベイシスのロード
ソリューションプロセスを加速するため、最初の LP 緩和を解いた後に、問題に何の変更も加える前に、シンプレックス・アルゴリズムのベイシスを（メモリー内に）セーブします。このベイシスは、オリジナルな問題をリストアしたら、最後に、再びロードされます。こうして、MIP のソリューション・アルゴリズ
ムは、LP 問題を、「最初から(fromscratch)」から解かなくてもよくなります。こうして、MIP のソリューション・アルゴリズムは、ヒューリスティックにより「中断された状態」から、計算プロセスを続ければよいことになります。
バウンドの変更
すでに、問題が、Optimizer にロードされているとき（例えば、optimization statement の実行や、loadprob を明確に呼び出した後）、setlb、setub を経由して、バウンドの変更は、直接、Optimizer に渡されます。しかし、制約式や変数の追加や削除のなど、モデルを変更する場合は、問題を再ロードする必要があります。
この例で使われている Optimize の諸機能の詳細については、「Mosel Language Reference
Manual のモジュール mmxp についての説明を参照して下さい。

62
MSI 株式会社 Copy right©2015 All rights reserved

8.2.3 トレランスを比較する
Optimizer の実行可能解の許容値を得た後、Mosel の Comparison tolerance (ZEROTOL)を TOL
値にセットします。この作業を行うことにより、実際に fsol(s)=0 であることが判別できます。fsol(s)がTOL と TOL 間に位置する場合 fsol(s)>=0.2 が満たされており、fsol(s)の値は最小でも 0.2=TOL であるということを意味します。
常に非常に小さいデェフォルト値を持つ許容値を用いて Mosel で比較することができます。パラメー
ターを Optimizer の実行可能解の許容値に再セットすることにより Mosel を使い Optimizer と同様、ソリューションの値を評価することができます。

63
MSI 株式会社 Copy right©2015 All rights reserved

第 9 章 Mosel モデルをアプリケーションに埋め込む
Mosel モデルは、しばしば、使い勝手をよくするために、アプリケーションに埋め込まれて使われます。
この章では、下記のことについて説明します。
・

deployment テンプレートをどのようにして生成するか・BIM ファイルの意味と使い方

・

パラメータ化されたモデルと BIM ファイル・

どのようにして、Mosel、および、IVE と、マトリックス・ファイルをインポートし、エクスポートするか・

モデルファイルから Optimization Modeler アプリケーションを作成する

Mosel モデルは、しばしば、使い勝手をよくするために、アプリケーションに埋め込まれて使われます。
この章では、下記のことについて説明します。

9.1 deployment テンプレートをどのようにして生成するかを選択する、または deploy ボタン

をクリックします。開いた選択ウィンドウの、（Figure9.1）Run Mosel モデル下でオプションの Visual Basic を選択します。（Ｃ、Java、またはその他のサポートしている言語での開発も手続きは同様です。）

Next ボタンをクリックすると、新しいウィンドウが開き、そこにはコードが表示されています（Figure9.2） 。

64
MSI 株式会社 Copy right©2015 All rights reserved

Saveas ボタンを使い、名前と新しいファイルの場所をセットします。このファイ

ルを、Visual Basic Project や MS Excel worksheet などに、モジュールとして追加できます。Visual
Basic Project の場合は、モデルをランするためには、モジュール xprm.bas も含めなければなりません。
Mosel が使えるシステムでは、deployment ウィザードによって作成された C、または、Java のどのようなプログラムも実行できます。

9.2 BIM ファイル
ここで、たった今、生成したテンプレートは、Mosel モデルが、BIM ファイルという形式であると仮定しています（BInary Model file） 。BIM ファイルは、Mosel が使えるすべてのプラットフォーム全体で、ポータブルな「.mos モデルファイル」のコンパイルされたバージョンです。これには、外部のファイルから読まれたデータは含まれていません。これらのデータは別個のファイルから入れ込まれます。こうすることによって、同じ BIM ファイルを使って、いろいろなデータセットで実行することができるような仕組みになっています。について可能にします（下の 9.3.2 パラメータを参照）。
BIM ファイルを生成するには、Build >>Compile を選択するか、または、button

をクリックして下さい。そうすると、BIM ファイルは、Mosel ファイルと同じディレクトリに、ファイル名に（’. mos‘ ではなく）拡張子’. bim‘ を持つファイルとして作成されます。また、deployment ウィザードを使い、今回は、別のオプション ’Produce standalone .BIM file(with debug information)’や‘Produce
standalone .BIM file (all names stripped)’ などを使う必要性が出てくる場合もあるでしょう。最初のオプションは IVE デフォルトであり、2 番目のオプションは、特に、モデルに含まれている知的所有権
65
MSI 株式会社 Copy right©2015 All rights reserved

を保護したいような場合にお勧めできます。これを使った場合、モデルで使われているすべての名前を取り除いてくれます。また、アプリケーションから、直接、Mosel のソースファイル（. mos） を実行することもできます（次のセクションを参照）。この場合、BIM ファイルを生成する必要はありません。

9.3 テンプレートを修正する
9.3.1 Mosel モデルの実行
エラーチェックを外すと、生成されたコードは以下のようになります。

もし、BIM ファイルを別に作成することを望まない場合は、例えば、以下に示すコード部分のように、直接、Mosel モデル

をコンパイルし、ロードし、実行できます。

9.3.2 パラメータ
第 4 章で、IVE や Mosel のスタンドアロン・バージョンで実行するときに（例えばバッチファイルまたはスクリプトにおいて）、どのようにして、パラメータ設定を修正するかについて学びました。モデルパラ
メータは、モデル・ソースを変更することなく、多くのいろいろな問題を解くことができるように、Mosel
モデルや BIM ファイルがアプリケーションに埋め込まれている場合にも、リセットできるようになってい66
MSI 株式会社 Copy right©2015 All rights reservedます。ここでは、モデル foliodata.mos の結果ファイルの名前と 2 つの numerical パラメータのセッティングを修正します。他のモデルパラメータは、すべて、モデル内の定義で指定されたそれらのデフォルト値を取ります。

同様に、BIM ファイルのパラメータ設定を変更して実行するには、単に、`run' function call にパラメータを追加するだけです。

9.3.3 VB アウトプットの出力先
Visual Basic には、標準の出力チャネルがないので、Mosel の VB インタフェースを使い、Mosel より出力されたすべてのアウトプットをリダイレクトできるようになっています。モデルのすべてのアウトプッ
トを、ファイル folioout.txt にリダイレクトするには、「Mosel モデルの実行(the execution of theMosel
model)」を、以下によって囲んでください。

ここでの例では、の中ですでにアウトプットがファイルに、モデル自身によりリダイレクトされているので、Mosel により生成されるエラーメッセージをすべて取り出せることが、もっと、重要かもしれません。上の 2 つの行で、を67

MSI 株式会社 Copy right©2015 All rights reserved

に置き換え、ファイルにエラーストリームをリダイレクトして下さい。

9.4 マトリックス・ファイル
9.4.1 マトリックスのエクスポート
Mosel プログラム内で、Xpress-Optimizer で最適化プロセスが始められる場合や、または、ソリュー
ション・プロシージャーが、Mosel モデルが埋め込まれたアプリケーションの一部である場合は、問題
マトリックスは、メモリー内でソルバーにロードされ、ランニングタイムが掛かってしまう、ファイルに書く
ようなことはしません。しかし、場合によっては、マトリックス・ファイルを作成することが必要な場合もあるでしょう。Xpress では、ユーザは、2 つのマトリックス・フォーマットを選択できます。すなわち、
extended MPS、および、extended LP format です。この後者は、制約式が数学的な形式で書かれているので、直感的で読み取り易すいフォーマットです。
Mosel と IVE では、マトリックスの生成をいくつかの方法で行えます。
１.

IVE のメニューを使うモデルを実行した後に、Build >> Export matrix file を選択するか、または、button

をクリックして下さい。出てくる matrix export window の中で、ファイル・ネームを選択し、目的関数をタイプし
て選択する
2.

モデルファイルの中の matrix generation statement を使う問題の MPS マトリックスを作成するには、下の行を追加する。
ＬＰマトリックス（ある箇所を最大化するために）には、下記の行を入れる
いずれも、optimization statement の直前か、optimization statement の代わりにこれを入れる。
３． model file を実行した後に、アプリケーションから作成する。この方法は、C プログラムにおいてのみ可能

9.4.2 マトリックスのインポート
また、マトリックスをロードし、そして、解くこともできます。Build >>Optimize matrix file を選択するか、
または、button

をクリックして下さい。そうすると、以下のウィンドウが開きます。

68
MSI 株式会社 Copy right©2015 All rights reservedIVE を使ってマトリックスを解くとき、マトリックスに Mosel モデルの完全な情報が含まれていないと、対応する情報がないディスプレイは使えなくなります。しかし、実行ログ、問題統計などを表示する右側のウィンドウはアクセスできる状態で残ります。

69
MSI 株式会社 Copy right©2015 All rights reserved

9.5 Optimization Modeler の開発
Xpress client-serverアーキテクチャで最適化モデルを開発するためにマルチ・ユーザアプリケーシ
ョン内にOptimization ModelerでＭｏｓｅｌモデルを組み込めます。Optimization Modeler GUIによってユーザは様々なシナリオやモデル構造を評価するために、モデルに直接アクセスしなくてもMosel
モデルを確認することができます。下記の解説はOptimization Modelerデスクトップ・インストールのデベロッパーバージョンで開発することを前提としています。

9.5.1 モデルファイルの準備
Optimization Modeler内にMoselモデルを組込むために、Moselモデルを若干修正し、MoselとOptimization Modelerの接続を構築します。最初に、設定に必要な追加的機能を提供しているパッ
ケージmminsightをロードします。Optimization Modelerがデータシナリオを管理するので（またはベースラインの実行と呼ぶ）シナリオをOptimization Modelerにロードする際、オリジナルソースからデータを読み込むだけで準備が完了します。（下記のモデルでのテストを使用して変更します。）シナリオデータはでマークした挿入ポイントでOptimization Modelerから直接インプットされ、異なる形式になります。さらに、最適化を開始するソルバーの呼び出しは、ます。修正したモデルファイル

で置換し（元のモデルファイル）は下記の通りです。

70
MSI 株式会社 Copy right©2015 All rights reserved注：ここで、このモデルから解のアウトプット全てを削除します。結果を表示させるために
Optimization Modelerを使用しています。

9.5.1.1 プロジェクト・アーカイブ
Optimization Modelerは完全な形でモデルを提供します。セクション9.2 BIMファイルでは、モデル
ソースからBIMファイルを生成する方法を解説しています。Optimization Modelerは分散されている
アーキテクチャでMoselモデルを実行します。（モデルファイルが格納されているマシンからのインプ
ットは行えません。）Optimization Modeler project archive内にモデルで使用した他のインプットデータファイルを含めることを推奨します。プロジェクト・アーカイブはBIMファイルとオプションのサブデ
ィレクタ
および

（データファイル）、（custom view definitions)（Moselモデルソースファイル）を持つZIPファイルです。Xpress例題は、ファイル名
でZIP archive

内にデータファイルと、サブディレクトリ

で提供しています。

9.5.2 Optimization Modeler GUI を起動させる
Optimization Modeler Analyst Clientは、Windowsのスタートメニューから、またはコマンド行から起動させることが可能です。Windowsのスタートメニューから clientを起動させるには、Start>>FICO>>Xpress>>Optimization Modeler Analyst Clientを選択してください。コマンド行からclientを起動させるにはコマンドプロンプトを開き、Xpress installationのbin サブディレクトリに入ります。
71
MSI 株式会社 Copy right©2015 All rights reserved続いて、下記のコマンドを入力してください。

プログラムはOptimization Modeler serverに割り当てられるか、またはServerに格納することができない場合は部分的に起動するため、Optimization Modeler Analyst Clientの設定に時間がかかる場合があります。次の図のように、アプリケーションのインストールが成功すると、Optimization
Modeler エントリ画面が表示されます。

トップにあるOptimization Modeler Menuと Toolバーを確認ください。ウインドウの左側は、Repository paneおよびEntities paneが表示されています。下部にはRun paneが表示されています。
灰色の部分はデータを確認したり、モデル情報が開かれている場合はここに表示されます。アプリケーションを使用した作業中にこのウインドウのレイアウトを修正した場合は、ボタンを選択すると、再び、元のレイアウトに戻すことができます。

9.5.2.1 新規の Optimization Modeler プロジェクトをスタートする
ここで、事前に準備したプロジェクト・アーカイブをロードしていきます。

１．

Repository paneをクリックします２．

ファイル参照ログを開くために、menu File>>New >>New Projectを選択してください。

３．

プロジェクト・アーカイブ

４．

数回、二者択一する画面が表示されます。毎回、Yesを選択し、作業を続行してください。

を選択し、Openボタンで確認します。

72
MSI 株式会社 Copy right©2015 All rights reserved

シナリオのローディングは外部データにインプットするため、部分的なモデル実行を行います。
（

まで）

シナリオをロードしたときに、インポートしたデータのコピーを使用して、scenario runは完全なモデルを実行します。
スクリーン下部にあるJob Queue paneは、Moselモデルが実行されたこと、およびOptimization
Modelerによる実行の準備が完了したことを示すために下記のディスプレイに変更されます。

9.5.2.2 Optimization Modeler プロジェクトを調査する
下記の図に表示されているRepository paneは、拡張エントリです（左のマウスキー）

シナリオ１が選択された場合、Entities paneに通常、下記のコンテンツを得ます。

73
MSI 株式会社 Copy right©2015 All rights reservedデフォルト設定を使用すると、Optimization Modelerはモデルオブジェクトタイプのまたはを分類し、オブジェクトタイプは、

または、をインプットします。

インプット、モデル上またはRepositoryやEntities panesのエントリの結果をダブルクリックすると、中心のView paneにオブジェクトタイプに関するbuilt-in default view（エンティティ：表）が開きます。
コンテクストメニューを表示するために、Repository内またはEntities panes内の別のノードを右クリックします。（’Delete’,’Rename’,やXXXを持つOpenリストのように）モデルを調査する

ために、下記のコンテクストメニューを使用してentities paneから下記のviewを開くことを推奨しています。
１． インプット・パラメータ（input>>Parameters）：テーブル（一覧表）で開きます。この数値は、シナリオの実行で使用した実行時間のパラメータ値です。（NB:データファイル名の設定はシナリオのロード中に外部データを読み込む際にのみ、必要です）
２． 結果（results>>scalars）：テーブル（一覧表）で開きます。モデルの制約式に関するソリューショ
ン情報の詳細（全てスカラー）が表示されます。
３． 結果（results>>frac）：テーブルで開きます。ここでは、意思決定変数の解の値が表示され、追加カラムに配列 RET の値も表示されます。（Optimization Modeler が自動的に選択したエントリと同じインデックスを共有するシナリオデータから全配列を追加します。）
４． 結果（results>>frac）：チャートで開きます。チャートの設定は、メニューChart >>Settings を選択
し、（またはツールバーからボタンをクリック）Chart type select "Pie"にあるドロップダウン・リ

ストを選択>>OK ボタンで設定します。（別のチャート設定手順：view Table にあるヘッダーfracを選択し、コンテクストメニューから New Chart を選択します。）
上記に記載した全 view は、センターの表示画面内に展開されます。このウインドウ内の重複したview を準備するには、マウスの左クリックを押しながら view のラベルタグを選択し、view を移動したい場所(ボーダーの線が表示されます。)にドラッグします。例：view のラベルチャート：frac を選択し、view を移動したい場所を示す灰色のボーダーの線が見えるまで、Optimization Modeler の右側のボーダーの方にドラッグします。この操作により、アプリケーション画面は下記のように変更されます。：

74
MSI 株式会社 Copy right©2015 All rights reserved

9.5.2.3 モデルデータを修正・編集する
viewを作業しやすいように調整したので、スクリーン上の表示画面に表示されたインプットデータの編集作業を行う準備が完了しました。ユーザが一貫性のないアプリケーション・データを作成することを防ぐために、Optimization Modelerにロックシステムが実装されています。編集したいviewのアイコンが黄色のカギで覆われている場合、viewを編集可能にするために、アイコン

をクリックするか、メニューEdit>> Editを選択します。
変更したプロジェクトをセーブする、しないに関わらず、この作業が促される場合があります。
値の編集：テーブル内のセルをクリックし、ドロップダウン・リストから選択するか、値を入力します。
配列dataに新しいエントリを追加：テーブルの下部にあるブランクの列をクリックします。例：view
Table: parameters内のMAXVAL値を修正する等。続いて、メニューRunを選択し、（またはツール
バーからrunボタンを選択）表示結果がどのように変更されたかを確認してください。

ここで、カラムSHARESに’newone’にその名前とカラムRETに値５０を入力し、view Table：fracのテーブル下部に新しいエントリを追加します。（この結果、カラムfracのセルは空白のままです。）
新しい結果を確認するためモデルに戻ります。
シナリオデータに行った任意の修正・編集はOptimization Modeler内、メニューFile >>Saveで編集をセーブできます。チャートに関する構成設定の修正は、チャート構成ダイアログで名前を付けたプ
75
MSI 株式会社 Copy right©2015 All rights reservedロファイルとしてセーブできます。このチャートの分割されたメニューオプションとして表示されるようになります。

9.5.2.4 データシナリオを比較する
１つのシナリオを編集、再実行する代わりに、いくつかのシナリオを作成し、複数のシナリオからイン
プットと結果を表示、比較するためにbuilt-in multi-scenario tableとchart viewsを使用します。
新しいシナリオを作成する、またはプロジェクトから作成します：プロジェクト名を右クリックし、New

Scenarioを選択するか、または他のシナリオから選択する場合：シナリオを右クリックしCloneを選択します。
たとえば、オリジナル・シナリオ１のクローン作成を使用し、二つの新しいシナリオを作成してみましょう。
最初のコピーで、パラメータMAXVALを0.2に変更し、二回目のコピーで、MAXVALを0.4に設定します。シナリオデータの修正後、各シナリオでRunを選択します。
Repository paneで、プロジェクト名folioinsightを選択し、コンテクストメニューからOpen with Multi

Scenario Tableを選択します。この結果、各シナリオの目的関数の値を持つテーブルを得ます。この比較にさらにカラムを追加するには、table viewのセルを右クリックし、MS TableにオプションAddを選択します。この比較に意志決定変数fracの全ての解の値の追加を選択し、カラム・ヘッダーでコンテクストメニュー（マウスを右クリック）からRemoveを選択し、目的関数の値を削除します。ここで、chart viewを生成するために、チャートのアイコンをクリックし、次にChart type Barを選択した

Chart Settingsダイアログ開くために をクリックし、カスタムタイトルを入力します。（Use default
titleにチェックを入れないでください）その後、下記のスクリーンショットで表示されている図を得るた
めにボックスのDepth effectをチェックします。
また目的関数の値の他に、パラメータMAXVALの設定（パラメータviewの対応するセルで、MS
TableにコンテクストメニューAddを選択します。）を表示する二つ目のマルチ・シナリオテーブルを生成し、そして目的関数の値を持つa multi-scenario chartを生成します。（multi-scenario tableのヘッダー’Objective’でコンテクストメニューNew Multi Scenario Chartを選択します。）下部で、セクション9.5.2.2で説明したように、個々のシナリオに対するfrac配列のchart viewが開きます。

76
MSI 株式会社 Copy right©2015 All rights reserved

77
MSI 株式会社 Copy right©2015 All rights reserved

Ⅱ Getting started with BCL
第 10 章 線形計画問題に入力し、それを解く
この章では、第 2 章で定式化した問題を例として、BCL で、どのようにモデルを実行するかを説明します。具体的には、第 2 章で作ったモデルにいくつかの拡張を加え、それを使って、BCL のインプットとアウトプット機能を説明します。
・BCL で LP モデルを記述する

・

インデックス・セットを使い、ファイルからデータをインプットする・BCL のアウトプット機能・問題をマトリックス・ファイルにエクスポートする

第 3 章では、Mosel を使って、同じ例題をどのように定式化し、解くかについて見ました。そして、第15 章では、Xpress-Optimizer を使って、直接、問題を入力し、解くかを説明します。

10.1 BCL でのインプリメンテーション
この小冊子のすべての BCL の例は、C++により書かれています。C++プログラミング言語では、算術演算子のオーバーローディングができるので、このインタフェースでは、算式の形式に近い形式でモデルを記述でき、非常に便利です。また、同じモデルは、BCL の C、Java、Visual Basic とのインタフ
ェースを使って実行できます。以下の BCL プログラムは、第 2 章で見た LP の問題を実行します。

78
MSI 株式会社 Copy right©2015 All rights reservedここで、上に書かれていることを、詳しく見てみましょう。

10.1.1 初期化
BCL C++のインタフェースを使うためには、ヘッダーファイルが必要です。BCL クラスが属する namespace も定義します。これまでに、ソフトウェアが初期化されていない場合は、下記の行により、最初の問題が生成されるときに、BCL は自動的に初期化されます。

このステートメントにより、という名前を持つ新しい問題が生成されます。

10.1.2 構成
モデル自体の定義は、決定変数の生成（メソッド：） から始まり、それに目的関数の定義と制約式の定義が続きます。例に示すように、C++（および、Java） では、制約式は線形式により生成されます。また、制約式は、一項別にも(termwise にも)構成できます。
79
MSI 株式会社 Copy right©2015 All rights reserved例えば、ハイリスクの銘柄のパーセンテージを制限している制約式は、以下のようになります。

この 2 番目のタイプの制約式の定義は、すべての BCL インタフェースに共通です。そして、オーバーローディングが使えない C、および、VB では、この 2 番目のタイプの制約式による定義が制約式を定義する唯一の方法です。
等式の制約式（ここでの例では、資金をすべて使うことを記述する制約式）を定義する場合には、=（等式記号）を二つ使う（）必要があることに注意して下さい。メソッド

は、変数

の上

限（upper bound） を設定するために使います。このような別個にファンクションコールする代わりに、変数の生成の際に、直接、バウンズ（bounds）を指定することもできますが、この場合、下に示すように、name、variable type（ 連続変数には） 、bounds の上限、下限を含む、完全な情報が必要です。

例題のように、モデリングオブジェクト（決定変数、制約式など）にストリング名（文字列の名前）を付けることはオプションです。もし、ユーザが名前を指定しない場合は、BCL はデフォルト名を生成します。しかし、ユーザ定義の名前を付けると、デバッグや、Optimizer により作成されるアウトプットの解釈が容易になります。

10.1.3 モデルを解く
ソルバーを実行する前に、最適化意志決定変数をします。メソッド
た目的関数（の呼び出しを使って最大化に設定

は、これまで定義した全制約の対象となるメソッド

で設定し）を最大化するために Xpress-Optimizer を呼びだします。
の空文字列の引数はデフォルトの LP アルゴリズムが使われたことを示します。

その他使用できる値は primal の"p"、dual Simplex の"d"および Newton-Barrier の"b"です。

10.1.4 アウトプットの印刷
最後の数行のラインにより、最適解と、すべての変数がソリューションで取る値がプリントアウトされます。

10.2 プログラムのコンパイルと実行
標準インストール手順に従って Xpress-Optimizer と BCL をインストールしていれば、Windows
環境で、以下のコマンドにより、このファイルをコンパイルできます（注：ここで、フラッグ “/”を使80

MSI 株式会社 Copy right©2015 All rights reserved

うことが重要です）。
Linux や Solaris の場合は、下記を使って下さい。
その他のシステムの場合については、corresponding distribution の makefile の例を参照して下さい。こうして得られたプログラムを実行すると、下のようなアウトプットが生成されます。

このディスプレイの上の半分は、Xpress-Optimizer のログです。すなわち、マトリックスのサイズ、3つのロウ（すなわち、制約式）、および、10 のカラム（すなわち、変数）、および、LP のソリューション・
アルゴリズム（ここでは、dual Symplex） のログです。下の半分は、プログラムのアウトプットです。す
なわち、最大リターンは 14.0667 という値であり、ポートフォリオは銘柄 1、3、5、6、および、9 から成っていることを示しています。このとき、資金全体の 30%は、それぞれ、銘柄 1 と 6 に、20%が銘柄 3 に、
そして、13.3333%が銘柄 9 に、6.6667%が銘柄 5 に投下されます。（注意：上のアウトプットでは、行の番号が 0 から始まっている。）すべての制約式が満たされていることは容易に確認できます。すなわ
ち、確かに、北米銘柄へは 50%（銘柄 1 と銘柄 3） の資金が投入され、33.33%がハイリスク銘柄（銘柄
3 と銘柄 9） に投資されるようになっています。最適化の開始の前に、以下のラインを追加して、BCL
81
MSI 株式会社 Copy right©2015 All rights reserved

と Xpress-Optimizer によるアウトプットの印刷をすべてオフことができます。

この設定を行うと、BCL と Xpress-Optimizer からのエラーメッセージの印刷は行われないことに注意して下さい。
印刷された 0 から 4 のレベル範囲が実行可能値です。第 13 章では、例えば、メッセージディスプレイ
の微調整などを行うための Optimizer コントロールパラメータに、直接、どのようにしてアクセスするかを説明します。

10.3 ファイルからのデータ・インプット
単純に変数に番号を振る代わりに、モデルで、もっと意味のあるインデックスを使うこともできます。例
えば、問題データは、ファイルなどのような文字列インデックスを使うファイル

から読み込めます。そして、ファイルの内容は、下記のようなものです。

このデータ・ファイルを使うために、前のモデルを次のように修正します。

82
MSI 株式会社 Copy right©2015 All rights reserved

83
MSI 株式会社 Copy right©2015 All rights reserved

配列とは、文字列のインデックスをストアしており、インデックス集合

いオブジェクトを追加しました。インデックス集合

は、ROI の値を持つという新しがデータ・ファイルから読まれる間に定義されます。この例では、インデックス集合を正確なサイズで設定しました。
しかし、最初に割り当てられたスペースよりも多い入力が行われると、インデックス集合は、自動的に大きくされますので、最初から正確な大きさで設定する必要はありません。実際のセットサイズはメソ
ッド getSize で得られます。データを読むためには、関数を使います。これは、データ・ファイルの中にある “ ! “ を付されたコメント行と何も入っていない空の行を読み飛ばします。フォーマット文字列”“ は、実数が後ろに続く（もし、空白が含まれているならば、シングル、

または、ダブルクォートにより取り囲んだ）テキスト文字列を読みたいということを意味します。このとき、テキスト文字列と実数は、（タブを含む）スペースにより区切っておかなければなりません。もし、データ・ファイルが ‘ , ‘のような別のセパレータ記号を使っているなら、フォーマット文字列は、それに応じて変更して下さい（例えば、”” ）。モデルの中では、線形式との定義は、新しいインデックスに適応したものになります。別の修正部分は、ソリューションの印刷に関するものです。これにより、単なる番号ではなく、すべての銘柄の名前がプリントされ、したがって、ソリューションは、次のように表示されるようになります。

84
MSI 株式会社 Copy right©2015 All rights reserved

10.4 アウトプット・ファンクションとエラーの扱い
ほとんどの BCL のモデリングオブジェクト（）は、メソッドを持っています。変数では、メソッド

がどこで呼び出

されるかによりますが、バウンドか解の中での値がプリントされます。例えば、maximization をコール
する前に、という行を入れると、変数名とそのバウンド
がプリントされます。
それにたいして、問題が解かれた後では、解の中での値が表示されます。
BCL がエラーを検出すると、いつでも、エラーメッセージを出して、プログラムの実行を止めます。したがって、通常は、各オペレーションのリターン値をテストする必要はありません。BCL プログラムが、より 大 き いアプ リ ケ ーシ ョ ン に 埋 め 込 まれ て いるなら ば 、例 え ば 、以 下 の よう に して 、 explicit
initialization を使い、ソフトウェアに正しくアクセスできるかどうかを早くチェックするのがよいでしょう。

メソッド

t は、LP 問題のステータスをテストするのに使います。LP 問題が上手く解かれた場合のみ、BCL は、意味のあるソリューションの値を戻して寄越すか、プリントアウトします。

85
MSI 株式会社 Copy right©2015 All rights reserved

10.5 マトリックスのエクスポート
Xpress-Optimizer による最適化プロセスが、BCL プログラム（メソッド
のメソッド

、または

） の中で開始されると、問題マトリックスは、メモリーでソルバーにロードされますが、ファイルには書かれません。ファイルに書くことは、時間が掛かり、ランニン
グタイムが長くなるからです。しかし、場合によってマトリックスを作ることが必要な場合もあるでしょう。
Xpress では、2 種類のマトリックス・フォーマットから選択できます。すなわち、拡張 MPS フォーマット、
および、拡張 LP フォーマットです。後者は、制約式が数式の形式でプリントされるので、直感的で読み易いものでしょう。MPS フォーマットでマトリックスをエクスポートするには、optimization statementの直前、または optimization statement の代わりに、BCL プログラムへ以下の行を追加します。これにより、作業用ディレクトリに、というファイルが作成されます。

LP フォーマットのマトリックスの場合は、下記の行を使います。

LP フォーマットは、最適化が最小化か最大化のどちらかであるかの情報（sense） を含んでいます。
デフォルトは、最小化ですので、最大化の場合は、このセンスをリセットする必要があります。結果として生成されるマトリックス・ファイルは、という名前を持ちます。

86
MSI 株式会社 Copy right©2015 All rights reserved

第 11 章 混合整数計画法
この章では、第 10 章のモデルを、混合整数計画法（MIP） 問題に拡張します。ここで、以下のことについて説明します。
・ 離散的な変数のタイプを定義する
・MIP ソリューションのステータスを得て、Xpress-Optimizer で作成される MIP の最適化ログを理解する。
第 6 章では、同じ例を使って、Mosel により、モデルをどのように定式化し、そして解くかを説明しました。また、第 16 章では、Xpress-Optimizer に、直接、問題を入力して、解く方法について説明します。

11.1 拡張問題の説明
投資家は小株の保有を望んでいません。この制約を定式化するために以下の可能性を考慮します。
1.

ポートフォリオに含まれる様々な株の数を制限する

2.

株の購入時、少なくとも予算の 10％が株に投資されます。

2 つの別々なモデルの中にあるこの 2 つの制約を扱ってきます。

11.2 MIP モデル 1：様々な株の保有数を制限する
投資している異なる価値（値）の数をカウントするには、第 2 章で作成した LP モデルに変数の二番目の集合を代入する必要があります。この変数は指標変数かバイナリ変数です。
ートフォリオに含まれ、0 以外となる場合、変数がポは 1 を取ります。資産の合計を最大に制限するために、以下の制約を導入します。変数

の最大

が、同

時に 1 の値を取りうる制約を表現します。

まだ、新しいバイナリ変数
る必要があります。

を変数>0、および(ポートフォリオに選択された全ての株の量)と関連付け=1 の領域である場合、次の関係性を表現します。「株がポートフォリオに選択された場合、値の合計にカウントされます。」または、「>0 ならば、=1」

であることを表現する必要があります。
以下の不等式でこの表現を定式化します。

もし、ある s で、がノンゼロであるならば、は 1 という値になります。逆に言えば、もし、は 0 より大きくなければならず、したがって、が 0 であるなら、そうすると、も 0 であり、

銘柄 はポートフォリオに全ったく取り入れられないことを意味します。ここで、これらの制約式が、87

MSI 株式会社 Copy right©2015 All rights reserved

が 1 という値を取り、かつ、が 0 という値を取る可能性を排除しないことに注意して下さい。

しかし、このケースでは、これは問題ありません。なぜならば、解で、が 1 という値を取り、かつ、が 0 という値をとっても、これらの両方の変数が 0 であるのと同じ効力を持つからです。

11.21 BCL によるインプリメンテーション
ここで、第 10 章で定式化した LP モデルを、新しい変数と制約式で拡張しましょう。新しい変数がバイナリであるという事実（すなわち、それらの取る値は 0 と 1 だけということ）は、変数のタイプを指定するによって表現します。よく見られる別のタイプの離散的な変数は、整数変数です。整数変数は、所与の上限、下限の間の整数値のみを取る変数です。BCL では、このタイプの変数は、によって、そのタイプを指定します。次のセクション（MIP2 モデル）では、もう一つのタイプの離散的な変数、すなわち、半連続変数（semi- continuousvariable） の例を見ます。

88
MSI 株式会社 Copy right©2015 All rights reserved

追加した変数と制約式に加え、最適化に使うアルゴリズムの選択も、問題のタイプに合わせる必要があります。ここでは、この MIP 問題を分枝限定法によって解きたいと思っています。これは、メソッドを使います。前章の LP 問題の場合と同じように、MIP ソリューションにアクセスする前に、ソリューション・ステータスをチェックするのはよいことです。MIP の Problem status が、’
unfinished (solutionfound)’ か ‘optimal’ の場合のみ、BCL は「意味のあるソリューション」をプリントします。

11.2.2 ソリューションを分析する
問題を実行すると、下のようなアウトプットを得ます。

89
MSI 株式会社 Copy right©2015 All rights reservedアウトプットの最初の部分には、Xpress-Optimizer の実行ログがあります。問題の変数などの統計が示され、それによると、この問題は、制約式が 14、変数が 20、そのうち、MIP 変数が 10 あることがわかります。ここで、MIP 変数は、’entities’ という表現で示されています。さらに、LP アルゴリズ
90
MSI 株式会社 Copy right©2015 All rights reserved

ムの実行ログ、（タイプ ‘k ‘ [すなわち、knapsack] のカットが合計 １３生成されたことを示す）自動カット生成のログ、分枝限定法(Branch-and-Bound) によるサーチのログも示されます。この問題
は非常に小さいので、LP 定式化を、LP 緩和の解が整数実行可能解を持つように実行可能領域
を厳しくするカットの追加で解けました。ここで、カットとは、MIP ソリューションを狭めないで、LP の実
行可能領域のみをカットする制約式です。このカットの追加により、分枝限定法によるサーチ最初のノードで終わりました。このプログラムによりプリントされたアウトプットにより、問題の解が最適解（optimality） 、すなわち、MIP サーチは完了したこと、そして、少なくとも、最低 1 個の整数実行可能解が見つかったことがわかります。投資の最大のリターンは、制約式を追加したので、元の LP
問題の最大リターンよりも低くなっています。要件として求められていたように、ポートフォリオは 4 つの異なる銘柄からなっています。

11.3 MIP2： 各銘柄の最低投資額の条件を入れる
2 番目の MIP モデルを定式化するために、ここで、再び、第 2 章、および、第 10 章の LP モデルから始めます。定式化したい新しい制約式は、「もし、ある銘柄がポートフォリオの中に組み込まれるな
らば、少なくとも、その銘柄の保有金額が総投資額に占める割合を投資資本の少なくとも 10%にしたい」ということです。今度は、セット変数 fracs のすべてを、単純に、0 と 0.3 の間の値を取るように制約する代わりに、それらを 0.1 と 0.3 の間の数値を取るか、または、0 という値を取るように制約します。このタイプの変数はセミ連続変数(semi-continuous variable)と呼ばれます。新しいモデルでは、fracsのバウンズを、以下の制約式によって置き換えます。

11.3.1 BCL によるインプリメンテーション
下のプログラムにより、MIP2 モデルは実行されます。半連続変数は、タイプにより定義されます。BCL は、デフォルトで、連続の限界を 1 に設定します。したがって、ここでは、メソッド
により、この値を 0.1 に設定しなおすことが必要です。BCL で扱えるもう一つの、類似したタイプの整数変数は、0 という値を取るか、与えられた下限と上限の間の整数値を取る変数です。この変数は、いわゆる、セミ連続整数変数（semi- continuousinteger） と呼ばれています。モデル内
で、セミ連続整数変数は、で定義されます。3 番目のタイプは、部分整数変数(partial

integer)で、与えられた下限からある限界値までは整数値を取り、この値を越えると連続変数となるものです。これは、で定義されます。

91
MSI 株式会社 Copy right©2015 All rights reservedこのプログラムを実行すると、下記のようなソリューションを得ます。

92
MSI 株式会社 Copy right©2015 All rights reservedこの解では、ポートフォリオに 5 つの銘柄が選ばれ、その各々は、総投資の最低で 10%、最大で30%の間に収まっています。制約式を追加したため、元の LP モデルの解よりも、この MIP 最適解の目的関数の値は、低くなっています。

93
MSI 株式会社 Copy right©2015 All rights reserved

第 12 章 二次計画法
この章では、第 10 章の LP モデルを二次計画法(Quadratic Programming)のモデルに、そして、第11 章の最初の MIP モデルを混合整数二次計画法(Mixed Integer QuadraticProgramming)のモ
デルに拡張します。この章では下記について説明します。
・ 二次式の目的関数を定義する・ 問題を少しずつ定義して、問題を解く
第７章では Mosel で同様の例題を使い定式化の方法および解法を説明しています。また第 17 章では OP 問題を直接 Xpress Optimizer を使ってのインプットおよび解法を説明しています。

12.1 問題の説明
この投資家は、もっと、別の角度から、このポートフォリオ選択問題を見ることもできます。すなわち、
予想リターンを最大化し、ハイリスクの投資部分を制限するのではなく、あるレベルのリターンを達成
しながら、リスクを最小化することです。この投資家は、証券投資の予想リターンの分散/共分散マト
リックスの推定値を得る、という Markowitz のアイデアを使おうと思っています。（例えば、ハードウェ
ア銘柄とソフトウェア銘柄の会社の価値は連動する傾向にあるが、人々は、新しいコンピュータやコ
ンピュータゲームで遊ぶことに飽きると、もっと劇場に行くようになるので、演劇プロダクションの成功とは、逆の相関がある、と考えるのが、この考え方の一つの例です。）カナダの財務省証券の利回りは確実なのに対して、劇場プロダクション銘柄のリターンは大幅に変動します。
問題１： 投資家は、ある特定の最小目標利回りを得るために、分散の最小化するにはどの投資戦略を採用すべきでしょうか？
問題２： 投資家が少なくとも、４つの異なる株（ここでも、ある特定の最小利回りを得るために）を選
ぶならば、最小の分散投資戦略はどれでしょうか？
最初の問題は、二次計画問題、すなわち二次式の目的関数と一次式の制約を持つ数理計画問題です。二つ目の問題は、株数をカウントするために、離散変数の導入が必要です。したがって混合
変数二次計画問題となります。上記 2 つの問題を二つのセクションに分けて、解説していきます。

12.2 QP
第 2 章で作成したモデルを、問題を新しい観点から見ると、下記の変更を行う必要があります。
・

新しい目的関数は、リターンの合計ではなく、平均分散(meanvariance)となる・リスクに関係する制約式が消える

・

目標利回りという新しい制約式を追加する
94

MSI 株式会社 Copy right©2015 All rights reserved新しい目的関数は、下記で表されるポートフォリオの平均分散です。

ここで、は、すべての銘柄の分散/共分散マトリックスです。これは、二次の目的関数です。

目 的関数に 、自 乗された変 数、例えば 、や二 つの変 数が掛 け合わされ る、例えば 、のような項があると、その目的関数は「二次の目的関数」であると言われます。目標利
回りの制約式は、下記のようになります。

北米銘柄への投資の限度、すべての資金を投資すること、および各銘柄への投資の上限は、このモデルでも適用されます。したがって、このモデルの数学的モデルは下記のようになります。

12.2.1 BCL で実行する
リターンの推定値、および、分散/共分散マトリックスは、データ・ファイルに示されています。

このデータファイルを、関数を使って読み込みます。’ ! ‘ を前に持つ

コメント行、および、空白行はスキップされます。エントリー ’g ‘ のフォーマットとセパレータ（スペース、または、タブ表作成のどのような数でも）で、ライン全体を、一気に読みます。目的関数の定義
95
MSI 株式会社 Copy right©2015 All rights reserved

には、二次式 (classで等式を表現)を使います。ここでは、目的関数を最小化したいので、最適化は、メソッドで始めます（ここでの空の文字列アーギュメントは、デフォルト

アルゴリズムを使うことを意味します）。

96
MSI 株式会社 Copy right©2015 All rights reservedこのプログラムにより、以下のソリューションアウトプットが得られます。ここで、QP 問題を解くためのデフォルトアルゴリズムは、これまでの例で使われていた Simplex 法ではなく Newton-barrier を使用
します。）

97
MSI 株式会社 Copy right©2015 All rights reserved

12.3 MIQP
ここで、前の QP モデルのすべての制約式の下で、最大でも、という数の銘柄しかポートフォリオに入れられないという条件をモデルに入れましょう。すでに、第 6 章で、どのようにこれを行えばよいかを見ました。すなわち、バイナリ変数のセットを追加して、これにより、下記のように連続変数に論理的にリンクすることでした。

この関係により、もし、>0 ならば、すなわち、は 1 になり、また、がポートフォリオに選ばれるならば、変数が 0 であるならば、は 0 でなければならないということになります。

12.3.1 BCL によるインプリメンテーション
前の QP モデルを修正する、すなわち、以下の行を、前節の QP モデルの終わり（ソリューションのプ
リンティングの後ろ）に追加します。その後、この問題を、1 回のランで、まず、QP モデルとして解くた
めに下記の行を追加します。

98
MSI 株式会社 Copy right©2015 All rights reserved

MIQP モデルを実行すると、下記のようなソリューション・アウトプットを得ます。

99
MSI 株式会社 Copy right©2015 All rights reserved

Branch-andBound サーチのログを見ると、今回は、2 つの整数実行可能解が見つかり、サーチを完了するのに、合計 55 のノードを調べたことがわかります。銘柄数について追加した制約式のため、最小分散の値は、QP 問題のそれと比較して、2 倍以上になっています。

100
MSI 株式会社 Copy right©2015 All rights reserved

第 13 章 ヒューリスティックス
この章では、Xpress-Optimizer と対話して下記の事柄を行いながら、バイナリ変数を固定して、ヒューリスティックな方法で解を得ることについて説明します。
・ パラメータの設定
・ベイシス（基底）をセーブし、ベイシスを戻す、

・変数のバウンド(bound)を修正する

第 8 章では、Mosel を使って、同じヒューリスティックをどのように実行するかについて説明しました。

13.1 バイナリ変数を固定して行うヒューリスティック
ここで行おうとするヒューリスティックは、下記のステップが必要です。
1.

LP 緩和を解き、最適解のベイシスをセーブする。

2.

丸めヒューリスティックス(rounding heuristic)：もし、対応する変数
ければ、バイナリ変数の値が、比較的に大きを 1 に固定する。

3.

こうして得られた MIP 問題を解く。

4.

ここで、整数実行可能解が得られたら、その中の最良解をセーブする。

5.

すべての変数のバウンドをもともとのバウンドにリセットして、もともとの問題をコンピュータにリスト
アして、セーブしておいたベイシスをロードする。

6.

もともとの MIP 問題を解くが、このとき、ヒューリスティック・ソリューションの最良解の値を「カットオフ値」として使う。

上のステップ 2割合を示す変数 frac は 0.3 という上限を持つので、「比較的大きな値」として、例えば、0.2 使います。
普通、一般に、個々のアプリケーションでは、バイナリ変数にたいしては、は、を使います。ここでのような非常に小さい値です。

ステップ 6「カットオフ値」を設定する意味は、解の探索を行うときに、この値よりも良い値を持つソリューションを見つけようとすればよく、したがって、あるノードの LP 緩和の解が、この値よりも悪ければ、そのノードは切れます。なぜなら、このノード、および、その先に繋がる子孫のノードの整数実行可能解は、このノードの LP 緩和解よりも悪くなるからです。

13.2 BCL で実行する
ここで、第 11 章の MIP1 モデルを使い、バイナリ変数を固定して、ヒューリスティックな方法で解を得
101
MSI 株式会社 Copy right©2015 All rights reserved

る方法を実行します。ファンクションという形式で定義されたヒューリスティックにより、モデル自体には、最小限の変更を行います。すなわち、標準のコールでメソッドを呼び出して問題を解く前に、このヒューリスティック・ソリューションを実行し、ソリューションのプリンティングも、この変化に対応して変更されています。

102
MSI 株式会社 Copy right©2015 All rights reserved

103
MSI 株式会社 Copy right©2015 All rights reservedこのヒューリスティックのインプリメンテーションについては、確かに、ある程度の説明が必要です。この例では、初めて、Xpress-Optimizer へのダイレクトアクセスを使います。Xpress-Optimizer へのダイレクトアクセスを行うには、Optimizer ヘッダーファイルを含む必要があります。

Optimizer 機 能 は 、 Optimizer が 保 有 し て い る （ タ イ プの ） 問 題 表 現 （ problem

representation） に適用できます。そして、問題表現は、BCL 問題のメソッドによってリトリーブできます。BCL ライブラリと Optimizer ライブラリの結合をどのように使うかについてのもっと詳しい説明は、「BCL リファレンスマニュアル」を参照して下さい。すべての Optimizer 機能とパラメータについての完全なドキュメントは、「Optimizer リファレンスマニュアル」にあります。
パラメータ
ヒューリスティックを解くことは、Xpress-Optimizer のパラメータ設定から始まります。自動的なカットの生成（パラメータータズム（パラメータ） のスイッチ・オフと MIP ヒューリスティックス（パラメオプションですが、ここでの問題を解く場合には、presolve のメカニ）でセットして行うマトリックスに加える前処理で、モデルサイズを小さくし、ニューメリカルな特性を改善する）を止めておくことが必要です。なぜなら、解く過程でOptimizer の中の問題とインタラクトしますが、Optimizer によりマトリックスが変更されていない場合のみ、インタラクションが正しく行えるからです。
パラメータの設定に加え、Xpress-Optimizer が使うフィージビリティ・トレランスも調べる必要がある
場合もあります。Xpress-Optimizer は、整数のフィージビリティ、ソリューション・フィージビリティのチ
104
MSI 株式会社 Copy right©2015 All rights reservedェックに、デフォルトでのオーダーのトレランス値を使います。例えば、パーフォーマンスの比較をして解を評価するときには、トレランスを考慮することが重要です。第 10 章で説明したアウトプ
ットプリンティングの微調整は、パラメータとを設定することによって行えます。
（両方とも、関数で設定する）。

最適化のコール
先端のノードのLP緩和のみを解くことを示している（全体がMIP問題ではない）アーギュメント
付けたメソッド（を）を使います。一度、停止させたアルゴリズムの部分からMIPで解くには、アーギュメントを使います。

セーブ、および、ベイシスのロード
ソリューションプロセスを加速するため、最初の LP 緩和を解いた後に、問題に何の変更も加える前に、シンプレックス・アルゴリズムのベイシスを（メモリー内に）セーブします。このベイシスは、オリジナルな問題をリストアしたら、最後に、再びロードされます。こうして、MIP のソリューション・アルゴリズ
ムは、LP 問題を、「最初から」から解かなくてもよくなります。こうして、MIP のソリューション・アルゴリ
ズムは、ヒューリスティックにより「中断された状態」から、計算プロセスを続ければよいことになります。
バウンドの変更
すでに、問題が、Optimizer にロードされているとき（例えば、optimization statement を実行したり、または、を明確に呼び出した後）、とを経由して、バウンドの変更は、直接、Optimizer に渡されます。しかし、制約式や変数の追加や削除のようなモデルへの変更の場合
は、問題を再ロードする必要があります。このプログラムは、以下のアウトプットを生成します。オリジ
ナル問題を 2 回目に解くときには、Simplex アルゴリズムは、一回もイタレーションを行いません。
なぜなら、このとき、前回の計算で得た最適解のベーシス（基底）を使っているからです。

105
MSI 株式会社 Copy right©2015 All rights reserved

106
MSI 株式会社 Copy right©2015 All rights reservedこのヒューリスティックは 13.1 という解を見つけたこと、ヒューリスティックなしの MIP optimizer が、（実行不可能というメッセージを出し）よりよい解を見つけることができなかったことに注意して下さい。
したがって、このヒューリスティック解は最適（optimal） です。

107
MSI 株式会社 Copy right©2015 All rights reserved

Ⅲ Getting started with the Optimizer
第 14 章 マトリックスのインプット
この章では、以下のことについて説明します。
・ Xpress-Optimizer の初期化
・ MPS フォーマット、または、LP フォーマットで、マトリックスを Xpress-Optimizerにロードする・問題を解く・ ソリューションをファイルに書く

14.1 マトリックス・ファイル
Xpress では、ユーザは、2 つのマトリックス形式、すなわち、拡張 MPS フォーマット、および、拡張 LP
フォーマットのどちらかを選択できます。これら二つのフォーマットのうち、後者は、制約式が数式でプリントされるので、通常、人間が容易に読み取れるフォーマットです。マトリックスは、
Xpress-Optimizer でも書けますが、それらは、通常は、他のツールで生成されたものでしょう。かりに、
Mosel、または、BCL プログラムの中で、Xpress-Optimizer による最適化プロセスが始められているならば、問題のマトリックスは、外のファイルに書かれることなく、メモリーで、ソルバーにロードされます。（外部ファイルに書くことは、ランニング・タイムのロスにつながるため）しかし、Mosel、および、
BCL の両方を使って、マトリックスを生成することもできます（Mosel によるマトリックス・ジェネレーショ
ンについては第 9 章を、BCL によるマトリックス・ジェネレーションについては第 10 章を参照下さい）。

14.2 インプリメンテーション
Xpress-Optimizer にマトリックスをロードするには、次のステップを取ります。
1.

Xpress-Optimizer を初期化する

2.

新しい問題をクリエートする

3.

マトリックス・ファイルを読み込む（ 同 様 な イ ン タ フ ェ ー ス は Java と Visual Basic に も あ り ま す が ） 以 下 の C プ ロ グ ラ ム
は、どのようにしてマトリックス・ファイルをロードし、問題を解き、解を書き出すかを示したものです。判りやすくするために、ここではこのプログラムでは、すべてのエラーチェックを省略してあります。一般に、初期化機能の「戻り値」をテストし、また 問題が作成され、正しく読み込まれたかどうかをチェックすることをお勧めします。Xpress-Optimizer を使うには、ヘッダーファイル
を含めることが必要です。

108
MSI 株式会社 Copy right©2015 All rights reserved

14.3 プログラムのコンパイルと実行
Xpress-Optimizer の標準のインストール手順に従うと、Windows の下で、以下のコマンドによってこのファイルをコンパイルします。

Linux や Solaris の場合は、以下のコマンドを使います。
他のシステムについては、対応するシステムの makefile を参照してください。BCL により作成された
第 2 章の例題のマトリックス
トプットファイル

で、このプログラムを実行すると、以下の内容を持つアウ
を得ます。

109
MSI 株式会社 Copy right©2015 All rights reserved上の部分は、問題のサイズとソリューション・アルゴリズム関連の統計を示しています。見つかったオ
プティマム LP ソリューションは、14.066659 の値を持っています。
約式の詳細なソリューション情報が示され、では、問題の制では、というカラムのところに、変数の値が示されています。

110
MSI 株式会社 Copy right©2015 All rights reserved

第 15 章 線形計画法（LP） の問題をインプットし、解く
この章では、第 2 章で定式化した問題を例にとり、Xpress-Optimizer を使って、それをどのように入力し、解くかについて説明します。以下のトピックについて、詳細に解説します。
・LP モデルをマトリックス・フォーマットに変換する

・

Xpress-Optimizer での LP 問題インプット・問題を解くき、ソリューションをアウトプットする

第 3 章では、Mosel を使い、どのようにこの例題を定式化し、また、第 10 章では、BCL を使った場合が説明されています。

15.1 マトリックス表示
数式的に表現されている問題を、Xpress-Optimizer の LP 問題のインプット機能により求められる形式に変換する最初のステップとして、各列(column)が一つの意思決定変数を表し、各行(row)が制約式を表すようなテーブルという形式で問題を書きます。このテーブルに全てのノンゼロ係数を書き込みます。そうすると問題マトリックスが得られます。それに、各式が右辺とどのような関係にあるかを示す=、、 記号と、右辺の定数を加えてこの表を完成させます（右辺は、通常、RHS(righthandside)の値と呼ばれます）。Xpress-Optimizer に示されるマトリックスについての情報は、行数と列数を掛け合わしたマトリックス全体ではなく、ノンゼロ係数のリスト、および、それらの係数のマトリックス内での位置についての情報です。このテーブルの中の上付きの添え字は、マトリックス・エントリ
ーがリストに入力される順序を示しています。係数の値は、配列は、配列に、また、対応する行番号にストアされます。そして、これらの配列の最初のいくつかのエントリは、それらを強調するためにイタリック体でプリントされます（さらに詳しい説明は、「Optimizer Reference Manual」
を参照ください）。そして、配列
配列には、カラムごとの最初のエントリのインデックスが、また、には、カラムあたりのエントリの数がストアされ、マトリックスについての情報が完成します。

111
MSI 株式会社 Copy right©2015 All rights reserved

15.2 Xpress-Optimizer によるインプリメンテーション
以下の C プログラム

は、Xpress-Optimizer を使って、LP 問題をどのように入力し、解くかを示しています。ここでは、ソリューションの印刷も追加してあります。また、ソリューションにアクセスする前に、LP 問題のステータスをチェックするようになっています。
（さらに詳しい説明は「OptimizerReferenceManual」を参照ください）。Xpress-Optimizer を使うには、
ヘッダーファイル

が必要です。

1.

Xpress-Optimizer を初期化する

2.

新しい問題をクリエートする

3.

マトリックス・ファイルを読み込む

112
MSI 株式会社 Copy right©2015 All rights reserved

最後のカラムの後ろに（すなわち、last+1 に）、エントリーを追加して、配列を定義する代わりに、

で、カラムあたりの係数の数を与えます。

最適化関数の 7 番目のアーギュメントは、NULL になっていますが、これは、この問

題では、制約式についての range information の情報のためにとっておかれているからです。
最適化関数の 2 番目のアーギュメントは、使うアルゴリズムを示し、空の文字列はデフォルト LP アルゴリズムを使うことを示します。問題を解いた後に、LP がうまく解かれたかどうかをチェックし、もしそうなら、目的関数の値と意思決定変数が集問題(primal problem)の解で取る値を取り出します。
15.3 コンパイルと問題の実行
Xpress-Optimizer の標準的なインストール手順を行う場合、Windows 上では下記のコマンドを使用してファイルをコンパイルします。

Linux または Solaris の場合は、下記のコマンドを使用します。

113
MSI 株式会社 Copy right©2015 All rights reservedその他のシステム上については、対応する問題で提供されている例題を参照ください。
この問題を実行すると、下記のアウトプットを得ます。

UNIX の場合は、Xpress-Optimizer のログが前に付きます。

Windows ユーザは、Optimizer のログをファイルに転送してリトリーブします。その場合、プログラムの中で、問題の作成直後に、以下のラインを追加してください。
Optimizer のログは、マトリックスのサイズ、3 つの row（ すなわち、制約式）、および、10 のcolumn（ 意思決定変数)それに使った LP アルゴリズム（ここでは、dual Simplex を意味する’D’）のログが示されます。このプログラムにより出力されたアウトプットから、最大のリターンの値が14.0667 であること、ポートフォリオは銘柄 1、3、5、6、および、9 から成っていることが読めます。また、この解では、資金合計の 30%が、それぞれ、銘柄 1、および、銘柄 6 に、20%が銘柄 3 に、
13.3333%が銘柄 9 に、そして、6.6667%が銘柄 5 に使われることが読めます。また、すべての制約式が満たされていることが容易に確認できます。すなわち、50%が北米銘柄（銘柄 1 と銘柄 3） であること、そして、33.33%がハイリスク銘柄（銘柄 3 と銘柄 9） になっています。
114
MSI 株式会社 Copy right©2015 All rights reserved

第 16 章 混合整数計画法
この章では、第 2 章の LP 問題を混合整数計画法（MIP） 問題に拡張します。ここで、以下のことについて説明します。
・MIP モデルをマトリックス形式に変換する

・

Xpress-Optimizer に、いろいろな離散的な変数を持つ MIP 問題を入力する

・

MIP 問題を解き、ソリューションをアウトプットする

16.1 問題の拡張についての説明
投資家は、ある銘柄を持つとしたら、ある程度の資金をその銘柄に投資したいと思っています。彼は、この制約式を定式化するのに、以下の 2 つのことを考えています。
１.

ポートフォリオに組み込む銘柄数を 4 個に制限する。

２.

もし、ある銘柄が買われるならば、少なくとも、予算の 10%をその銘柄に投資したい。

以下では、これらの 2 点を、2 つの別個のモデルで扱います。

16.2 MIP1： ポートフォリオに組み込む銘柄数を制限する
投資する銘柄数をカウントできるように、第 2 章で開発した LP モデルに、2 つ目のセット変数
導入します。これらの変数は、インディケータ変数、すなわち、バイナリ変数です。変数をは、銘

柄 s がポートフォリオに組み込まれると 1 という値を取り、そうでない場合は、0 という値を取ります。
ポートフォリオに組み込む銘柄数を MAXNUM というに最大値に制限するために、以下の制約式を導入します。この制約式は、同時には、最大でも、4 個の変数

しか 1 という値を取ることができないということを表現する制約式です。

ここで、ポートフォリオに選ばれたすべての銘柄の量を示す変数

を、新しいバイナリ変数に結びつける必要があります。表現したい関係は、「もし、ある銘柄がポートフォリオに選ばれるならば、
それは、銘柄数の一つとして、全体の中でカウントされる」、換言すると、であるならば、ということです。以下の不等式により、このことを定式化します。

もし、ある s で、がノンゼロであるならば、は 1 という値になります。逆に言えば、もし、は 0 より大きくなければならず、したがって、が 0 であるなら、そうすると、も 0 であり、

銘柄 はポートフォリオに全ったく取り入れられないことを意味します。ここで、これらの制約式が、
115
MSI 株式会社 Copy right©2015 All rights reserved

が 1 という値を取り、かつ、が 0 という値を取る可能性を排除しないことに注意して下さい。しかし、このケースでは、これは問題ありません。なぜならば、解で、かつ、が 1 という値を取り、が 0 という値をとっても、これらの両方の変数が 0 であるのと同じ効力を持つからです。

16.2.1 マトリックスによる表現
数式で表現されたモデルは、次のようなテーブルに変換できます。前章の LP モデルのマトリックスに較べ、このマトリックスは、変数のための新しいカラムが 10 個追加され、二つのタイプの変数を結びつけるための制約式が 10 本追加されています。ここで、これらの制約式の変数を含むすべての項が等号、不等号の左辺に来るように変形されていることに気をつけて下さい。
マトリックス係数の上付き文字は、ここでも、配列と配列への入力の順序を表し、最初の 3 つのエントリは、強調のため、イタリック体でプリントされています。

16.2.2 Xpress-Optimizer で実行する
LP 問題と共通しているマトリックス係数と関連する構造だけではなく、MIP 問題固有情報、すなわち、MIP 変数のタイプ（ここでは、すべて、バイナリ変数であることを示す’B ‘ がマークされています）を
配列

で、また、配列の対応したカラムインデックスで指定する必要があります。

普通にみられる別のタイプの離散的な変数は、整数変数、すなわち、与えられた下限と上限の間の整数値のみを取ることのできる変数です。これらのタイプの変数は、によって定義されます。次のセクションで説明する MIP2 モデルでは、もう一つの離散的な変数、すなわち、半連続変数（semi- continuousvariable） の例を見ます。

116
MSI 株式会社 Copy right©2015 All rights reserved

117
MSI 株式会社 Copy right©2015 All rights reserved

Xpress-Optimizer に問題をロードするため、ここで関数
ンクションの最初の 14 のアーギュメントは、を使います。このファについてのものと同じです。19 番目のアーギュメントの使い方については、次のセクションで議論します。残りの 4 つのアーギュメントは、
SOS (Special Ordered Set)の定義に関したものです。16 番目のアーギュメントの値 0 は、ここでの問題には、SOS がないことを示しています。このプログラムには、問題をロードするためのファンクションだけでなく、問題をどのように解き、また、ソリューションへのアクセスについてのファンクションも、問題タイプに適応した形になっています。ここでは、この MIP 問題を、分枝限定探索により解きます（最適化関数の 2 番目のアーギュメント

は、デフォルトで MIP アルゴリ

ズムを使用することを意味します）。次いで、MIP ソリューションのステータスを取り出し、もし、整数
実行可能解が見つかっていたならば、見つけられた最もよい整数解の目的関数の値と、対応する変数の値をプリントアウトします。このプログラムを実行することにより、以下のソリューションアウトプットが生成されます。最大のリターンは、追加された制約式のため、もともとの LP 問題の値よりも低くなっています。求められたように、ポートフォリオは、4 つの異なる銘柄で形成されています。

16.3 MIP2： 各銘柄の最低投資額の条件を入れる
2 番目の MIP モデルを定式化するために、ここで、再び、第 2 章、および、第 1５章の LP モデルから始めます。定式化したい新しい制約式は、「もし、ある銘柄がポートフォリオの中に組み込まれるならば、少なくとも、その銘柄の保有金額が総投資額に占める割合を投資資本の少なくとも 10%にしたい」ということです。今度は、セット変数のすべてを、単純に、0 と 0.3 の間の値を取るように制約す

る代わりに、それらを 0.1 と 0.3 の間の数値を取るか、または、0 という値を取るように制約します。このタイプの変数は半連続変数(semi-continuous variable)と呼ばれます。新しいモデルでは、のバウンズを、以下の制約式によって置き換えます。

118
MSI 株式会社 Copy right©2015 All rights reserved

16.3.1 マトリックスによる表現
この問題は、前章の LP 問題と同じマトリックスを持っているので、ここでは、繰り返しません。唯一の違いは、MIP に関係するカラムのデータです。

16.3.2 Xpress-Optimizer で実行する
下のプログラム

により、MIP2 モデルは Optimizer にロードされます。前章の LP 問

題と同じマトリックスデータですが、今度は、変数は半連続変数ですからタイプマーカーをつけて定義されています。Xpress-Optimizer は、デフォルトで、連続的な限界を 1 と仮定しますので、配列で、値 0.1 を指定します。これに関連して、配列整数変数は、もし、後者が 0 でないならば、配列の中のセミ連続変数、半連続の中の値で上書きされることに注意してください。

このような合成変数は他にもありますが、その一は、上の説明で触れたセミ連続整数変数(semi-continuous integer variable)で、このタイプの変数は、0 という値を取るか、与えられた限界と上限の間の整数値のみを取る変数です（でマークされる）。また、部分整数(partial integer

variable)は、下限から、ある与えられた上限までは整数値を取り、この値より上では、連続になる変数です（でマークされる）。

119
MSI 株式会社 Copy right©2015 All rights reservedこのプログラムを実行すると、下記のようなアウトプットを得ます。

今回は、ポートフォリオに 5 つの銘柄が選ばれ、各銘柄とも、合計投資額の少なくとも 10%、最大でも30%を占めています。制約式を追加したので、最適 MIP ソリューションの値は、この場合も、元のLP 問題の最適解の値よりも低くなっています。

120
MSI 株式会社 Copy right©2015 All rights reserved

第 17 章 二次計画法
この章では、第 15 章の LP モデルを二次計画法(Quadratic Programming)のモデルにし、下記の点について説明します。
・

QP モデルをマトリックス形式に変換する

・

Xpress-Optimizer に QP 問題を入力し、問題を解く

17.1 問題の説明
この投資家は、もっと、別の角度から、このポートフォリオ選択問題を見ることもできます。すなわち、
予想リターンを最大化し、ハイリスクの投資部分を制限するのではなく、あるレベルのリターンを達成
しながら、リスクを最小化することです。この投資家は、証券投資の予想リターンの分散/共分散マト
リックスの推定値を得る、という Markowitz のアイデアを使おうと思っています。このとき、9 という最低目標利回りを得ることを前提にしたら、分散を最小化するには、投資家は、どのような投資戦略を採用するべきでしょうか。

17.2 QP
第 2 章で作成したモデルを、上述の新しい観点から見ると、下記の変更を行う必要があります。
・

新しい目的関数は、リターンの合計ではなく、平均分散(meanvariance)となる・リスクに関係する制約式が消える

・

目標利回りという新しい制約式を追加する

新しい目的関数は、下記で表されるポートフォリオの平均分散です。

ここで、VARst は、すべての銘柄の分散/共分散マトリックスです。これは、二次の目的関数です。
目 的 関 数に 、自 乗さ れた変 数 、例 えば 、や二 つの変 数 が掛 け合わ され る、例 え ば 、のような項があると、その目的関数は「二次の目的関数」であると言われます。
目標利回りの制約式は、下記のようになります。

北米銘柄への投資の限度、すべての資金を投資すること、および、各銘柄への投資の上限は、このモデルでも適用されます。したがって、このモデルの数学的モデルは以下のようになります。

121
MSI 株式会社 Copy right©2015 All rights reserved

17.3 マトリックス表示
Xpress-Optimizer へ問題を入力するために、数式的に表現されているモデルを以下の制約式行列に変換します。（Table 17.1）

前章と同様、マトリックス係数の上付き文字は、配列と配列へのエントリの順番を示し、最初の 3 つのエントリは、強調するためにイタリック体でプリントされています。二次形式の目的関数の係数は、以下の分散/共分散行列で与えられています（Table 17.2） 。

17.4 Xpress-Optimizer で実行する
以下のプログラム

により、QP 問題は Xpress-Optimizer にロードされ、そして、解かれます。目的関数の二次項の部分は三角形の形式、すなわち、オリジナルの分散/共分散マトリックス（第 7 章の Table 7.1 分散/共分散マトリックスを参照）の上部、または、下部の三角形のどちらかで指定されなければならないことに注意して下さい。ここでの定式化では、分散/共分散マトリック
スの上部の三角形を選択していますが、これは、これらの項の合計、すなわち、の代わりに、を指定することを意味しています。Optimizer のインプットについての約束事により、主対角線上の値は 2 倍にする必要があります。マトリックス係数と同様、Optimizer にはノンゼロ係数を持つ二次項のみが指定されます（それにより、配列定義では、
下のようなスペースとなります）QP 問題は、関数により、Optimizer にロードされます。

このファンクションは、目的関数の二次部分のための 4 つの追加的なアーギュメントを後ろに持っ122
MSI 株式会社 Copy right©2015 All rights reserved

ていますが、これ以外は、関数
次項の数を示す
らの係数、すべての二次項（と同じアーギュメントを持っています。それらは、二と） の変数のカラムの数、および、それです。混合整数二次計画法（MIQP） 問題をロードする場合には、関数を使う必要があります。この関数は、関数ントを取りますが、それらのアーギュメントに加え、前章で関数と同じアーギュメを使用して導入した MIP 問題の向けの 9 つのアーギュメントも使う必要があります。前の例とは反対に、今度は、目的関数を最小化します。ここで、問題を解き、ソリューションにアクセスするのには、LP 問題の場合と同じファンクションを使っていることに注意して下さい。また、MIQP 問題を解くときには、第 16 章
で示した MIP のソリューション・ファンクションを使う必要があります。

123
MSI 株式会社 Copy right©2015 All rights reserved

124
MSI 株式会社 Copy right©2015 All rights reserved

125
MSI 株式会社 Copy right©2015 All rights reserved

Appendix A さらに理解を深めるには
A.1 Xpress のインストレーション、ライセンシング、トラブルシューティング「Xpress のインストール方法」に関する詳細情報は、ソフトウェアのご提供時、必ず、付属しています。また、Xpress website のクライアントエリアから、「Licensing User Guide」がダウンロード頂けます。ライセンスキーの取得をご希望のお客さまは Xpress 日本配給元 MSI（株）Xpress 事業部までお問合せください：xpress@msi-jp.cm
万一、ソフトウェアのインストールやライセンスの設定で問題が発生した場合は、下記にご連絡下さい: xpress@msi-jp.com

A.2 ユーザー・ガイド、参照マニュアル、その他の資料<<Xpress 日本配給元 MSI の WEB サイトでは Xpress に関連するホワイトペーパーや各種参考資料、マニュアルを数多く掲載しております。是非、お役立てください>>・Xpress 日本配給元 MSI WEB サイト：http://www.msi-jp.com/xpress/
・Xpress を初めてご使用の方へ：http://www.msi-jp.com/xpress/biginners.html(Xpress ダウンロード、マニュアル、例題等を掲載したページです。)
・学習広場：http://www.msi-jp.com/xpress/learning/square/（Xpress 学習に関する様々な資料を網羅したページです。）

A.2.1 モデル作成
・Xpress を使用した様々なアプリケーション問題（60 例題集）に関する定式化方法が掲載されています。是非、ご活用ください：https://www.msi-jp.com/xpress/download/xpress60.html

A.2.2 Mosel
・Mosel の使用方法に関する詳細情報は、「Mosel User Guide」をご確認ください。
：http://www.msi-jp.com/xpress/learning/square/mosel_jp.pdf
・Mosel 言語に関する詳細情報は「Mosel libraries Reference Manual」をご確認ください。
：http://www.msi-jp.com/xpress/learning/square/Xpress-Mosel-Libraries.pdf
上記のマニュアルには Mosel Distribution (mmxps、mmodbc、mmive など）のモジュールにより定義されたフィーチャーも含まれています。Mosel Compiler と Mosel Run-time libraries は、”
Mosel Libraries Reference Manual”に文書化されています。

A.2.3 BCL
・BCL の使用方法や、C ライブラリ・ファンクション、C++クラスに関する詳細情報は「BCL Reference Manual」をご確認ください。
126
MSI 株式会社 Copy right©2015 All rights reserved

：https://www.msi-jp.com/xpress/learning/square/bcl_jp.pdf

A.2.4 Optimizer
・Xpress Optimizer に関する詳細情報は「Optimizer Reference Manual」をご確認ください。
Optimizer の全機能を掲載しています。また Xpress Optimizer で提供されている問題や、コントロー
ルパラメータを網羅したリストも掲載しています。
：http://www.msi-jp.com/xpress/learning/square/optimizer_jp.pdf

A.2.5 その他のソルバーおよび解法
当ガイド「Xpress Getting started」で紹介していないソルバーや解法に関する詳細情報は、Xpress
日本配給元 MSI(株)Xpress 事業部の WEB サイトをご確認ください。
：http://www.msi-jp.com/xpress/
・Successive Linear programming(SLP)は非線形計画問題を最適に解く方法です。Xpress-SLP ソ
ルバーは Mosel モジュール、mmxslp またはライブラリ形式として提供されています。SLP ソルバーの機能に関する詳細情報は「Xpress-SLP Reference Manual」をご確認ください：http://www.msi-jp.com/xpress/learning/square/slpref.pdf
・Stochastic Programming(SP)は多くの場合不安定なサブジェクトのアプリケーションデータを扱います。Xpress-SP ソフトウエアは Mosel、mmsp 形式で利用でき SP 問題を表現するためシナリオ・ツ
リーとして扱うことが可能です。SP ソフトウエアのご使用方法は「Xpress-SP Reference Manual」で解説しています。（Xpress-SP Reference manual は Xpress のウエブサイトにある Mosel open surceからダウンロードしご利用ください。）
・Constraint Programming(CP)は問題を解くアプローチの 1 つでとくにスケジュール作成問題、計画問題でしばし発生する離散的変数に関する非線形制約式を扱うのに適しています。Xpress-Kail ソ
フトウエアは Artelys Kails Constraint ソルバー向けのインターフェースで特定のスケジュール作成
問題、計画問題の総合的なモデル作成サブジェクトとして定義されており、Mosel モジュール、Kails
形式で提供されています。詳細は Xpress-Kails Reference Maunal および Xpress-Kails User
Guide をご確認ください。

127
MSI 株式会社 Copy right©2015 All rights reserved

Appendix B グロッサリー
・Basis （基底)：シンプレックス・アルゴリズムで LP 問題を解くとき、基底は、所与のソリューション
内で、どの変数と制約式がアクティブかについての完全な情報を与えます。したがって、問題を解いているある時点で、その時点でのソリューション・アルゴリズムの状態を基底を使ってセーブし、逆に、その基底を使い、ソリューション・アルゴリズム内に基底をセーブした時点での状態を迅速に復元するために使用できます。
・Binary model file （BIM ファイル)：Mosel が利用可能なすべてのプラットフォームで横断的に使えるポータブルな .mos モデルファイルのコンパイル・バージョン。これには、外部のファイルから読まれたデータを含みません。これらのデータは、別個のファイルから読み込む必要があります。こうする
ことにより、同じ BIM ファイルを、異なるデータセットで実行することができるようになり、便利です。
・Bound（ バウンド）：単一の変数についての等式、または、不等式制約式。Mosel または BCL を通じて Xpress-Optimizer を使うとき、バウンドを使うと、問題を再ロードすることなく、バウンドを変更できます。
・Branch-and-Bound（ 分枝限定法）：MIP 問題の解を得る方法で、LP で実行可能領域を確認しつつ、離散的な変数の実行可能領域内の値を調べ上げることからなっている。一般に、すべてのノードが LP 問題の解を表す Branch-and-Bound ツリーという形で示されます。あるノードと次のノードは、親のノードのバウンドを変更したり制約式を追加したりして結びついています。このような列挙型の方法では、問題が相対的に小さい場合でも、コンピュータでのデータ処理量を爆発的に大きくするので、常に、optimal な MIP 解を得ようとすることは現実的ではありません。
・Branch-and-Cut（ ブランチ・アンド・カット）：Branch- and-Bound に似た MIP 問題の解を得るア
ルゴリズム。このアルゴリズムでは、サーチ・ツリーの中で、いくつかのノード、または、すべてのノード
で、LP 緩和の条件を厳しくして、そこから先のサーチを行わないようにします。
・Builder Component Library （BCL) ：プログラミング言語の中で、モデルを、直接、開発するためのモデルビルダーライブラリ。BCL により、ユーザは、専門のモデリング言語のそれと同様な（変数、制約式、インデックス・セットのような）オブジェクトを使って、モデルを定式化することができます。
・Constraint （制約式)：変数の間の関係。制約式のタイプには、等式（演算子は Mosel では=、
BCL、C++では==）、不等式（演算子は Mosel、BCL、C++では、> =と< =）、および、
Integrality conditions があります。バウンドは、等式、または、不等式の制約式の特別なケースで
128
MSI 株式会社 Copy right©2015 All rights reservedす。
・Cut（ カット）：別名 validinequality。あらゆる実行可能解では満足されなければならないが、整数解のセットの特性を示すのには必要ではない MIP 問題に追加される制約式。Cut は、LP 緩和を厳しくして、LP 解の実行可能領域を MIP 解スペースの convex hull に近付けます。
・Variable（ 変数）：ソリューション・アルゴリズムにより値を割り当てられる未知数。基本的な変数タ
イプは、連続変数（所与の下限、および、上限の間の連続的なドメインの値を取る）、可変の、取っている値）。離散的な変数タイプには、バイナリ変数（indicator variable とも呼ばれる。この変数は、値0、または、値 1 のみを取る)、整数変数（所与の範囲の間の整数値のみを取る）、セミ連続変数（値0 か、所与の下限と上限の範囲の連続的な値を取る）、セミ連続整数変数（値 0 か、所与の下限と上限の範囲の整数値を取る）、部分整数変数（所与の下限と上限の範囲では整数値を取り、上限を越えると連続変数となる）があります。
・Declaration（ デクラレーション）：オブジェクトのデクラレーションにより、そのフォームとタイプを宣言します。通常、その内容の定義に先行します。Mosel では、基本タイプとリニアの制約式のデクラレーションはオプションですが、変数は、いつも宣言されなければなりません。サブルーチンは、モデル内で使われるならば、それらの定義の前で宣言されていなければなりません。
・Dynamicset, dynamicarray（ 動的セット、動的配列）：Mosel では、サイズがわからない場合は、セットと配列は、すべて、ダイナミック・オブジェクトとして生成されます。これらのオブジェクトは、それらに割り当てられた内容によって動的に大きくなり、また、セットは小さくもなります。動的なセットは、静的にすることもできます（finalize） 。こうすることにより、これらのセットによりインデックスを付され、finalize した後に宣言された配列の処理が効率的になります。さらに重要なことは、これにより、もしセットが動的ならば、検出できない ‘out of range’ エラーを Mosel がチェックできるようになります。
スパース（密度の低い）データテーブルは動的な配列に蓄えられるべきですが、密度の高いテーブ
ルは、静的な配列に蓄えたほうが、より効率的です。
・Heuristic（ ヒューリスティック)：問題の実現可能解を見つけるためのアルゴリズム。ヒューリスティッ
クによっては、解のよしあしの限界を保証できるけれど、普通、optimality については、なんの保障もありません。
・Index set （インデックス・セット)：セットは、配列にインデックスを付けるために使われます。文字列
インデックスを使うことにより、Mosel や BCL により生成されるアウトプットの理解が容易になります。
・Interactive Visual Environment（IVE）：Mosel のための開発環境で、他にもいろいろツールを持129
MSI 株式会社 Copy right©2015 All rights reserved

っていますが、これにより、特に、ソリューション情報のグラフィカルなディスプレイが便利です。
・Linear Programming （LP) problem（ 線形計画法問題）：すべての制約式、および、目的関数が、変数の一次式で表現される数理計画法の問題。ここで、変数は、すべて、連続変数、すな
わち、（通常）、非負の真数を取ります。広く知られている問題で、そこでは、効率的なアルゴリズム（Simplex 法、内点法）の存在が、よく知られています。
・Loop（ ループ)：ループは、何度も繰り返えす必要のある動作をグループ化します。繰り返えしは、インデックスのすべての値、または、カウンター（Mosel の forall） 、または、ある特定の条件が満たされているかどうかによって（Mosel の while、repeat until） 行われます。
・LP relaxation （LP 緩和)：LP 緩和は、MIP 問題で、変数の整数条件を緩めることによって得られます。
・Mathematical Programming problem（ 数理計画問題）：一組の変数、これらの変数を組み合わせた制約式、および、最大化、または、最小化される目的関数からなる問題。
・Matrix（ マトリックス）：一次制約式からなる数理計画問題のマトリックス表示で、このテーブルでは、
column が変数、row が制約式を表すように作成されます。このテーブルのエントリーは、制約式の変数の係数であり、通常、スパース（まばら）なフォーマットで蓄えられており、ノンゼロの係数だけが入力されます。
・Mixed Integer Programming （MIP) problem（ 混合整数計画法（MIP） 問題）：ちょうど LP と同じように、制約式と目的関数が一次式ですが、変数は、離散的な、もしくは、連続的なドメインを持つ
ことができる数理計画法問題。このタイプの問題を解くには、LP 技法と Branch-and-Bound（ 分枝限定法）のテクニックを結び付けたもの使います。
・Modeling language（ モデリング言語)：（Mosel 言語などのような）高級言語で、ユーザーは、数理計画問題を数式的な表現に近い形式で記述することができます。そして、自動的にソルバーが必要とする表現に変換します。
・Model（ モデル)：問題を数学的に表現したもの。また、Mosel や BCL などのモデリングツールでのインプリメンテーションを意味するのにも使われます。
・Module（ モジュール）： Dynamic shared object （DSO) とも呼ばれます。Mosel Native

130
MSI 株式会社 Copy right©2015 All rights reserved

Interface により規定されている約束事を守る、Ｃプログラミング言語によって書かれた dynamic
library。モジュールによって、ユーザーは、（例えば、問題固有のデータ処理を行ったり、外部のソ
ルバーやソリューション・アルゴリズムとの接続などを行ったりして）新しいフィーチャーを加え、Mosel
言語を拡張できます。FICO 社によって提供されているモジュールには、Xpress-Optimizer（LP 、MIP、QP） や Xpress-SLP へのアクセス、（例えば、ODBC 経由の）データ・ハンドリング機能、シ
ステム・ファンクションへのアクセスなどがあります。
・Mosel（ モーゼル）：モデリングとプログラミング言語である Mosel 言語、Mosel モデルをアプリケー
ションに埋め込むための Mosel ライブラリ、および、モジュールという形で外部に Mosel 言語を開く
Mosel ネイティブインタフェースからなっているモデル作成とソルビング環境。
・Mosel Native Interface（NI） モーゼル・ネイティブ・インタフェース：実行の間に、Mosel モデルへのアクセスを行えるようにするサブルーチンライブラリ。また、Mosel モジュールにより守られるべき約束事も定義します。NI により、ユーザーは、新しい機能によって Mosel 言語を拡張することができます。
・Newton-Barrier algorithm（ ニュートン・バリア・アルゴリズム）：内点法アルゴリズムとも呼ばれます。LP 問題と QP 問題のためのソリューション・アルゴリズムで、実行可能領域内のある点から、実行可能領域セットの境界に触れることなく、最適解に進む方式を取るアルゴリズム。
・Non-linear Programming （NLP) problem（ 非線形計画法（NLP） 問題）：非線形な制約式、または、目的関数を持つ数理計画問題。しばしば、よい（ローカル・オプティマム）解を得るために、ヒューリスティック、ないしは、近似法が使用されます。Xpress-MP により提供される、このタイプの問題を解く方法は、Successive LinearProgramming（SLP） です。
・Objective function（ 目的関数）：変数の組合せで表現される最小化、または、最大化される数式（このマニュアルでは、一次式、および、二次式の数式だけについて、説明されています）。
・Optimization（ 最適化）：与えられた目的関数の値を最小化するか、または、最大化する問題の実行可能解を見つけること。
・Optimizer： LP 、MIP、および、QP のための Xpress-MP ソルバー。ライブラリ、または、スタンドア
ロンのプログラムという形で利用可能です。
・Overloading（ オーバーローディング）：いろいろなタイプ、または、いろいろなアーギュメントのため、いくつかのバージョンで定義されているサブルーチン。いろいろなオペランドタイプ、または、オ
131
MSI 株式会社 Copy right©2015 All rights reservedペランドタイプの組合せ向けに定義されるオペレータ。
・Parameter（ パラメータ）：この用語は、文脈によって、少し違う意味をいくつか持っています。
（Mosel の）モデルパラメータの設定は、例えば、ランを行うときに、種々の入力データセットを定義するために変更できます。（Optimizer の中で、通常、問題アトリビュートと呼ばれている）問題パラメータにより、問題についての情報（例えば、ソリューションステータス）へのアクセスが行え、普通、リードオンリーです。また、アルゴリズムコントロールパラメータは、（アルゴリズムの選択、トレランスの設定などの）アルゴリズムの設定をコントロールするために用いられます。
・Problem instance（ 問題例）：特定のデータセットを備えている数理計画問題。
・Quadratic Programming （QP) problem（ 二次計画法（QP） 問題）：目的関数に二次項を持つという点で、 LP 問題と異なります。ただし、制約式は一次式のままです。変数は、連続でも離散的でもかまいません。後者の場合、これは、混合整数二次計画（MIQP） モデルのことを話していることを意味します。
・Range set （レンジ・セット)：（Mosel において）連続的な整数の集合。
・Right hand side （RHS) （右手側（RHS））：（ 一次）制約式の右辺定数。（例えば、マトリックス表
示で使われる）標準のフォーマットでは、等号、不等号の左側に、変数を含むすべての項を、そして、
等号、不等号の右側に定数を書きます。
・Selection Statement （選択ステートメント）：プログラムの中で、取り得る種々のアクションの中からの選択を表現するステートメント。Mosel では、これらの選択ステートメントは、
if/then/elif/then/else/end-if/case です。
・Simplex algorithm（ シンプレックス・アルゴリズム）：LP 問題のための解法アルゴリズム。シンプ
レックス・アルゴリズムのアイデアは、目的関数の値を改善するために、LP 問題の実行可能解の頂点から別の頂点に動いて行きます。
・Solution（ ソリューション、解）：この用語は 2 つの異なる意味で使われます。その一は、制約式の条件、すべてを満たしているすべての変数に値を割り当てることを意味しますが、この場合、すべての実行可能解が含まれます。また、その二は、最もよい実行可能解が捜される最適化問題で、すな
わち、与えられた目的関数の値を最小化するか、または、最大化する解です。この場合、これは、通常、最適解（optimum solution） と同じです。

132
MSI 株式会社 Copy right©2015 All rights reserved

・Solver（ ソルバー)：問題を解く（通常、最適化を行う）のに使われるソフトウェア。Xpress-MP では、
Xpress-Optimizer がこれに当たります。
・Status information（ ステータス情報）：Mosel 、BCL、Xpress-Optimizer は、LP や MIPのステータス情報を提供するのに、異なるパラメータを定義します。ステータス情報を見ることで、ユーザーは、問題が正しく解かれたか、そして、ソリューションが利用可能かなどのしることができます。
・Subroutine （サブルーチン）：プログラムを小さいサブタスクに分割し、より理解しやすく、したがって、使いやすくするための基礎構造。Mosel では、サブルーチンは、手順（procedure） 、ファンクシ
ョン（function) という形で使用できます。Procedure は、プログラム・ステートメントとしてコールされ、値を返して寄越しませんが（no returnvalue)、function は、返して寄越す値を使用する expression
としてコールされなければなりません。
・Successive Linear Programming（ 連続線形計画法（SLP）) ： LP 問題を繰り返し解くことにより、
NLP 問題を解く方法。

133
MSI 株式会社 Copy right©2015 All rights reserved