LoginSignup
8
3

More than 5 years have passed since last update.

OPL言語の基礎

Last updated at Posted at 2016-11-08

どんな言語なの?

OPL言語は数理最適化問題を解くソフトウェアである、IBM ILOGを利用するためのソフトウェアです。
この言語で問題をモデリングすることで、複雑な問題を高速に解かせることが出来ます。

基本事項

  • 使えるのは、Integerfloatidentifierstring、予約語
  • 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*}
lp.opl
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

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3