Deklarációk
A modell leírásának legalapvetőbb egységei az adatszerkezetek deklarációi.
param
A param kulcsszóval paramétert deklaráhatunk (Nahát!). Egydimenziós esetben ez egy skalárt jelent, több dimenzióban pedig tömböt deklarálhatunk. A paraméternek kötelező nevet adni, megadható index, valamint opcionálisan az alábbi attribútumokat fűzhetjük hozzá:
- integer: egész értékű paraméter
- binary: bináris értékű paraméter
- symbolic: string típusú paraméter
- relation expr: alapvető feltételek, pl korlátok megadása
- in expr: alaphalmaz megadása
- := expr: érték megadása
- default expr: alapértelmezett érték megadása
Példák:
param n default 0; # egyszerű definíció alapértelmezett értékkel
param i := 20, integer, >= 0, <= 100; # egész, korlátokkal
param month symbolic default 'May' in {'Mar', 'Apr', 'May'}; # String típusú, értelmezési tartománnyal
param profit{product, month}; # Többdimenziós
set
A set kulcsszóval halmazt deklaráhatunk. A halmaz alapvető tulajdonságai hasonlók a paraméteréhez, az opcionális attribútumai:
- dimen n: a halmaz elemei rendezett n-esek lesznek
- within expr: ős/szuperhalmaz meghatározása
- := expr: érték megadása
- default expr: alapértelmezett érték megadása
Példák:
set V; # egyszerű halmaz definíció
set E within V cross V; # halmaz definíció szuperhalmazzal
set points{1..k} dimen 2 # rendezett 2-esek halmaza
var
A var kulcsszóval változót deklaráhatunk. A változó minden esetben szám, egy dimenzióban skalár, több dimenzióban skalárok tömbje. A változó opcionális paraméterei:
- integer: egész értékű változó
- binary: bináris értékű változó
- >= expr: alsó korlát megadása
- <= expr: felső korlát megadása
- = expr, == expr: fix érték megadása
Példák:
var x >= 0; # Egyszerű, pozítív változó (lebegőpontos)
var y{I,J}; # Kétdimenziós skalár-tömb
var make{p in prd}, integer, >= commit[p], <= market[p]; # egész értékű változó korlátokkal
Feltételek
A modellhez feltételeket a subject to, subj to, s.t., ε kulcsszavak valamelyikével adhatunk. A feltételeknek kötelező nevet, valamint egy kifejezést megadni. Opcionálisan adhatók meg futóindexek, és alsó-felső korlát kifejezések
s.t. r: x + y + z, >= 0, <= 1; # Alsó és felső korlát x+y+z értékére
subject to balance{i in raw, t in 1..T}: store[i,t+1] - store[i,t] - sum{j in prd} units[i,j] * make[j,t]; # == 0
Célfüggvény
A minimize / maximize kulcsszavakkal adhatjuk meg a modell célfüggvényét. A solver mindig csak az első célfüggvényre fog optimalizálni! A célfüggvénynek adnunk kell egy nevet és egy lineáris kifejezést
minimize cost: sum{i in 1..k, j in 1..n} f[i,j] * x[i,j]; # Minimalizáljuk f és x szorzatösszegét!