متغیرها در گمز
این پست زیرمجموعه دوره آموزش رایگان نرمافزار گمز میباشد، که به متغیرها در گمز میپردازد. در صورتی که تمایل دارید کل دوره را مشاهده کنید، از این لینک استفاده کنید. در ضمن اگه حال و حوصله خوندن متن ندارید، میتونید به جای خوندن متن، از ویدیو آخر این پست استفاده کنید.
متغیرها از عناصر پایهای هر مدل ریاضی هستند که عملا بدون وجود متغیرها، مدل ریاضی و حل آن معنایی ندارد. متغیر در گمز معنای متفاوتی نسبت به متغیر در دیگر زبانهای برنامهنویسی یا هر نرمافزار دیگری ندارد و همان معنای همیشگی را میدهد، برای همین به تعریف زیر برای متغیر اکتفا میکنم و به سراغ نحوه بکارگیری آنها در گمز میروم:
متغیرها در گمز دادههایی هستند که بعد از حل مدل مقدار میگیرند.
لازم به ذکر هست که برای تدوین این مجموعه آموزشی، کتاب راهنمای کاربران گمز نوشته دکتر مهدی طلوع و سمانه جوشقانی به من خیلی کمک کرد، پس حتما براشون آرزوی موفقیت کنید.
پیشنیاز این آموزش، مطالعه پست آموزش رایگان نرمافزار گمز میباشد.
تعریف متغیرها در گمز
کد زیر را در نظر بگیرید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/
;
positive variables
x(i) a description
y(j)
;
در خطوط اول تا چهارم، دو مجموعه به نام i و j تعریف کردم، اگه با مفهوم مجموعهها در گمز آشنا نیستید، حتما به پست مجموعهها در گمز یه نگاهی بندازید. در ادامه خطوط کد، دو متغیر مثبت تعریف کردهام. ساختار تعریف متغیر اینطوری هست که اول نوع متغیر را تعریف میکنیم، بعد از واژه variable یا variables استفاده میکنیم، در خط بعد نام و مجموعهای که متغیر روی آن تعریف میشود را مشخص میکنیم، در ادامه میتوانیم با یک عبارت توصیفی یک توضیح به متغیر خودمان اضافه کنیم و اگر چند متغیر از همان نوع داریم، در خطوط بعدی آنها را هم تعریف میکنیم و در پایان هم علامت ; فراموش نشه! برای روشنتر شدن موضوع، به خطوط ششم تا نهم نگاه کنید، ابتدا نوع متغیرها تعریف شده، نوع متغیرها در اینجا positive هست، یعنی کران پایین این متغیرها صفر و کران بالا آنها مثبت بینهایت هست یا به عبارت دیگر این متغیرها فقط اعداد مثبت را میتوانند بگیرند. در خط بعد از عبارت variables، اولین متغیر به نام x تعریف شده، چون در مدل من، دامنه این متغیر مجموعه i بود، برای همین با استفاده از عبارت (i) به گمز حالی کردهام که x باید روی مجموعه i تعریف بشه. عبارت a description یک عبارت توصیفی برای توضیحات بیشتر برای متغیر x هست. در خط بعدی، یعنی در خط 8، متغیر y روی دامنه j تعریف شده و به همین ترتیب میتونید هر تعداد متغیر مثبتی که در مدل دارید را در ادامه تعریف کنید. در آخرین خط حتما ; بگذارید.
به چند نکته توجه کنید:
- وجود عبارت توصیفی دلخواه هست، اگه این عبارت را ننوشتید، در حل مدل مشکلی پیش نمیآید.
- متغیر میتواند روی بیشتر از یک دامنه هم تعریف شود، مثلا (i , j)x
- برای نوع متغیرهای منفی از negative، متغیرهای عدد صحیح integer، متغیرهای صفر و یک binary و برای متغیرهای آزاد یا بدون کران از free استفاده کنید.
در کد زیر چند متغیر از انواع دیگر نیز تعریف کردهام، برای درک بهتر تعریف متغیرها در گمز یه نگاهی هم به این کد بکنید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/
;
positive variables
x(i)
y(j)
;
negative variables
t(i) a description
;
integer variables
u(j)
;
free variables
z
;
اگه کد بالا را بررسی کردید، پس به این دو نکته هم توجه کنید:
- متغیر تابع هدف حتما باید از نوع free باشد. (مثل متغیر z در کد بالا)
- اگر برای متغیری نوع تعریف نشود، گمز به طور پیشفرض آن را free در نظر میگیرد.
تعریف کران برای متغیرها در گمز
گاهی لازمه که برای متغیرهای خودمان کران پایین یا بالا تعریف کنیم، کد زیر را در نظر بگیرید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/
;
positive variables
x(i)
y(j)
;
x.lo(i) = 0.05;
y.up('qazvin') = 25;
بعد از تعریف مجموعهها و متغیرها، در خط 11 با استفاده از عبارت lo. به گمز حالی کردهام که کران پایین متغیر x روی همه اعضای دامنه i برابر 0.05 هست. به طور پیشفرض چون متغیر x از نوع positive هست، کران پایینش صفر هست ولی با وجود این کد، کران پایین به 0.05 تغییر کرده.
شاید براتون سوال پیش بیاد که چرا بعضی مواقع لازمه کران یک متغیر را تغییر دهیم؟ این کار میتونه دلایل زیادی داشته باشه، مثلا یکی از این دلایل میتونه جلوگیری از وقوع خطای تقسیم بر صفر باشه!
در گمز با استفاده از up. میتوانیم کران بالای یک متغیر را تغییر دهیم. به خط 12 کد نگاه کنید، کران بالای متغیر y را از مثبت بینهایت به 25 تغییر دادهام ولی نه برای همه اعضای مجموعه j. اجازه بدید بیشتر توضیح بدم، متغیر y روی مجموعه j تعریف شده و به طور پیشفرض کران بالای مثبت بینهایت دارد، حالا من قصد دارم فقط برای qazvin که یکی از اعضای مجموعه j هست، کران بالا را تغییر دهم و برای بقیه اعضای مجموعه j، کران بالای متغیر y همان مثبت بینهایت باشد. بنابراین به سادگی با نوشتن خط 12، این هدف را در گمز محقق کردهام.
ثابت کردن مقدار متغیرها در گمز
با استفاده از fx. میتوانیم مقدار یک متغیر را روی یک عدد ثابت کنیم، حواستون باشه که این کار متغیر را به اسکالر تغییر نمیدهد (اگه با مفهوم اسکالر آشنایی ندارید از پست دادههای ورودی در گمز استفاده کنید) و متغیر، در حالت متغیر باقی میماند ولی مقدارش فیکس شده:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/
;
integer variables
u(j)
;
u.fx('hamedan') = 1;
ویدیو آموزش متغیرها در گمز
منابع تکمیلی
اگه هنوز تمایل دارید اطلاعات بیشتری از متغیرها در گمز کسب کنید، از این لینک که از وبسایت گمز هست، استفاده کنید.