پارامترهای محاسباتی در گمز
این پست زیرمجموعه دوره آموزش رایگان نرمافزار گمز میباشد، که به پارامترهای محاسباتی در گمز میپردازد. در صورتی که تمایل دارید کل دوره را مشاهده کنید، از این لینک استفاده کنید.
خیلی پیش میاد که در کدنویسی گمز جایی مجبور بشید مقدار یک پارامتر یا جدول یا اسکالر را بعد از تعریف اون عوض کنید یا از فرمولهای ریاضی برای محاسبات و ایجاد پارامترهای جدید استفاده کنید، این پست به همین موضوع پرداخته. در ضمن اگه حال و حوصله خوندن متن ندارید، میتونید به جای خوندن متن، از ویدیو آخر این پست استفاده کنید.
برای تدوین این مجموعه آموزشی، کتاب راهنمای کاربران گمز نوشته دکتر مهدی طلوع و سمانه جوشقانی به من خیلی کمک کرد، پس حتما براشون آرزوی موفقیت کنید.
پیشنیاز این آموزش، مطالعه پستهای مجموعهها در گمز و دادههای ورودی در گمز میباشد.
تعریف پارامترهای محاسباتی در گمز
پارامتر محاسباتی، پارامتری هست که مقدارش وابسته به پارامترها و دادههای دیگر در مدل هست و با محاسبات ریاضی روی دادههای دیگر مدل بدست میآید (قطعا میدونید که منظورم از مدل، مدل ریاضی هست). کد زیر را در نظر بگیرید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/;
table d(i , j) distance
qazvin hamedan arak
zanjan 329 160 505
tehran 337 160 239
;
scalar f cost per product and km /25/;
parameter c(i, j);
c(i, j) = f * d(i, j);
همونطور میبینید پارامتر c در زمان تعریفش مقداری ندارد ولی در خط بعد (یعنی خط 14) مقدار خودش را از ضرب اسکالر f در جدول d بدست میآورد، در نتیجه پارامتر c یک پارامتر محاسباتی هست.
برای به وجود آوردن یک پارامتر محاسباتی اول باید اون را مثل یک پارامتر معمولی تعریف کنیم ولی لازم نیست مقداری بهش بدیم (دقیقا مثل خط 13 کد بالا)، بعد از تعریف اون پارامتر، در یک خط جداگانه میتونیم با یک عملیات ریاضی، مثل چیزی که در خط 14 میبینید، اون پارامتر را مقداردهی کنید.
تغییر مقدار یک اسکالر بعد از تعریف آن در گمز
دوباره کد قبلی را نگاه کنید، اگه در جایی از مدل نیاز باشه مقدار f تغییر کند، به راحتی میتونیم با کد زیر مقدار f را تغییر دهیم (در کد پایین من به f مقدار جدید 35 دادم):
f = 35;
عملگرهای ریاضی در گمز
عملگرهای + ، – ، * و / در گمز به ترتیب معنای جمع، تفریق، ضرب و تقسیم را میدهند. همچنین برای توان میتوانیم از عملگر ** استفاده کنیم. برای مثال 3**2 به معنای 2 به توان 3 هست.
اولویت عملگرهای ریاضی در گمز
اولویت اول با توان هست، اولویت دوم ضرب و تقسیم و اولویت آخر جمع و تفریق است. به طور مثال کد زیر را در نظر بگیرید، بعد از حل مدل، مقدار f برابر 52 میشود:
f = 20 + 2 * 4**2;
البته شما میتونید با استفاده از پرانتز اولویتهای محاسباتی خودتون را ایجاد کنید چون جدا از عملگرها، بالاترین اولویت در گمز پرانتز هست. برای اینکه بهتر متوجه بشید من کد بالا را یکبار دیگه با پرانتز بازنویسی میکنم بطوری که نتیجه همان 52 بشود:
f = ((4 ** 2) * 2) + 20;
الان گمز محاسبه را به جای توان، از اولین پرانتزی که میبینید شروع میکند، وقتی وارد پرانتز اول شد، دوباره پرانتز میبیند پس وارد پرانتز دوم میشود و 4 را به توان 2 میرساند و…
توابع ریاضی از پیش نوشته شده در گمز
مثل تمام زبانهای برنامه نویسی گمز هم برای اینکه کار ما راحتتر شود، توابع ریاضی آمادهای در اختیار ما قرار داده، مثلا برای محاسبه سینوس 25 میتوانیم از کد زیر استفاده کنیم:
f = sin(25);
گمز توابع آماده زیادی داره، مثلا abs، floor،sqrt، sqr که به ترتیب توان دو، جذر، براکت و قدر مطلق یک عدد را برای ما حساب میکنند. برای دیدن تمامی توابع آماده موجود در گمز میتونید از این لینک استفاده کنید.
تابع sum در گمز
کد زیر را در بگیرید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/;
table d(i , j) distance
qazvin hamedan arak
zanjan 329 160 505
tehran 337 160 239
;
parameters
a(i) capocity of factory /zanjan 400
tehran 600/
b(j) demand of market /qazvin 375
hamedan 300
arak 325/;
فرض کنید نیاز دارید کل مقادیر پارامتر a را با هم جمع کنید و در یک اسکالر ذخیره کنید. برای این کار لازمه از کد زیر استفاده کنید:
scalar g;
g = sum(i , a(i));
در کد بالا ابتدا یک اسکالر به نام g تعریف کردم تا حاصل جمع را برای من نگه دارد و در خط بعد از تابع sum استفاده کردم، اولین چیزی که باید بعد از پرانتز برای تابع بنویسید، نام مجموعهای هست که قراره عملیات جمع روی آن اجرا شود، الان در مثال من، پارامتر a ظرفیت هر کارخانه را نشان میدهد و من هم میخواهم مجموع ظرفیتهای کارخانههای موجود در مدل خودم را داشته باشم، پس مجموعهای که باید به تابع sum بدهم، مجموعه کارخانهها یا i هست. دومین چیزی که لازمه بعد از , (کاما) به تابع sum بدهیم، خود پارامتر یا جدولی هست که قراره اعضاش را جمع کنیم. بعد از حل مدل انتظار دارم که مقدار g برابر 1000 شود.
اگر خواستید عملیات جمع را روی پارامترهای دو بعدی یا بیشتر انجام دهید یا مقادیر یک جدول را جمع بزنید، میتونید از کدی مشابه کد زیر استفاده کنید. کد زیر کل مقادیر جدول d را جمع میزند و در اسکالر h ذخیره میکند:
scalar h;
h = sum((i , j) , d(i , j));
تغییر مقدار یک عضو از پارامتر در گمز
کد زیر را در نظر بگیرید:
sets
i factories /zanjan , tehran/
j markets /qazvin , hamedan , arak/;
parameters
a(i) capocity of factory /zanjan 400
tehran 600/
b(j) demand of market /qazvin 375
hamedan 300
arak 325/;
اولین عضو از پارامتر b برابر 375 هست، یعنی تقاضای بازار قزوین 375 واحد محصول هست، فرض کنید در قسمتی از مدل نیاز داشتید که تقاضا بازار قزوین را برابر 500 قرار دهید و دوباره مدل را با این عدد حل کنید و نتایج را بررسی کنید، در این صورت با کد زیر قادر به انجام این کار خواهید بود:
b('qazvin') = 500;