どんな言語なの?
OPL言語は数理最適化問題を解くソフトウェアである、IBM ILOGを利用するためのソフトウェアです。
この言語で問題をモデリングすることで、複雑な問題を高速に解かせることが出来ます。
基本事項
- 使えるのは、
Integer
、float
、identifier
、string
、予約語 -
int+
、float+
など符号をつけるを、その符号のみを取る型になる - Identifierは英文字もしくはアンダースコアで始めること、英文字・数字・アンダースコアが利用可能
- Integerは整数、floatは小数点表示、浮動小数点表示
-
//
をつけると行末までコメント、複数行のコメントは/* */
でくくる - 制御文字はほぼC言語などと同じ
- 複数行に渡る記述は、
\
(バックスラッシュ)を入れると、改行可
Ranges
整数で作られるRangesはOPL言語の基本であり、配列や変数宣言、まとめた操作やクエリなどで使用します。基本的にはint
型で使用されますが、float
型でも使用することが出来ます。
宣言
rangesを宣言するには、下限と上限を指定して、宣言します。
range Rows = 1..10;
int n = 8;
range Rows = n+1..2*n+1;
宣言したあとは、配列の添字などとして利用する事ができます。range
が空の場合(上限が下限より小さい場合)などは、自動的に0..-1
と置き直されます。言い換えると空のrange
はすべて等しくなります。
例
- 配列の宣言時に使用する
range R = 1..100;
int A[R]; //サイズが100の配列
- 繰り返し分のイテレーターとして
range R = 1..100;
forall(i in R){
//roop
}
-
int
型変数の領域として
dvar int i in R;
配列
1次元配列
基本的に先程のRangesを利用して宣言します。
配列の添字は任意の型の有限の集合である必要があります。
int a[1..4] = [10, 20, 30, 40];
string d[1..2] = ["Jan", "Feb"];
多次元配列
OPL言語は多次元配列をサポートしています。
添字は違うデータ型を組み合わせることが出来ます。
// 1.違うデータ型の添字
int a[Days][1..3] = ...;
// 2.違う配列の表現
{string} src = ...;
{string} dst = ...;
int arr[src][dst] = ...;
// 3. 2.と同様のタプルをつかった表現
{string} src = ...;
{string} dst = ...;
tuple edge {
string s;
string d;
}
{edge} edges = ...;
int arr[edges] = ...;
タプル
OPL言語でのデータ構造はタプルを使って表現できます。
使い方はC言語の構造体と同じです。
多次元配列でタプルは使うことが出来ません。
tuple Point {
int x;
int y;
};
Point point[i in 1..3] = <i,i+1>;
Point p = <2,3>;
{Point} points = {<1,2>,<3,4>};
データーベースとして使いたいときは、タプルの要素にキーを追加することが出来ます。
キーは複数設定できますが、キーが1つであればキーとなる要素のみで呼び出すことが出来ます。
tuple people {
key string name;
int age;
int gender;
}
タプルの要素にできるもの
- プリミティブ型
- タプル(サブタプルと呼ばれます)
-
string
型以外のプリミティブ型の配列 - プリミティブ型のセット
多次元配列は要素に出来ません!
セット
セットとはインデックス化されていない、重複のない要素の集合のことです(他言語で言うリスト)。
宣言はTを型とすると、以下のようにして行います。
{int} ints = ...; // int型のセット
setof(string) strings = ...; // string型のセット
操作 | 記法 |
---|---|
union, inter, diff, symdiff | set = set1 function set2 |
first, last | elt = function(set) |
next, prev | elt = function(set,elt,int) |
nextc, prevc | elt = function(set,elt,int) |
item | elt = function(set,int) |
ord | int = function(set,elt) |
記述例 - 線形計画問題
基本的な線形計画問題の例
\begin{equation*}
\begin{aligned}
& \text{minimize} & &2x+3y \\
& \text{subject to} & & 4x+3y\leq 120\\
& & & x+2y\leq 60\\
\end{aligned}
\end{equation*}
dvar int+ x;
dvar int+ y;
maximize x*2+y*3;
subject to{
x*4+y*3<=120;
x+y*2<=60;
};
dvar
はOPL言語特有の記法で、決定変数のことです。プログラムによって値を変える変数に、dvar
を指定します。
参考資料
OPL Language Reference Manual - IBM
Where to find the CPLEX examples - IBM