مقدمه
مجموعه ها در هر مدل GAMS بلوک های اساسی هستند. آنها اجازه می دهند مدل به طور خلاصه بیان شود و به راحتی قابل خواندن باشد. در این فصل نحوه اعلام و راه اندازی مجموعه ها را معرفی خواهیم کرد. مفاهیم مجموعه پیشرفته تر ، مانند تخصیص به مجموعه ها ، عملیات تاخیر و هدایت در فصل های مجموعه های پویا و مجموعه ها به عنوان دنباله ها آمده است. مباحث مورد بحث در این فصل به اندازه کافی برای شروع خوب است و در اکثر مدلها کافی خواهد بود. ما مجموعه های ساده، زیر مجموعه ها، مجموعه های چند بعدی، مجموعه های تکی و مجموعه جهانی را معرفی خواهیم کرد.
مجموعه های ساده
با استفاده از نمادهای ساده ریاضی یک مجموعه مانند S که شامل سه المان a،b و c به شکل زیر نوشته می شود.
S={a,b,c}
با استفاده از نمادهای GAMS مجموعه به شکل زیر تعریف می شود.
Set S / a, b, c /;
تعریف مجموعه ساده: سینتکس
به طور کلی ، سینتکس مجموعه های ساده در GAMS به شرح زیر است:
set[s] set_name ["text"] [/element [text] {,element [text]} /] {,set_name ["text"] [/element [text] {,element [text]} /] } ;
Set[s] کلمه کلیدی است که نشان می دهد این یک عبارت مجموعه است. Set_name نام داخلی مجموعه در GAMS است، یک شناسه است. متن توضیحی اختیاری ممکن است برای توصیف مجموعه یا یک عنصر مجموعه خاص برای مراجعات بعدی و برای سهولت خوانایی استفاده شود. فهرست عناصر مجموعه با اسلش های رو به جلو مشخص می شود. عنصر نام عنصر(های) مجموعه است. توجه داشته باشید که هر عنصر در یک مجموعه باید با کاما یا انتهای خط از سایر عناصر جدا شود و هر عنصر با یک خالی از هر متن مرتبط جدا می شود.
مثال زیر را از مدل کود مصری [FERTS] در نظر بگیرید، که در آن مجموعه مواد مغذی کود را می توان به صورت زیر نوشت:
Set cq "nutrients" / N, P2O5 /;
یا :
Set cq "nutrients" / N P2O5 /;
ترتیب فهرست بندی اعضای مجموعه معمولاً مهم نیست. با این حال، اگر اعضا، به عنوان مثال، دوره های زمانی را نشان می دهند، ممکن است مراجعه به عضو بعدی یا قبلی مفید باشد. عملیات ویژه ای برای انجام این کار وجود دارد و در فصل مجموعه ها به عنوان دنباله ها: مجموعه های مرتب شده مورد بحث قرار می گیرند. در حال حاضر، کافی است به یاد داشته باشید که ترتیبی که عناصر مجموعه در آن مشخص می شوند، مرتبط نیست، مگر اینکه و تا زمانی که برخی از عملیات دلالت بر ترتیب استفاده شود. در آن زمان، قوانین تغییر می کند و مجموعه به چیزی تبدیل می شود که بعداً آن را مجموعه سفارشی می نامیم.
توجه داشته باشید
بیانیه داده، یعنی مشخصات عناصر مجموعه در اسلش های رو به جلو را می توان حذف کرد. در چنین مواردی یک مجموعه بدون تعریف اعلام می شود.
ممکن است بیش از یک مجموعه در یک دستور مجموعه اعلام و تعریف شود. مثالهایی در زیر بخش اعلام مجموعههای چندگانه در زیر آورده شده است.
مثال های گویا
مثال زیر را بر اساس مدل [SHALE] در نظر بگیرید:
Set cf "final products" / syncrude "refined crude (mil bbls)" lpg "liquefied petroleum gas (million bbls)" ammonia "ammonia (mil tons)" coke "coke (mil tons)" sulfur "sulfur (mil tons)" /;
دستور set با کلمه کلیدی set معرفی می شود، نام مجموعه cf است و متن توضیحی «محصولات نهایی» مجموعه را توصیف می کند. این مجموعه دارای پنج عنصر با متون توضیحی است که حاوی جزئیات واحدهای اندازه گیری است.
معمولا مجموعه ها یک بار اعلام و تعریف می شوند و سپس در مدل ارجاع می شوند. دو استثنا وجود دارد: گزینه کنترل دلار onMulti اجازه می دهد تا عناصر بیشتری را بعدا اضافه کنید و مجموعه های پویا. برای جزئیات بیشتر در مورد مجموعه های پویا، به بخش مجموعه های پویا مراجعه کنید. کد زیر برای نشان دادن گزینه $onMulti، مثال قبلی را به طرز چشمگیری تغییر می دهد:
Set cf "final products" / syncrude "refined crude (mil bbls)" lpg "liquefied petroleum gas (million bbls)" ammonia "ammonia (mil tons)" / $onmulti Set cf "more final products" / coke "coke (mil tons)" sulfur "sulfur (mil tons)" /;
بعد از $onmulti عناصر اضافی به مجموعه اضافه می شوند. cf. توجه داشته باشید که بدون گزینه کنترل دلاری $onMulti که طبق پیشفرض یک خطا ایجاد میکند، یک نماد میتواند حداکثر یک بیانیه داده داشته باشد.
دنباله ها به عنوان عناصر مجموعه
ستاره “*” نقش ویژه ای در تعاریف مجموعه ایفا می کند. این برای رفع خستگی از تایپ دنباله ای از عناصر برای یک مجموعه، و برای واضح تر کردن هدف استفاده می شود. به عنوان مثال، در یک مدل شبیه سازی ممکن است ده دوره زمانی سالانه از سال ۱۹۹۱ تا ۲۰۰۰ وجود داشته باشد. به جای تایپ ده ساله، عناصر این مجموعه را می توان به صورت زیر نوشت:
Set t "time" / 1991 * 2000 /;
این به این معنی است که مجموعه شامل ده عنصر ۱۹۹۱، ۱۹۹۲، …، ۲۰۰۰ است. GAMS این لیست های برچسب را با مشاهده تفاوت بین این دو برچسب ایجاد می کند. اگر تنها کاراکترهایی که با هم تفاوت دارند، رقم باشند، با عدد L که توسط این ارقام در سمت چپ و R در سمت راست تشکیل میشود، برای هر عدد صحیح در دنباله L تا R یک برچسب ساخته میشود. هر گونه تفاوت غیر عددی یا ناسازگاریهای دیگر باعث میشود. خطاها
مثال زیر کلی ترین شکل تعریف “ستاره دار” را نشان می دهد:
Set g1 / a1bc * a20bc /;
توجه داشته باشید که این یکسان نیست با:
Set g2 / a01bc * a20bc /;
هر دو مجموعه ۲۰ عضو دارند اما فقط ۱۱ عضو مشترک دارند.
لیست ها به ترتیب کاهشی نیز امکان پذیر است:
Set y "years in decreasing order" / 2000 * 1991 /;
به عنوان آخرین مثال، تعاریف مجموعه زیر هر دو غیرقانونی هستند زیرا با قاعده ارائه شده در بالا برای تهیه لیست سازگار نیستند:
Set illegal1 / a1x1 * a9x9 /
illegal2 / a1 * b9 /;
تعریف مجموعه های متعدد
مجموعه کلمات کلیدی نیازی به استفاده برای هر مجموعه ندارد، بلکه فقط در ابتدای یک گروه از مجموعه ها استفاده می شود. اغلب راحت است که گروهی از اعلانات (و تعاریف) مجموعه را در ابتدای برنامه کنار هم قرار دهید. وقتی این کار انجام شد، کلمه کلیدی set فقط باید یک بار استفاده شود. کسانی که ترجیح میدهند اعلانهای مجموعه را با دیگر گزارهها ترکیب کنند، باید از یک دستور مجموعه جدید برای هر گروه اضافی از مجموعهها استفاده کنند. توجه داشته باشید که کلمات کلیدی set و set معادل هستند. مثال زیر نشان می دهد که چگونه دو مجموعه را می توان با هم اعلام کرد. توجه داشته باشید که نقطه ویرگول تنها پس از اعلام آخرین مجموعه استفاده می شود.
Sets s "Sectors" / manuf, agri, services, government / r "Regions" / north, eastcoast, midwest, sunbelt / ;
استفاده از مجموعه های تعریف شده قبلی در تعاریف مجموعه
نماد زیر به مجموعه های تعریف شده قبلی اجازه می دهد تا در تعریف مجموعه جدید استفاده شوند:
Set i / i1 * i4 / j / j6 * j9 / k / #i, set.j /;
مجموعه k شامل تمام عناصر مجموعه i و j است. توجه داشته باشید که علامت هش «#» به دنبال نام مجموعه، مختصری برای اشاره به تمام عناصر یک مجموعه است. نماد set.set_name به طور یکسان کار می کند و فقط روشی متفاوت برای ارجاع به تمام عناصر در یک مجموعه از قبل تعریف شده است.
Alias Statement: چند نام برای یک مجموعه
گاهی لازم است برای یک مجموعه بیش از یک نام داشته باشیم. به عنوان مثال در مدل های ورودی- ستانده، هر کالا ممکن است در تولید همه کالاهای دیگر استفاده شود و لازم است دو نام برای مجموعه کالاها باشد تا مشکل بدون ابهام مشخص شود. در مدل تعادل عمومی [ORANI] مجموعه کالاهای c به صورت نوشته می شود
Set c "Commodities" / food, clothing /;
نام دوم برای مجموعه c با یکی از عبارات زیر ایجاد می شود:
Alias (c, cp) ;
Alias (cp, c) ;
در اینجا cp نام مجموعه جدیدی است که می تواند به جای نام مجموعه اصلی c استفاده شود.
توجه داشته باشید
نام مجموعه جدید معرفی شده ممکن است به عنوان نام جایگزین برای مجموعه اصلی استفاده شود. مجموعه مرتبط همیشه حاوی همان عناصر مجموعه اصلی خواهد بود.
با دستور Alias ممکن است بیش از یک نام جدید برای مجموعه اصلی معرفی شود:
Alias (c,cp, cpp, cppp);
در اینجا cp، cpp، cppp نامهای جدیدی برای مجموعه اصلی c هستند.
توجه داشته باشید
ترتیب نام مجموعه ها در عبارت مستعار مهم نیست. تنها محدودیت این است که دقیقاً یکی از مجموعه های عبارت باید زودتر تعریف شود. تمام مجموعه های دیگر با دستور مستعار معرفی می شوند.
مثالهای معمولی برای استفاده از نامهای مستعار مشکلاتی هستند که در آن هزینههای حمل و نقل بین اعضای یک مجموعه باید مدلسازی شود. قطعه کد زیر از مدل کود آند [ANDEAN] اقتباس شده است:
Set i "plant locations" / palmasola, pto-suarez, potosi, baranquill, cartagena /; Alias(i,ip); Table tran(i,i) "transport cost for interplant shipments (us$ per ton)" palmasola pto-suarez potosi baranquill pto-suarez 87.22 potosi 31.25 55.97 baranquill 89.80 114.56 70.68 cartagena 89.80 114.56 70.68 5.00 ; Parameter mui(i,ip) "transport cost: interplant shipments (us$ per ton)"; mui(i,ip) = (tran(i,ip) + tran(ip,i));
دستور Alias ip را به عنوان نام دیگری برای مجموعه i معرفی می کند. جدول tran دو بعدی است و هر دو شاخص مجموعه i هستند. اطلاعات مربوط به هزینه حمل و نقل بین کارخانه ها در این جدول آورده شده است. توجه داشته باشید که هزینه های حمل و نقل فقط برای یک جهت در اینجا آورده شده است، یعنی هزینه های pto-suarez به palmasola به صراحت در جدول مشخص شده است در حالی که هزینه های در جهت مخالف اصلاً آورده نشده است. پارامتر mui نیز دو بعدی است و هر دو شاخص به مجموعه i اشاره دارد، اما این بار نام مستعار ip در موقعیت دوم استفاده می شود. پارامتر mui با دستور انتساب در خط بعدی تعریف می شود: mui شامل هزینه های حمل و نقل از یک مکان کارخانه به مکان دیگر، در هر دو جهت است. توجه داشته باشید که اگر mui بدون نام مستعار تعریف می شد، تمام ورودی های آن صفر می شد. برای مثالهای دیگر که در آن از نامهای مستعار استفاده میشود، بخشهای مجموعه جهانی و یافتن مجموعهها از دادهها را در زیر ببینید.
زیر مجموعه ها
اغلب لازم است مجموعه هایی را تعریف کنیم که اعضای آن باید همه اعضای یک مجموعه بزرگتر باشند. عبارت است از:
set set_ident1(set_ident2) ;
در اینجا set کلمه کلیدی است که نشان می دهد این یک دستور set است و set_ident1 زیرمجموعه ای از مجموعه بزرگتر set_ident2 است. مجموعه بزرگتر نیز سوپرست نامیده می شود.
به عنوان مثال، ممکن است بخواهیم بخش ها را در یک مدل اقتصادی به دنبال سبک [CHENERY] تعریف کنیم.
Set i "all sectors" / light-ind, food+agr, heavy-ind, services / t(i) "traded sectors" / light-ind, food+agr, heavy-ind / nt "non-traded sectors" / services /;
برخی از انواع فعالیت های اقتصادی، به عنوان مثال صادرات و واردات، ممکن است منطقاً به زیر مجموعه ای از همه بخش ها محدود شود. برای مدلسازی تراز تجاری، باید بدانیم کدام بخشها مورد معامله قرار میگیرند، و یکی از راههای واضح فهرست کردن صریح آنها است، مانند تعریف مجموعه t بالا. مشخصات t(i) به این معنی است که هر یک از اعضای مجموعه t باید عضوی از مجموعه i نیز باشد. GAMS این رابطه را که بررسی دامنه نامیده می شود، اعمال خواهد کرد. بدیهی است که ترتیب اعلان و تعریف مهم است: عضویت i باید قبل از تعریف t مشخص باشد، در غیر این صورت بررسی نمی تواند انجام شود.
توجه داشته باشید
تمام عناصر زیرمجموعه نیز باید عناصر ابرمجموعه باشند.
قانونی است اما غیرعاقلانه است که یک زیرمجموعه را بدون ارجاع به مجموعه بزرگتر تعریف کنیم، همانطور که در بالا برای مجموعه nt انجام شد. در این مورد بررسی دامنه نمی تواند انجام شود: اگر سرویس ها غلط املایی داشته باشند هیچ خطایی علامت گذاری نمی شود، اما ممکن است مدل نتایج نادرستی بدهد. از این رو، توصیه می شود در صورت امکان از بررسی دامنه استفاده کنید. خطاها را میگیرد و اجازه میدهد مدلهایی بنویسند که از نظر مفهومی تمیزتر باشند، زیرا روابط منطقی صریح هستند.
یک راه جایگزین برای تعریف عناصر یک زیر مجموعه با انتساب است:
Set i "all sectors" / light-ind, food+agr, heavy-ind, services / t(i) "traded sectors" / light-ind, heavy-ind /; t('food+agr') = yes;
در خط آخر عنصر food+age مجموعه i به زیر مجموعه t اختصاص داده می شود. تخصیص همچنین ممکن است برای حذف یک عنصر از یک زیر مجموعه استفاده شود:
t
('light-ind')= no
;
توجه داشته باشید که بله و خیر کلمات رزرو شده در GAMS هستند. همچنین توجه داشته باشید که اگر یک زیر مجموعه به آن اختصاص داده شود، به یک مجموعه پویا تبدیل می شود. برای اطلاعات بیشتر در مورد تخصیص در GAMS به طور کلی، بخش بیانیه تخصیص را ببینید.
توجه
یک زیرمجموعه تا زمانی که مجموعه پویا نباشد می تواند به عنوان یک دامنه در اعلان سایر مجموعه ها، متغیرها، پارامترها و در معادلات استفاده شود.
این بحث مجموعه هایی را که عناصر در آنها ساده هستند کامل می کند. این برای بسیاری از برنامه های GAMS کافی است. با این حال، مشکلات مختلفی وجود دارد که برای آنها داشتن مجموعه هایی مفید است که بر حسب دو یا چند مجموعه دیگر تعریف شده اند.
مجموعه های چند بعدی
اغلب لازم است نگاشت بین عناصر مجموعه های مختلف ارائه شود. برای این منظور GAMS امکان استفاده از مجموعه های چند بعدی را فراهم می کند. برای حداکثر تعداد ابعاد مجاز فعلی، ابعاد را ببینید. دو بخش بعدی نحوه بیان نگاشت یک به یک و چند به چند بین مجموعه ها را توضیح می دهد.
نقشه برداری یک به یک
مجموعه ای را در نظر بگیرید که عناصر آن جفت هستند: A={(b,d),(a,c),(c,e)}. در این مجموعه سه عنصر وجود دارد و هر عنصر از یک جفت حرف تشکیل شده است. این نوع مجموعه در بسیاری از انواع مدل سازی کاربرد دارد. به عنوان مثال، در مدل جهانی آلومینیوم [ALUM] یک پورت باید با یک منطقه معدنی نزدیک مرتبط باشد
Set i "mining regions" / china, ghana, ee+ussr, s-leone / n "ports" / accra, freetown, leningrad, shanghai / in(i,n) "mines to ports map" / china .shanghai ghana .accra ee+ussr.leningrad s-leone.freetown /;
در اینجا i مجموعه ای از مناطق استخراج، n مجموعه ای از پورت ها و in یک مجموعه دو بعدی است که هر پورت را با یک منطقه استخراج مرتبط می کند. نقطه بین چین و شانگهای برای ایجاد یکی از این جفت ها استفاده می شود. برای خوانایی، ممکن است فاصله ها آزادانه در اطراف نقطه استفاده شوند. مجموعه در چهار عنصر است و هر عنصر از یک جفت منطقه-پورت تشکیل شده است. علامت (i,n) بعد از نام مجموعه در نشان می دهد که اولین عضو هر جفت باید عضوی از مجموعه i مناطق استخراج باشد و دومین عضو باید در مجموعه n پورت ها باشد. GAMS عناصر مجموعه را بررسی می کند تا مطمئن شود که همه اعضا به مجموعه های مناسب تعلق دارند.
نگاشت چند به چند
در موارد خاصی به نگاشت چند به چند نیاز است. مجموعه های زیر را در نظر بگیرید:
Set i / a, b / j / c, d, e / ij1(i,j) / a.c, a.d / ij2(i,j) / a.c, b.c / ij3(i,j) / a.c, b.c, a.d, b.d /;
در اینجا مجموعه ij1 یک نگاشت یک به چند را ارائه می دهد که در آن یک عنصر از مجموعه i روی بسیاری از عناصر مجموعه j نگاشت می شود. مجموعه ij2 یک نگاشت چند به یک را نشان می دهد که در آن بسیاری از عناصر مجموعه i بر روی یک عنصر از مجموعه j نگاشت می شوند. مجموعه ij3 کلی ترین حالت است: نگاشت چند به چند که در آن بسیاری از عناصر مجموعه i به بسیاری از عناصر مجموعه j نگاشت می شوند.
این مجموعه ها ممکن است به صورت فشرده نوشته شوند:
Set i / a, b / j / c, d, e / ij1(i,j) / a.(c,d) / ij2(i,j) / (a,b).c / ij3(I,j) / (a,b).(c,d) /;
پرانتز لیستی از عناصر را ارائه می دهد که هنگام ایجاد جفت ها گسترش می یابد. توجه داشته باشید که نقطه ‘.’، اگر مانند بالا استفاده شود، به عنوان عملگر محصول عمل می کند و از ساخت محصول دکارتی مجموعه ها پشتیبانی می کند.
توجه
هنگامی که مجموعه های پیچیده مانند این ایجاد می شوند، مهم است که بررسی کنید که مجموعه مورد نظر به دست آمده است. برای مثال، بررسی را می توان با استفاده از یک دستور نمایش انجام داد.
GAMS نمادهای بیشتری را برای تعریف مجموعه های چند بعدی به روشی مختصر فراهم می کند. همانطور که در بالا معرفی شد، علامت هش «#» به دنبال نام مجموعه، مختصری برای اشاره به تمام عناصر یک مجموعه است. عملگر تطبیق ‘:’ ممکن است برای ترسیم مجموعه های مرتب شده استفاده شود. این عملگر مشابه اپراتور محصول ‘.’ است. با این حال، در این مورد، عناصر به صورت جفتی با نگاشت عناصر با همان شماره سفارش مطابقت داده می شوند. مثال های زیر این مفاهیم را نشان می دهند.
Set i / a, b / j / c, d, e / ij4a(i,j) / a.#j / ij4b(i,j) / a.c, a.d, a.e / ij5a(i,j) / #i.#j / ij5b(i,j) / a.c, a.d, a.e, b.c, b.d, b.e / ij6a(i,j) / #i:#j / ij6b(i,j) / a.c, b.d /;
توجه داشته باشید که نام مجموعه هایی که فقط با حرف آخر متفاوت هستند، مجموعه های یکسانی را نشان می دهند. به عنوان مثال، مجموعه ij4a با مجموعه ij4b یکسان است. مشاهده کنید که مجموعه i دارای دو عنصر و مجموعه j دارای سه عنصر است که e عنصری است که بالاترین مرتبه را دارد. مجموعه ij6a یک نگاشت مرتب از تمام عناصر مجموعه i به همه عناصر مجموعه j است. با این حال، از آنجایی که در تعداد عناصر عدم تطابق وجود دارد، عنصر e به آن نگاشت نمی شود.
این مفاهیم را می توان به مجموعه هایی با ابعاد بالاتر تعمیم داد. از نظر ریاضی، اینها -tuples، -tuples، یا به طور کلی تر، -tuples نامیده می شوند. چند مثال برای نمایش فشرده مجموعههای -tuples با استفاده از ترکیب نقطه، پرانتز و کاما در جدول ۱ نشان داده شده است.
Compact Notation | Result |
(a,b).c.d | a.c.d, b.c.d |
(a,b).(c,d) .e | a.c.e, b.c.e, a.d.e, b.d.e |
(a.1*3).c | (a.1, a.2, a.3).c or a.1.c, a.2.c, a.3.c |
۱*۳. ۱*۳. ۱*۳ | ۱.۱.۱, ۱.۱.۲, ۱.۱.۳, …, ۳.۳.۳ |
توجه داشته باشید که ستاره ممکن است همراه با نقطه نیز استفاده شود. به یاد بیاورید که عناصر لیست ۱*۴ عبارتند از {۱,۲,۳,۴} .
Set i / i1*i4 / j / j1*j5 / k / k1,k2 / h / h1*h3 /; Set b(i,j,k), c(i,j,k,h); Option b(i:j,k), c(b:h); display b, c;
یک راه قدرتمند و بسیار فشرده برای تعریف مجموعههای چند بعدی با یک گزینه خاص است که یک شناسه را به عنوان مقدار میگیرد و عملیات شناسایی مانند تطبیق فهرست را با استفاده از عملگر تطبیق “:” انجام میدهد. مثال زیر روش را نشان می دهد.
مجموعه b یک مجموعه سه بعدی است، دستور option مشخص می کند که کدام جایگشت عناصر i، j و k عناصر b هستند. عملگر تطبیق ‘:’ بین i و j است، بنابراین ابتدا باید عناصر مجموعه های i و j را مطابقت دهیم. این به ما دو موقعیت اول را می دهد. برای موقعیت سوم ما در تمام عناصر مجموعه k چرخه می زنیم. این منجر به عناصر زیر برای مجموعه b می شود:
i1.j1.k1, i1.j1,k2, i2.j2.k1, ... , i4.j4.k2
مجموعه c یک مجموعه چهار بعدی است. توجه داشته باشید که سه بعد اول با دامنه مجموعه b یکسان است. عبارت option مشخص می کند که در سه موقعیت اول ما عناصر مجموعه b را خواهیم داشت و اینها با عناصر مجموعه h که در موقعیت چهارم قرار دارند تطبیق داده می شوند. حال، مجموعه h تنها دارای سه عنصر است، بنابراین تنها سه عنصر اول مجموعه b با اعضای مجموعه h مطابقت داده می شود. این منجر به مجموعه زیر می شود:
i1.j1.k1.h1, i1.j1.k2.h2, i2.j2.k1.h3
همانطور که در بالا توصیه شد، مهم است که همیشه بررسی کنید که آیا مجموعههای چند بعدی تولید شده با عبارت فشرده مانند اینها واقعاً مجموعههایی هستند که در نظر گرفته شدهاند.
برای مثالهای پیچیدهتر از نحوه استفاده از عملگر تطبیق در یک عبارت گزینه، لطفاً بخش تطبیق فهرست را ببینید.
قالب جدول برای مجموعه های چند بعدی
یک راه جایگزین برای اعلام مجموعه های چند بعدی با جداول است. ما با مثال نشان می دهیم که چگونه جداول ممکن است در زمینه تعاریف مجموعه استفاده شوند:
Set origins / Berlin, Paris / destinations / London, Chicago, Budapest / linked_1(origins,destinations) "cities linked by railways" / Berlin.London, Berlin.Budapest, Paris .London, Paris .Budapest /; Set Table linked_2(origins,destinations) London Chicago Budapest Berlin yes no yes Paris yes yes ;
مجموعه linked_1 یک مجموعه دو بعدی است که با علامت نقطه معرفی شده در بالا تعریف می شود. مجموعه linked_2 همان مجموعه ای است که با استفاده از نماد جدول تعریف شده است: مجموعه کلمات کلیدی با جدول کلمات کلیدی و نام مجموعه با دامنه آن دنبال می شود. خود جدول از عناصر شاخص اول در ستون اول، عناصر شاخص دوم در ردیف اول و داده ها در موقعیت های شبکه تشکیل شده است. توجه داشته باشید که کلمه کلیدی بله نشان می دهد که یک ترکیب برچسب بخشی از مجموعه دو بعدی است و کلمه کلیدی نه یا یک خالی نشان می دهد که ترکیب برچسب در مجموعه جدید موجود نیست. لطفاً بخش جداول را برای جزئیات شرایط لازم برای وارد کردن داده ها در قالب جدول ببینید.
متناوبا، مجموعه چند بعدی ممکن است ابتدا بدون هیچ عنصری اعلام شود، و عناصر بعداً در یک بیانیه جدول جداگانه اضافه شوند:
Set origins / Berlin, Paris / destinations / London, Chicago, Budapest / linked_2(origins,destinations) "cities linked by railways"; Table linked_2(origins,destinations) London Chicago Budapest Berlin yes no yes Paris yes yes;
به جای کلمات کلیدی بله و خیر، کاربران همچنین می توانند از اعداد برای تعیین عضویت در مجموعه دو بعدی استفاده کنند: ورودی های عددی غیر صفر به این معنی است که یک ترکیب برچسب بخشی از مجموعه است و صفر یا یک خالی نشان می دهد که ترکیب برچسب در مجموعه وجود ندارد. تنظیم.
Set origins / Berlin, Paris / destinations / London, Chicago, Budapest / linked_2(origins,destinations) "cities linked by railways"; Table linked_2(origins,destinations) London Chicago Budapest Berlin yes no yes Paris yes yes;
به جای کلمات کلیدی بله و خیر، کاربران همچنین می توانند از اعداد برای تعیین عضویت در مجموعه دو بعدی استفاده کنند: ورودی های عددی غیر صفر به این معنی است که یک ترکیب برچسب بخشی از مجموعه است و صفر یا یک خالی نشان می دهد که ترکیب برچسب در مجموعه وجود ندارد. تنظیم.
طرح ریزی و تجمیع مجموعه ها
در GAMS، عملیات طرح ریزی و تجمیع در مجموعه ها را می توان به دو روش مختلف انجام داد: با دستور گزینه و با یک انتساب. برای بحث دقیق، به بخش طرح ریزی و تجمیع مجموعه ها و پارامترها مراجعه کنید.
مجموعه های یگانه singleton
مجموعه سینگلتون در GAMS مجموعه خاصی است که حداکثر یک عنصر دارد (عنصر صفر نیز مجاز است). مانند مجموعه های دیگر، مجموعه های سینگلتون ممکن است دامنه ای با چند بعد داشته باشند. برای حداکثر تعداد ابعاد مجاز فعلی، ابعاد را ببینید. مجموعه های Singleton با کلمه کلیدی singleton که به عنوان اصلاح کننده مجموعه کلمات کلیدی عمل می کند، اعلان و تعریف می شوند:
Set i / a, b, c /; Singleton Set j / d / k(i) / b / l(i,i) / b.c /;
مجموعههای j، k و l بهعنوان مجموعههای تکتنی اعلام میشوند، هر کدام از آنها فقط یک عنصر دارند. مجموعه k زیر مجموعه ای از i و مجموعه l یک مجموعه دو بعدی است.
توجه داشته باشید که یک دستور داده برای یک مجموعه singleton با بیش از یک عنصر یک خطای کامپایل ایجاد می کند:
۱ Singleton Set s / s1*s3 /; **** $۸۴۴ ۲ display s; Error Messages ۸۴۴ Singleton with more than one entry (see $onStrictSingleton)
همچنین امکان اختصاص یک عنصر به یک مجموعه تکی وجود دارد. در این مورد، مجموعه سینگل به طور خودکار ابتدا از عنصر قبلی پاک می شود. به عنوان مثال، افزودن خط زیر به کد بالا باعث می شود که مجموعه k پس از اجرا فقط حاوی عنصر a باشد:
k(‘a’) = yes;
گزینه کنترل دلار offStrictSingleton ممکن است برای اجازه دادن به مجموعههایی که به عنوان مجموعههای تکتونی تعریف میشوند استفاده شود تا بیش از یک عنصر در تعاریف زمان کامپایل داشته باشند. با این حال، در این مورد فقط اولین عنصر فهرست شده یک عنصر معتبر از مجموعه است. توجه داشته باشید که مقدار صفر برای پارامتر خط فرمان strictSingleton برای تعاریف زمان اجرای مجموعههای تکتنه از طریق دستورات انتساب تأثیر یکسانی دارد.
برای اطلاعات بیشتر در مورد گزینه های کنترل دلار، به بخش گزینه های کنترل دلار مراجعه کنید. برای اطلاعات بیشتر در مورد پارامترهای خط فرمان GAMS، به بخش GAMS Call و پارامترهای خط فرمان مراجعه کنید. برای اطلاعات بیشتر در مورد خطاهای کامپایل، بخش خطاهای کامپایل را ببینید.
مجموعههای Singleton میتوانند بهویژه در عبارات انتساب مفید باشند، زیرا مانند مجموعههای دیگر نیازی به کنترل توسط یک شاخص کنترل یا یک عملگر نمایهشده ندارند. به مثال های زیر توجه کنید:
Set i / a, b, c /; Singleton Set k(i) / b / h(i) / a /; Parameter n(i) / a 2, b 3, c 5 /; Scalar z1, z2; z1 = n(k); z2 = n(k) + 100*n(h);
مجموعه های Singleton k و h هر دو زیر مجموعه مجموعه i هستند. پارامتر n روی مجموعه i تعریف می شود. به اسکالر z1 مقداری از پارامتر n اختصاص داده می شود بدون اینکه برچسب مربوطه را به صراحت در انتساب نام گذاری کنید. قبلاً در تعریف مجموعه تک تن k مشخص شده است. دستور انتساب برای z2 اسکالر حاوی عبارتی است که در آن مجموعه های Singleton k و h بدون شاخص کنترل یا عملیات نمایه شده ارجاع می شوند.
توجه داشته باشید
مجموعه های Singleton را نمی توان به عنوان دامنه استفاده کرد.
مجموعه جهانی: * به عنوان شناسه مجموعه
GAMS برای مواردی که کاربر مایل است شاخصی را مشخص نکند، اما فقط یک مکان نگهدار برای آن داشته باشد، مجموعه جهانی را ارائه می دهد که با “*” نشان داده شده است. مثالهای زیر دو روش را نشان میدهند که چگونه مجموعه جهانی در یک مدل معرفی میشود. مزایا و معایب استفاده از مجموعه جهانی را بعداً مورد بحث قرار خواهیم داد. مثال اول از مدل تولید و موجودی [ROBERT] است:
Sets r "raw materials" / scrap, new /; Table misc(*,r) "other data" scrap new max-stock 400 275 storage-c .5 2 res-value 15 25;
یک جدول فرمت ورودی برای پارامتر نوع داده است و حداقل دو بعد دارد. برای جزئیات بیشتر به بخش جداول مراجعه کنید. در مثال ما، اولین شاخص مجموعه جهانی ‘*’ و شاخص دوم مجموعه قبلی تعریف شده r است. از آنجایی که اولین شاخص مجموعه جهانی است، هر ورودی در این موقعیت مجاز است. در موقعیت دوم، عناصر مجموعه r باید ظاهر شوند، آنها طبق معمول دامنه بررسی می شوند.
مثال دوم نشان می دهد که چگونه مجموعه جهانی در یک مدل با عبارت مستعار معرفی می شود.
Alias (new_universe,*); Set k(new_universe) / Chicago / ;
دستور مستعار مجموعه جهانی را با نام مجموعه new_universe پیوند می دهد. مجموعه k زیر مجموعه ای از مجموعه جهانی است و شیکاگو عنصری از k اعلام شده است. هر موردی ممکن است آزادانه به k اضافه شود.
مجموعه جهانی به ویژه برای تولید گزارش مفید است، زیرا امکان استفاده از هر برچسبی را بدون نیاز به تعریف مجموعه های ویژه برای آنها فراهم می کند. برای مثال، بخش تنظیم ویژگیها را در زیر ببینید. برای اطلاعات بیشتر در مورد گزارش نویسی، به فصل The Put Writing Facility مراجعه کنید.
توجه
توصیه میشود از مجموعه جهانی برای ورودی داده استفاده نکنید، زیرا هیچ بررسی دامنه وجود ندارد و بنابراین اشتباهات املایی شناسایی نمیشوند و ممکن است دادههایی که کاربر قصد دارد در مدل باشد در واقع بخشی از آن نباشد.
توجه داشته باشید که در GAMS یک مجموعه ساده همیشه به عنوان زیرمجموعه ای از مجموعه جهانی در نظر گرفته می شود. بنابراین تعریف مجموعه
Set i / i1*i10 /;
مثل این هست که
Set i(*) / i1*i10 /;
GAMS از مفهوم درخت دامنه برای دامنه ها در GAMS پیروی می کند. فرض بر این است که یک مجموعه و زیرمجموعه آن توسط یک قوس به هم متصل شده اند که در آن دو مجموعه گره هستند. اکنون زیر مجموعه های یک بعدی زیر را در نظر بگیرید:
Set i, ii(i), j(i), jj(j), jjj(jj);
این زیرمجموعه ها با کمان هایی به مجموعه i متصل می شوند و بنابراین یک درخت دامنه را تشکیل می دهند که ریشه در گره جهان ‘*’ دارد. این درخت دامنه خاص ممکن است به صورت زیر نمایش داده شود:
* - i - ii | - j - jj - jjj
توجه داشته باشید که با ساختار i(jjj) ممکن است به iiterating از طریق اعضای jjj دسترسی داشته باشیم. برای مثال، درخت دامنه را در دستور حلقه ببینید.
توجه داشته باشید که فرض می شود مجموعه جهانی مرتب شده است و عملگرهایی برای مجموعه های مرتب شده مانند ord، lag و lead ممکن است برای هر مجموعه ای که مستعار با مجموعه جهانی باشد اعمال شود.
تنظیم و تنظیم ارجاع عنصر
مجموعه ها یا عناصر مجموعه در بسیاری از زمینه ها، از جمله تخصیص، محاسبات، تعاریف معادلات و حلقه ها ارجاع می شوند. معمولاً عبارات GAMS به کل مجموعه یا یک عنصر مجموعه اشاره دارد. علاوه بر این، GAMS چندین راه را برای ارجاع به بیش از یک، اما نه همه عناصر یک مجموعه، ارائه می دهد. در بخش های فرعی بعدی با مثال نشان خواهیم داد که چگونه این کار انجام می شود. GAMS همچنین دارای توابع مجموعه ای است که به طور خاص به مجموعه ها اشاره می کند و در فصل شرایط منطقی معرفی شده است.
ارجاع به کل مجموعه
معمولاً مجموعه های کامل مانند نمونه های زیر ارجاع داده می شوند:
Set i / i1*i100 /; Parameter k(i); k(i) = 4; Scalar z; z = sum(i, k(i));
پارامتر k بر روی مجموعه i اعلام می شود، در دستور انتساب در خط بعدی به تمام عناصر مجموعه i مقدار ۴ اختصاص داده می شود. z اسکالر به عنوان مجموع همه مقادیر پارامتر k(i) تعریف می شود.
ارجاع به یک عنصر واحد
گاهی اوقات لازم است به عناصر مجموعه خاص مراجعه شود. این کار با استفاده از نقل قول های تک یا دوتایی در اطراف برچسب(ها) انجام می شود. ممکن است خط زیر را به مثال بالا اضافه کنیم:
k(‘i77’) = 15;
این عبارت مقدار k(‘i77’) را به ۱۵ تغییر می دهد، همه مقادیر دیگر k 4 باقی می مانند.
ارجاع بخشی از یک مجموعه
راه های متعددی برای محدود کردن دامنه به بیش از یک عنصر وجود دارد، به عنوان مثال. زیر مجموعه ها، شرطی ها و تاپل ها. فرض کنید می خواهیم به پارامتر k از مثال بالا مقدار ۱۰ برای ۸ عنصر اول مجموعه i اختصاص داده شود. دو خط کد زیر نشان می دهد که چگونه می توان این کار را با یک زیر مجموعه آسان انجام داد:
Set j(i) / i1*i8 /;
k(j) = 10;
ابتدا مجموعه j را به عنوان زیرمجموعه ای از مجموعه i با عناصر مورد علاقه خود تعریف می کنیم. سپس مقدار جدید را به عناصر این زیر مجموعه اختصاص می دهیم. سایر مقادیر پارامتر k بدون تغییر باقی می مانند. برای مثالهایی با استفاده از شرطیها و تاپلها، به ترتیب به بخشهای Restricting the Domain: Conditionals و Restricting the Domain: Tuples مراجعه کنید.
تنظیم ویژگی ها
یک عنصر مجموعه GAMS چندین شماره به آن متصل است. به این مقادیر صفت می گویند. آنها ممکن است در طول اجرا بازیابی شوند. ویژگی ها در جدول ۳ آمده است.
Set Attribute | Symbol | Description |
Position | .pos | Element position in the current set (set does not have to be ordered), starting with 1. |
Ord | .ord | Same as .pos but for ordered sets only. |
Offset | .off | Element position in the current set minus 1. So .off = .pos – 1 (set does not have to be ordered). |
Reverse | .rev | Reverse element position in the current set, so the value for the last element is 0, the value for the penultimate is 1, etc. (set does not have to be ordered) |
Unique Element List | .uel | Element position in the unique element list. For details see section Ordered and Unordered Sets |
Length | .len | Length of the set element name (a count of the number of characters). |
Value | .val | If a set element is a number, this attributes gives the value of the number. For extended range arithmetic symbols, the symbols are reproduced. If a set element is a string that is not a number, then this attribute is not defined and trying to use it results in an error. |
First set element | .first | Returns 1 for the first set element, otherwise 0. |
Last set element | .last | Returns 1 for the last set element, otherwise 0. |
Table 3: Set Attributes
ویژگی ها را می توان با یک دستور انتساب در دسترس قرار داد:
data(set_name) = set_name.attribute ;
در اینجا داده یک پارامتر است، set_name نام مجموعه و .attribute یکی از ویژگی های فهرست شده در بالا است. مثال زیر به عنوان مثال عمل می کند:
Set id "example set" / Madison, tea-time, '-inf', '-7', '13.14'/; Parameter report(id,*) "set attribute values"; report(id,'position') = id.pos ; report(id,'reverse') = id.rev ; report(id,'offset') = id.off ; report(id,'length') = id.len ; report(id,'first') = id.first; report(id,'last') = id.last ; display report;
گزارش پارامتر دارای دو بعد با شناسه مجموعه در موقعیت اول و مجموعه جهانی در موقعیت دوم است. در شش عبارت زیر، مقادیر گزارش برای شش ورودی از مجموعه جهانی تعریف شده است. توجه داشته باشید که چگونه از انعطاف پذیری مجموعه جهانی در اینجا برای آسان کردن گزارش استفاده می شود. دستور display خروجی زیر را تولید می کند.
---- ۱۱ PARAMETER report set attribute values position reverse offset length first last Madison 1.000 4.000 7.000 1.000 tea-time 2.000 3.000 1.000 8.000 -inf 3.000 2.000 2.000 4.000 -۷ ۴.۰۰۰ ۱.۰۰۰ ۳.۰۰۰ ۲.۰۰۰ ۱۳.۱۴ ۵.۰۰۰ ۴.۰۰۰ ۵.۰۰۰ ۱.۰۰۰
یافتن مجموعه ها از داده ها
گاهی اوقات مطلوب است که مجموعه ای از داده های موجود پیدا شود تا بعداً از آن در مدل استفاده شود. ما با مثال نشان خواهیم داد که چگونه می توان این کار را با استفاده از دستور alias، مجموعه جهانی و شرط ها انجام داد. فرض کنید ما فقط داده های مربوط به مدل حمل و نقل [TRNSPORT] را داریم و می خواهیم مجموعه ها را شناسایی کنیم. از داده ها می توانیم بگوییم که دو مجموعه وجود دارد که به آنها علاقه مندیم. ابتدا این دو مجموعه را به عنوان نام alias مجموعه جهانی تعریف می کنیم، به این معنی که هیچ عنصری مشخص نشده است:
Alias(sources, places, *);
سپس دادههایی را وارد میکنیم که حاوی نشانگر هستند که کدام عناصر مجموعه ورودیهای معتبری در مجموعههایی هستند که باید محاسبه شوند. ما از قالب جدول استفاده می کنیم.
Table trandata (sources,places) "data from spreadsheet" Newyork Chicago totalsupply Seattle 2.5 1.7 350 Sandiego 2.5 1.8 300 totalneed 325 75
در ادامه زیر مجموعه هایی را تعریف می کنیم که در محاسبات زیر به آنها نیاز خواهیم داشت:
Set source(sources) "sources in spreadsheet data" destination(places) "destination in spreadsheet data";
اکنون همه چیزهایی را که برای انجام محاسبات با استفاده از داده های موجود نیاز داریم، در اختیار داریم. در مورد ما، یک برچسب در صورتی که یک ورودی برای عرضه کل در جدول بالا داشته باشد، به عنوان عنصری از منبع مجموعه واجد شرایط است، و اگر یک برچسب برای totalneed در جدول trandata دارای ورودی باشد، عنصری از مقصد تعیین شده است:
source(sources)$(trandata(sources,"totalsupply")) = yes; destination(places)$(trandata("totalneed", places )) = yes;
این انتساب های شرطی عناصر مجموعه مبدا و مقصد را تعریف می کنند. از این نقطه به بعد این مجموعه ها ممکن است در مدل استفاده شوند. با این حال، توجه داشته باشید که مجموعه های حاصل مجموعه های پویا هستند. از این رو آنها را نمی توان به عنوان دامنه در عبارات اعلان سایر مجموعه ها، پارامترها، متغیرها و معادلات استفاده کرد. اما ممکن است به آنها ارجاع داده شود و در تعاریف معادلات استفاده شود.
برای مثال اگر کاربر یک جدول داده را از جای دیگری دریافت کند و نیاز به تعیین مجموعه ها داشته باشد، چنین محاسباتی ممکن است مفید باشد. از طرف دیگر، اگر دادهها در قالب gdx در دسترس باشند، بار گزینه کنترل دلار عملکردی را برای پروژهسازی مجموعهها از دادههای موجود در یک فایل GDX فراهم میکند.
همچنین به بخش تعریف مجموعه ضمنی (یا: اعلانات نمادهای تعریف دامنه) مراجعه کنید.
بررسی دامنه
کامپایلر GAMS یک بررسی را انجام می دهد تا مطمئن شود که هر برچسبی که به عنوان عضوی از یک مجموعه نقل شده است، در واقع عنصری از مجموعه مربوطه است و هر عنصر تعریف شده در یک زیر مجموعه در واقع عضوی از ابر مجموعه است. این غربالگری برای سازگاری، بررسی دامنه نامیده می شود. هر زمان که به یک دامنه ارجاع داده شود، اعم از مجموعه، متغیر، پارامتر یا معادله اعلان ها و تعاریف، یا در انتساب، انجام می شود. مثالهای زیر به عنوان مثال عمل میکنند.
Set i "all cities" / Lima, Toronto, Wuhan, Shanghai / as(i) "Asian cities" / Wuhan, Shanhai, Calcutta / am "American cities" / Lima, Toront /;
مجموعه به عنوان زیرمجموعه ای از مجموعه i اعلام شده است، بنابراین بررسی دامنه هر برچسب را برای ناسازگاری آزمایش می کند. دو خطا دریافت می کند: یک اشتباه تایپی در شانهای وجود دارد و کلکته عضوی از مجموعه i نیست، بنابراین از نظر قانونی نمی تواند عضو یک زیرمجموعه باشد.
۱ Set i "all cities" / Lima, Toronto, Wuhan, Shanghai / ۲ as(i) "Asian cities" / Wuhan, Shanhai, Calcutta / **** $۱۷۰ $۱۷۰ **** ۱۷۰ Domain violation for element ۳ am "American cities" / Lima, Toront /;
کاربر می تواند خطای املایی را تصحیح کند و کلکته را از زیرمجموعه حذف کند یا به سوپرمجموعه i اضافه کند. خط زیر از بررسی دامنه عبور می کند:
Set as(i) "Asian cities" / Wuhan, Shanghai /;
توجه داشته باشید که am به عنوان زیرمجموعه ای از مجموعه i اعلان نمی شود، اگرچه ظاهراً باید شامل شهرهای موجود در i باشد. بنابراین، am را نمی توان بررسی کرد و اشتباه تایپی در تورنت شناسایی نمی شود. این عواقب برای خط بعدی دارد:
Parameter pam(am) "population in millions" / Lima 8.9, Toronto 5.6 /;
در این تعریف پارامتر دامنه پارامتر pam مجموعه am است. GAMS یک خطا را در اینجا گزارش می دهد، زیرا بررسی دامنه برچسب Toronto را تشخیص نمی دهد. تورنت، همانطور که در تعریف مجموعه am در بالا مشخص شده است، پذیرفته می شود.
یک مثال دیگر برای بررسی دامنه مربوط به دامنه های چند بعدی است که در آن کاربر به طور تصادفی موقعیت شاخص ها را تغییر می دهد:
Parameter h(as,am) / Wuhan.Lima 10, Wuhan.Toronto 12, Shanghai.Lima 7/; Parameter d(as,am); d(as,am) = 5*h(am,as) + 78;
توجه کنید که فرض می کنیم اشتباه تایپی در برچسب تورنتو اصلاح شده است. پارامتر h روی دامنه (as,am) تعریف شده است. با این حال، در دستور انتساب در خط آخر بالا، با دامنه (am,as) ارجاع داده شده است. این اشتباه با بررسی دامنه تشخیص داده می شود و یک خطا گزارش می شود.
همانطور که در تعریف مجموعه am در بالا دیدیم، بررسی دامنه اجباری نیست. اگر عبارت زیر وارد شود، GAMS تا زمانی که اطلاعات بیشتر ارائه نشود، هیچ فرضی در مورد rho نمی کند.
set t years / 1988 * 1995 /; Parameter rho discount rate ;
مدلساز ممکن است بعداً با ادامه تعریف با خط زیر، دامنه rho را بررسی کند:
Parameter rho(t) / 1988 0.07, 1989*1994 0.10, 1995 0.09 /;
روش دیگر، مدلساز ممکن است انتخاب کند که پارامتر rho را دامنه بررسی نکند، همانطور که در عبارت عمداً بیمعنی (اما قانونی) نشان داده شده است:
Parameter rho / 1988.January 0.07, strategy-1.cost 44, cat.capacity 99 /;
اگر پارامتری در دامنه بررسی نشود، تنها محدودیت این است که ابعاد باید ثابت باشد. هنگامی که تعداد برچسب ها برای هر مورد داده مشخص شد، ثابت می شود. ارجاع متفاوت به پارامتر یک خطا است.
توجه داشته باشید
بررسی دامنه به صورت خودکار است. فقط در دو مورد سرکوب می شود:
شاخص مجموعه جهانی یا مجموعه ای است مستعار به مجموعه جهانی، به مثال های بالا مراجعه کنید.
گزینه کنترل دلار $onWarning استفاده می شود. این تأثیر دارد که به جای خطا، هشدارها برای نقض دامنه گزارش می شود.
ما از مدلسازان میخواهیم در صورت امکان از بررسی دامنه استفاده کنند. خطاها را میگیرد و به کاربران اجازه میدهد مدلهایی بنویسند که از نظر مفهومی پاکتر باشند، زیرا روابط منطقی صریح هستند.
توجه داشته باشید که گزینه کنترل دلار $load در چندین نسخه موجود است تا هنگام بارگیری داده ها از یک فایل GDX، بررسی دامنه را فعال کند. برای جزئیات، به $loadDC، $loadDCM و $loadDCR و فصل GAMS DataEXchange (GDX) مراجعه کنید.
تعریف مجموعه ضمنی (یا: اعلانات نمادهای تعریف کننده دامنه)
همانطور که در بالا مشاهده شد، مجموعه ها را می توان از طریق عبارات داده در اعلان تعریف کرد. متناوبا، مجموعه ها را می توان به طور ضمنی از طریق بیانیه های داده نمادهای دیگر که از این مجموعه ها به عنوان دامنه استفاده می کنند، تعریف کرد. این در مثال زیر نشان داده شده است که از مدل [TRNSPORT] مشتق شده است:
Set i 'canning plants' j 'markets'; Table d(i<,j<) 'distance in thousands of miles' new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4; Display i,j;
به علائم < در لیست دامنه اعلان d توجه کنید (d(i<,j<)). این سیگنال، این است که مجموعه i شامل تمام عناصری است که بعد اول نماد d را تعریف می کند و مجموعه j به ترتیب شامل تمام عناصری است که بعد دوم نماد d را تعریف می کند. بنابراین، این خروجی عبارت Display در پایان است:
---- ۱۰ SET i canning plants seattle , san-diego ---- ۱۰ SET j markets new-york, chicago , topeka
این syntax به عبارت جدول محدود نمی شود، بلکه می تواند با هر اعلان نمادی استفاده شود. همچنین، هنگام استفاده از گزینه کنترل دلار روی Multi، یک مجموعه دامنه را می توان از طریق نمادهای متعدد با استفاده از یک دامنه تعریف کرد:
Set food fruits(food<) / apple, orange / $onMulti vegetable(food<) / carrot, cauliflower / meat(food<) / beef, pork /; Display food;
این خروجی عبارت Display است:
---- ۸ SET food
apple , orange , carrot , cauliflower, beef , pork
توجه داشته باشید
اگر علامت < برای علامتگذاری یک اعلان بهعنوان «تعریف دامنه» استفاده شود، این ویژگی به بیانیه دادهای پس از این اعلان محدود نمیشود، بلکه بر روشهای دیگر برای تعریف دادهها در زمان کامپایل مانند بار گزینه کنترل دلار تأثیر میگذارد، همانطور که در نشان داده شده است. مثال زیر:
Set i 'canning plants' j 'markets'; Parameter d(i<,j<) 'distance in thousands of miles'; $gdxIn data.gdx $load d
توجه
فقط عناصر غیر صفر در یک نماد، عناصری را به مجموعه ای که بطور ضمنی تعریف شده اضافه می کنند. این در دو مثال زیر نشان داده شده است.
Set i 'canning plants' j 'markets'; Table d(i<,j<) 'distance in thousands of miles' new-york chicago topeka seattle 2.5 1.8 san-diego 2.5 1.4; Display i,j;
به ستون خالی شیکاگو توجه کنید. از آنجایی که هیچ داده ای وجود ندارد، شیکاگو به مجموعه j ختم نمی شود، که در خروجی عبارت Display قابل مشاهده است:
---- ۱۰ SET j markets new-york, topeka
همچنین، یک ۰ صریح در یک دستور داده، عناصری را به مجموعه ای که بطور ضمنی تعریف شده اضافه نمی کند (برخلاف یک eps). این در کد GAMS و خروجی زیر نشان داده شده است:
Set j 'markets'; Parameter b(j<) 'demand at market j in cases' / new-york 325 chicago 0 topeka eps /; Display j;
---- ۱۰ SET j markets new-york, topeka
همچنین به بخش یافتن مجموعه ها از داده ها مراجعه کنید.
خلاصه
در GAMS یک مجموعه ساده از نام مجموعه و عناصر مجموعه تشکیل شده است. هم نام و هم عناصر ممکن است متن مرتبطی داشته باشند که نام یا عناصر را با جزئیات بیشتری توضیح دهد. مجموعههای پیچیدهتر دارای عناصری هستند که جفت یا حتی چندتایی هستند. این مجموعه ها با جفت و جفت برای برقراری روابط بین عناصر در مجموعه های مختلف ایده آل هستند. GAMS همچنین از قابلیت بررسی دامنه برای کمک به تشخیص ناسازگاریهای برچسبگذاری و اشتباهات تایپی ایجاد شده در طول تعریف مجموعههای مرتبط استفاده میکند.
بحث در اینجا به مجموعههایی محدود شده است که اعضای آنها به عنوان مجموعه در حال اعلام شدن مشخص شدهاند. برای بسیاری از مدل ها این تمام چیزی است که کاربر باید در مورد مجموعه ها بداند. بعداً در مورد مفاهیم پیچیدهتر مانند مجموعههایی که عضویت آنها در بخشهای مختلف مدل تغییر میکند (انتساب به مجموعهها) و سایر عملیات مجموعهها مانند اتحادیهها، مکملها و تقاطعها بحث خواهیم کرد.