GAMS-ban a skalárok dinamikus típusúak, értéke lehet tetszőleges szám, illetve acronym. Skalárok az alábbi formában adhatók meg:
scalar skalar_neve opcionalis_magyarazat /numerikus_ertek/;
Kezdőérték megadása nem kötelező, később is lehet az adott skalárhoz
értéket rendelni, de akkor már az értékadás operátorral. Több skalárt
is definiálhatunk egy scalar utasításon belül (mert ez is egy
utasítás, mintha C-ben azt mondanánk, hogy: int j = 5;
//magyarazat
), azokat vesszővel elválasztva egymástól, illetve
a scalar kulcsszó használható scalars formában is.
Itt már különböző típusok vannak, ellentétben a skalárokkal. Az általános megadási forma az alábbi:
valtozo_tipus valtozo_neve(setdependecy) opcionalis_magyarazat ;
Ahol setdependency mondja meg, hogy mely halmazhoz kapcsolódik (nem kötelező halmazhoz kapcsolnunk a változót!), valtozo_tipus az alábbi lehetséges típusok közül az egyik:
Változó típusa | Magyarázat |
variable | Nincs semmilyen megkötés a változóra, értéke mínusz végtelen és plusz végtelen között bármi lehet. |
free variable | Ugyanaz, mint az előbbi eset. |
positive variable | Nemnegatív értékű változó, 0 és plusz végtelen közötti tetszőleges érték megengedett. |
negative variable | Nempozitív értékű változó, mínusz végtelen és 0 közötti tetszőleges érték megengedett. |
binary variable | Csak a 0 és az 1 a két megengedett érték, egész értékű programozási feladatban szokás használni. |
integer variable | Nemnegatív egész értekek megengedettek, alapértelmezésben 0 és 100 között lehet. |
SOS1 variable | Változók egy csoportja, amelyek közül legfeljebb egy lehet nullától különböző pozitív. |
SOS2 variable | Változók egy csoportja, amelyek közül legfeljebb kettő lehet nullától különböző pozitív. |
semicont variable | Szemi-folytonos, értéke lehet 0 vagy egy megadott (pozitív) értéknél nagyobb. |
semiint variable | Szemi-egész, értéke lehet 0 vagy egy megadott (pozitív) értéknél nagyobb egész. |
A halmazok a GAMS modell legfontosabb részét képezik. Matematikai értelelmben vett halmazok ezek, minden elem pontosan egyszer szerepelhet bennük. A halmazok elemei karaktersorozatok, ezek szintaktikájára vonatkozó megszorítások a "Nyelvi elemek" fejezet Halmazok elemeinek nevei pontban olvashatók.
Mire is jók a halmazok? Indexek megadására szolgálnak, amely indexekhez különböző adatokat szeretnénk rendelni. De talán a példa alapján világosabbá válik a szerepük.
Általános megadási mód:
Az alábbiakban olvashatók a halmazokkal kapcsolatos legfontosabb tudnivalók, további információk a linkek linkek között található weboldalakon találhatók.
Definiálhatjuk halmazok részhalmazait is, az alábbi módon:
Az elsődleges mód az explicit megadás, azaz felsoroljuk a halmaz elemeit. Ugyanakkor nem szükséges az összes elemet kiírni, ha azok egy sorozatot alkotnak. Például az r1, r2, r3, r4 elemsorozat megadható r1*r4 formában is.
Megadhatjuk részhalmazok elemeit értékadó utasítással is. Ezt a
formában tehetjük meg, amely ekvivalens azzal, hogy felsoroljuk a halmaz elemei között a megfelelő elemet. Ha pedig szeretnénk eltávolítani egy adott elemet egy halmazból, akkor használhatjuk a
utasítást. Ha egy részhalmaz eleméről nem mondunk semmit, akkor alapértelmezésben az nem lesz eleme a halmaznak, azaz 'no' az értéke.
Definiálhatunk többdimenziós (legfeljebb 10 dimenziós) halmazokat is, a megfelelő elemek közé pontot téve, azaz:
Ebben a pontban az alábbi definíciókkal dolgozunk:
Következőt szeretnénk: az x paraméter értéke minden egyes halmaz-elemre legyen 4, majd az y paraméter értéke szintén minden halmaz-elemre legyen kétszerese az x-beli értéknek, végül összegezzük a z skalárba x-ben szereplő értékeket. Ezt így tehetjük meg:
Ha pedig egy halmaz egyetlen elemére szeretnénk hivatkozni, akkor azt az elemet idézőjelek között kell megadni. Vagyis ha szeretnénk a fenti x paraméterben a 200. elemet megváltoztatni 10-re, akkor azt az alábbi utasítás teszi meg:
Egy adott halmaz részhalmazain végezhetünk halmazműveleteket. El lehet készíteni halmazok unióját, metszetét, különbségét és komplementerét. A következő négy sorban ezekre - megfelelő sorrendben - egy-egy példa látható:
A halmazokhoz kapcsolódóan négy további művelet van GAMS-ban. Ezek:
A paramétereket halmazokkal kapcsolatos adatok tárolására használhatjuk - mint egy asszociatív tömböt, indexelésük az adott halmaz(ok) elemeivel történik. Legtöbbször egyetlen halmazhoz kapcsolódnak, de köthetők több halmazhoz is (ez esetben célszerűbb a táblázatokat használni, lásd a következő pont). Az általános megadási forma a következő:
A fentiekben a parameter kulcsszó helyett a parameters is írható. Egy parameter utasításon belül több paraméter is definiálható, vesszővel elválasztva egymástól. Többdimenziós paraméter megadásánál a megfelelő halmazelemek közé pontot kell tenni, például így:
Az explicit módon meg nem adott elemek implicit módon a nullát kapják értékül. Minden halmazelemet legfelejebb egyszer sorolhatunk fel (azaz definiálhatjuk), illetve minden felsorolt elem az adott halmaz egy létező eleme kell legyen. Intervallumokat is megadhatunk az alábbi módon:
Ha több halmaztól is függő adatokat szeretnénk megadni, célszerűbb a paraméter helyett a táblázatot használni. Táblázat legalább két-, legfeljebb tízdimenziós lehet. (Kettőnél több dimenzió esetén a paramétereknél imént ismertetett módon kell az elemeket megadni.)
Általános megadási forma:
GAMS-ban az acronym egy speciális adattípus, amely lehetővé teszi karaktersorozatok értékként való használatát. Az eddidiekhez hasonlóan definiálhatunk acronym-okat:
Ezeket az acronym-okat értékül adhatjuk tetszőleges változónak, értékük pedig azzal a szöveggel egyezik meg, amely a nevük is. Matematikai műveletek nem hajthatók végre acronym-okon, illetve ha egy halmaz felett definiált paraméter értékei között szerepel acronym, akkor az adott paraméter elemeire sem végezhetünk numerikus műveleteket. (Ez elég természetes, hiszen mi lenne pl. a "hetfo + 16" eredménye?)