Model objects
Set, Parameter, Variable, Constraint, Objectiveの5つ

Symbolic Nameは、大文字小文字の区別あり。

文字列を入れるときは、シングルクオーテオションかダブルクオーテーションの どちらかで囲む。どちらでもよい(区別なし)。

Iterated expressionは、sum, prod, min, maxの4つ。たとえばmin_{(i1,..,in)} x(i1,..,in)は、 (i1,...,in) \in \Deltaがとりうる全てのn-tupleの中の最小値を計算してくれる

演算子は、+x, -x, x+y, x-y, x less y, x * y, x/y, x div y, x mod y, x**y または x^y。

文字列の結合は、str1 & str2で可能


indexingの表現は、
t in S
(t1,t2,..,tk) in S
S
の3つ。 集合Sが1-tupleの場合は、最初の形式を使わなければならない。n-tuple (n>1)であれば、 2番目の形式をつかわなければならない。

Indexingのしくみの例.集合A,B,Cを以下で定義する
A={4,7,9}
B={(1,Jan),(1,Feb),(2,Mar),(2,Apr),(3,May),(3,Jun)
C={a,b,c}
これらの集合を用いて定義する表現
{i in A,(j,k) in B, l in C} は, 手順として以下のものにおなじ

for all i in A do
	for all (j,k) in B do
			for all l in C do
				action;
				
なので、
sum{i in A, (j,k) in B, l in C} p[i,j,k,l]
は、\sum_{i \in A, (j,k) \in B, l \in C} (p_{ijkl})をあらわす。
i in A, (j,k) in B, l in Cからなる4-tupleの集合をつくりたいだけだったら、
{A,B,C}だけでよい。すなわち、ダミー添字i,(j,k),lはいらない。
パラメータの添字にもindexingの表現はつかえる。たとえば、
par p{i in A, (j,k) in B, l in C} ...;によって、4-tupleを 添字にもつパラメタpを定義できる.
次の表現は注意する必要がある
{i in A,(i-1,k) in B, l in C}は、"3-tuple"を表現する。 これをアルゴリズム風に書くと
for all i in A do
	for all (j,k) in B and j=i-1 do
			for all l in C do
				action;
				
なので、{}内の2番目(集合Bのところ)に、計算表現i-1がでてきてもよい。この表現によって得られるのは、
{(4,May,a),(4,May,b),(4,May,c),(4,Jun,a),(4,Jun,b),(4,Jun,c)}


関係演算子は、

  • xx<=y,
  • x=yまたは、x==y,
  • x>=y, x<>yまたはx!=y,
  • x in Y,
  • (x1,..,xn) in Y,
  • x not in Yまたはx !in Y,
  • (x1,..,xn) not in Yまたは (x1,...,xn) !in Y,
  • X within Y,
  • X not within YまたはX !within Y

論理演算子は,not xまたは!x, x and y またはx&&y, x or yまたは x||y


集合の宣言は、
set name alias domain,attrib,...,attrib;
alias,domain,attribはオプション.

  • dimen n: n-tuplesの次元を指定する
  • within expression: 集合"name"は、expressionで表現される集合の部分集合。
  • := メンバを指定
  • default: デフォルト値

パラメタの宣言は、
param name alias domain,attrib,...,attrib;
alias,domain,attribはオプション.
attributeとして指定可能なのは、integer, binary, symbolic, relation expression, "in" expression, ":=" expression, "default" expression.

変数の宣言は、
var name alias domain,attrib,...,attrib;
alias,domain,attribはオプション.
attributeで指定できるのは, integer, binary, ">=", "<=", "="または"==".
LPでの各変数は、自由変数として定義される。だから、 非負変数にしたい場合は、明示的に">=0"と指定する必要がある。


データの定義。データは*.datファイルに記述することができる。モデルを記述する *.modファイルと分離することができる。これにより、同じモデルを違うデータで 解くことができる.

データブロックの記述形式は
set name, record,...,record;
set name [symbol,...,symbol],record,...,record;
データレコード:

  • ":=":意味なし。読み易さのために挿入してもよい
  • "()":スライス。意味は後述
  • simple-data
  • : matrix-data
  • (tr):matrix-data

記述例
set month := Jan Feb Mar Apr May Jun;
set month "Jan", "Feb", "Mar", "Apr", "May", "Jun";
set B:=(*,*,*) 1 2 3,1 3 2, 2 3 1, 2 1 3, 1 2 2, 1 1 1, 2 1 1;
set B:=(1,*,2) 3 2 (2,*,1) 3 1 (1,2,3) (2,1,3) (1,1,1);

1行目と2行目は、同じ集合monthを定義する2とおりの方法である。 おなじく、3行目と4行目は、同じ集合Bを定義する2とおりの方法である。 データの間にあるカンマはいれてもいれなくてもよい.
集合Bの定義ではスライスをつかっている。

スライスの記述形式は, (s1,s2,..,sn).ここで、s1,s2...は数字か アスタリスク(*). ()に含まれる数字または*の数は、集合の次元と一致しなければならない。 上の例では Bが3-tupleなら,(*,*,*)でも(1,*,2)でもとにかく3つの要素が含まれなけ ればならない。アスタリスクが含まれている場合、アスタリスクがそれに続く数字に おきかえられる。上の例では、(1,*,2)のあとに"3 2"が続くので、*をそれぞれ3,2で 置きかえた3-tuple(1,3,2)(1,2,2)が集合Bの要素として含まれるようになる。

行列データ形式

				:	c1	c2	...	cn	:=
				r1	a11	a12	...	a1n	
				r2	a21	a22	...	a2n	
				..	..	..	...	..	
				rm	am1	am2	...	amn	
				
c1の前の":"と、cnのあとの":="は省略可能.
各a_{ij}は,2-tuple(r_i,c_j)に対応している. a_{ij}=+であれば、対応する(r_i,c_j)が集合に含まれる。 -なら含まれない。


パラメタデータブロック
param name, record,... ,record
param name default value,record,...,record;
param: tabbing-data;
param default value: tabbing-data;

recordには以下のいずれかが入る

  • ":="は意味がない。読み易さのために挿入してもよい。
  • "[]":スライスをあらわす
  • plain-data
  • : tabular-data
  • (tr): tabular-data
plain-data形式は、添字のリストとその値をplain formatで与える。 形式は、
t1,t2,...,tn,v
で、t1,t2,..,tnが添字でvが値。0-次元のパラメタは添字がないので、 値のみ指定すればよい。例: param T 4;
tabular-data形式は、2つの添字に対して1つ値を与える。
				:	c1	c2	...	cn	:=
				r1	a11	a12	...	a1n	
				r2	a21	a22	...	a2n	
				..	..	..	...	..	
				rm	am1	am2	...	amn	
				
tabbing-data形式では、次のフォーマットで値を指定する
	param default value :s: p1,	p2,	..., pk	:=
	   t11, t12, ..., t1n, a11, a12, ..., a1k
	   t21, t22, ..., t2n, a21, a22, ..., a2k
		.............
	   tm1, tm2, ..., tmn, am1, am2, ..., amk;
				
defaultは省略可能、名前"s"も省略可能.","も省略可能。 このtabbing-data形式は、以下と同値
set s:=(t11,t12,...,t1n)(t21,t22,...,t2n) ...(tm1,tm2,...,tmn)
param pj default value:= [t11,t12,...,t1n] a1j [t21,t22,...,t2n] a2j ... [tm1,tm2,...,tmn] amj; (j=1,2,...k)
つまり、2つ組(p_j, [t_{i1},t_{i2},..,t_{in}]に値a_{ij}を 関連つける。
よくでてくる例:
param trans_cost:=
[*,*,bands]: FRA	DET	LAN	WIN	STL	FRE	LAF	:=
GARY	30	10	8	10	11	71	6
CLEV	22	7	10	7	21	82	13
PITT	19	11	12	10	25	83	15
[*,*,coils]: FRA	DET	LAN	WIN	STL	FRE	LAF	:=
GARY	39	14	11	14	16	82	8
CLEV	27	9	12	9	26	95	17
PITT	24	14	17	13	28	99	20
[*,*,plate]: FRA	DET	LAN	WIN	STL	FRE	LAF	:=
GARY	41	15	12	16	17	86	8
CLEV	29	9	13	9	28	99	18
PITT	26	14	17	13	31	104	20;
これを解読する。まず、trans_cost:=[*,*,bands]とあるので、trans_costは3-tuple であることがわかる。[*,*,bands]はスライスなので、後に続く2-tupleが*,*に 入ることがわかる。[*,*,bands]のあとの部分を抜き出すと、
: FRA	DET	LAN	WIN	STL	FRE	LAF	:=
GARY	30	10	8	10	11	71	6
CLEV	22	7	10	7	21	82	13
PITT	19	11	12	10	25	83	15
となっている。これは行列データ形式(Matrix data record)で書かれた、 (r_i,c_j)とその値a_{ij}のあつまりであることがわかる。したがって、 [*,*,bands]の2つのアスタリスクには、行列の行r_i \in {FRA,DET,LAN...}と 列c_j \in {GARY,CLEV,PITT}がそれぞれ代入して得られる集合 {[r_i,c_j,bands]: r_i \in {FRA,DET,LAN..}, c_j \in {GARY,CLEV,PITT}} が生成される。 結局, trans_dataは、[r_i,c_j,bandsに対して、行列の各値a_{ij}を対応づけた パラメタになる。


2010.10.08