آموزش رایگان نرم افزار گمز

مجموعه‌ها در گمز

این پست زیرمجموعه دوره آموزش رایگان نرم‌افزار گمز می‌باشد، که به مجموعه‌ها در گمز می‌پردازد. در صورتی که تمایل دارید کل دوره را مشاهده کنید، از این لینک استفاده کنید.

اگه دوره گمز را دنبال کرده باشید، الان حتما می‌دونید که مجموعه‌ها چقدر در مدل نویسی اهمیت دارند، فکر نمی‌کنم مدل ریاضی‌ای باشه که اندیس یا مجموعه نداشته باشه، برای همین تصمیم گرفتم یک پست کامل را به این مبحث اختصاص بدم. در ضمن اگه حال و حوصله خوندن متن ندارید، می‌تونید به جای خوندن متن، از ویدیو آخر این پست استفاده کنید.

مجموعه در گمز چیه؟

مجموعه‌ها بخش مهمی در مدل نویسی گمز هستند، مجموعه‌ها در حقیقت اندیس‌های مدل ما هستند. مثلا مدل پایین را در نظر بگیرید:

آموزش رایگان نرم‌افزار گمز - مدل ریاضی مساله حمل و نقل برای حل در گمز

مدل بالا یک مدل ریاضی خیلی ساده هست، این که منطق مدل چیه یا داده‌های مورد نیاز برای حل مدل کجاست، اصلا اینجا مهم نیست، چیزی که اینجا مهمه اینه که ما در گمز چطور اندیس‌های i و j را تعریف کنیم؟

تعریف مجموعه در گمز

مجموعه‌ها در گمز با عبارت sets یا set تعریف می‌شوند. فرض کنید در مدل بالا، اندیس i مقادیر i1 , i2 را بتونه بگیره و اندیس j هم مقادیر j1 , j2 , j3 . کد زیر در گمز تعریف این دو اندیس را برای ما انجام میده:

				
					sets
i /i1 , i2/
j /j1 , j2 , j3/
;
				
			

توجه کنید که بعد از تعریف مجموعه‌ها از ; استفاده کنید.

عبارت توصیفی در تعریف مجموعه در گمز

قبلا من اینطوری بودم که وقتی کدی را می‌نوشتم، همون لحظه فقط خودم و خدا می‌فهمیدیم که دارم چی می‌نویسم. بعد دو ماه که دوباره سر وقت کد میومدم، فقط خدا می‌دونست من چی نوشتم. برای همین لازمه که هممون وقتی کدی را می‌نویسیم، درباره اون کد، توضیحاتی هم بنویسیم که اگه بعد از مدتی دوباره کدمون را نگاه کردیم، بدونیم که چی به چیه!

برای مستند کردن کدها در گمز می‌تونیم از عبارات توصیفی استفاده کنیم. این عبارات قرار نیست تاثیری در حل مدل داشته باشند و فقط برای نمایش و مستندسازی بکار می‌آیند. مثلا اگه اندیس i در مثال بالا به کارخانه‌ها اشاره داره، و اندیس j مربوط به بازارهای ما هست، بهتره تعریف این دو اندیس، اینجوری باشه:

				
					sets
i factories /i1 , i2/
j markets /j1 , j2 , j3/
;
				
			

مشخصه که کلمات factories و markets برای توضیح بیشتر درباره هر اندیس به کد ما اضافه شدند. این کلمات هیچ نقشی به جز توضیح بیشتر در مورد اندیس، ندارند.

تعریف مجموعه‌ها به صورت دنباله در گمز

فرض کنید اندیسی در مدل داریم که مقادیر 1 تا 1000 را می‌تونه داشته باشه، قطعا منطقی نیست که از 1 تا 1000 را تایپ کنیم، پس چیکار می‌تونیم بکنیم؟ دقیقا شکل کد زیر عمل کنید:

				
					sets
h /1*1000/
;
				
			

مجموعه‌ها با مقادیر یکسان در گمز

حالا فرض کنید که اندیس دیگه‌ای مثل k هم داخل مدل هست که مقادیر مشابه اندیس h (اندیس تعریف شده در کد بالا) را داره. نیازی نیست که دوباره اندیس k را مثل h تعریف کنید، فقط کافیه از alias استفاده کنید. اینطوری اگه مقادیر داخل h را تغییر دادید، به صورت خودکار مقادیر k هم تغییر می‌کنه. طریق استفاده از alias به شکل زیر هست:

				
					sets
h /1*1000/
;

alias(k , h);
				
			

عملگر ord در گمز

برای درک بهتر این عملگر باید با پارامترها آشنا باشید، پس اگه با پارامترها آشنایی ندارید، از این پست که به معرفی کلی گمز و حل یک مثال ساده پرداخته‌ام، استفاده کنید. خب برگردیم به سراغ عملگر ord، این عملگر جایگاه هر کدام از مقادیر موجود در مجموعه را به ما بر می‌گردونه، مثلا کد زیر را نگاه کنید:

				
					sets
j /j1 , j2 , j3/
;

parameter m(j);
m(j) = ord(j);

display m;
				
			

وقتی کد بالا را در گمز اجرا می‌کنید، نتیجه پایین حاصل میشه:

				
					----     18 PARAMETER m  

j1 1.000,    j2 2.000,    j3 3.000
				
			

خروجی کد کاملا خود کد را توضیح میده، همانطور که می‌بینید عملگر ord به ازای هر مقدار داخل مجموعه، جایگاه اون مقدار را برگشت داده.

عملگر card در گمز

این عملگر تعداد اعضای یک مجموعه را به ما بر می‌گردونه (برای درک بهتر این عملگر حتما لازمه با اسکالرها در گمز آشنا باشید، اگه آشنا نیستید، از این پست که به معرفی کلی گمز و حل یک مثال ساده پرداخته‌ام، استفاده کنید):

				
					sets
j /j1 , j2 , j3/
;

scalar c;
c = card(j);

display c

				
			

خروجی کد بالا را می‌تونید در کادر پایین ببینید (چون مجموعه یا اندیس j سه عضو داره، مقدار 3 را برگشت داده):

				
					----     18 PARAMETER c                    =        3.000
				
			

مجموعه‌های دو بعدی

در گمز، شما این امکان را دارید که مجموعه‌هایی با بیشتر از یک بعد ایجاد کنید. فرض کنید می‌خواهیم مجموعه‌ای متشکل از زوج مرتب‌هایی ایجاد کنیم که هر زوج مرتبط از اون مجموعه، عنصر اولش از مجموعه i و عنصر دومش از مجموعه j هست. مجموعه‌ای که می‌خواهیم تعریف کنیم به شکل زیر هست:

				
					q = {(i1,j2),(i2,j1)}
				
			

کد گمزی که نیاز است بنویسیم، به شکل پایین هست:

				
					sets
i /i1 , i2/
j /j1 , j2 , j3/
q(i , j) /i1.j2 , i2.j1/
;
				
			

ویدیو آموزش مجموعه‌ها در گمز

همونطور که ابتدای پست گفتم، اگه حال و حوصله خوندن متن ندارید، از ویدیو زیر استفاده کنید. در این ویدیو هر چیزی که تا اینجا توضیح دادم را خواهید دید:

نمایش ویدیو درباره ویدیو آموزش مجموعه‌ها در گمز

منابع تکمیلی

اگه نیاز دارید که بیشتر از این در رابطه با مجموعه‌‌ها در گمز اطلاعات کسب کنید، به شما توصیه می‌کنم از این لینک که مربوط به وبسایت گمز هست، استفاده کنید.