در بخش های قبل شیوه ی ایجاد مجموعه ها، که اندیس های (زیر نویس ها، مجموعه ها، زیر مجموعه ها، مجموعه های مشابه) مختلف را می توان توسط آنها تعریف کرد، آموزش داده شد.
در این بخش عبارتی تحت عنوان پارامتر را تعریف نموده و سپس روش های مختلف ورود آن توسط گزاره های از پیش تعیین شده ی GAMS را مورد بررسی قرار می دهیم.
یک پارامتر یا یک داده ی ورودی، در تحقیق در عملیات، علم بهینه سازی، علم جبر و سایر علوم مرتبط با برنامه ریزی ریاضی به صورت زیر تعریف می شود:
پارامتر: یک پارامتر مقداریست که از قبل اندازه گیری و مشخص شده است و با ورود آن به یک مدل یا معادله به حل دقیق/تر آن کمک می کند.
به عنوان مثال:
1. در حرکت یک پرتابه یا سقوط آزاد، مقدار نیروی گرانش ثابت (9.8) در نظر گرفته شده است. (عدد ثابت)
2. در یک مسئله ی تحقیق در عملیات، مقادیر ضرایب تابع هدف (C) ، مقدار ضرایب محدودیت ها (A) ، مقادیر سمت راست محدودیت ها (B) نوعی پارامتر محسوب می شوند که از قبل مقدار آن ها را می دانیم. (ماتریس)
با دقت به مثال های فوق مشاهده می شود که یک پارامتر یا شامل یک عدد ثابت و یا یک ماتریس می باشد. یک پارامتر را می توان به توسط دستورهای مختلفی می توان تعریف نمود. این دستورها را می توان به چهار دسته ی عمده ی Interface, Table, Parameter, Scalar تقسیم بندی کرد.
دستور Scalar : جهت وارد کردن پارامترها/داده هایی مورد استفاده قرار می گیرد که مقادیری یکه و ثابت در مسئله به خود می گیرند.
فرم کلی این دستور و یک مثال از آن را در زیر مشاهده می کنید:
Scalar ParameterName/Value or the Quantity/;
*Example1:
Scalar Tehran/1000/;
مثال بالا بیان می کند که کمیتی به نام Tehran ثابت بوده و از نوع Scalar می باشد. همچنین مقدار این کمیت برابر با 1000 می باشد.
دستور Parameter: جهت وارد کردن پارامترها/داده های ثابت و همچنین پارامترهایی که دارای اندیس هستند استفاده می شود.
فرم کلی این دستور به همراه چند مثال از آن را در زیر مشاهده می کنید:
Parameter ParameterName/Value/;
*Example1:
Parameter P/0.1/
*Example2:
Parameter x(i) /1 2,2 3,3 4/;
*Example3:
Parameter y(i);
y(i)=x(i)+1;
در مثال اول پارامتری به نام P که در مدل استفاده می شود برابر با 0.1 در نظر گرفته شده است. در مثال دوم پارامتر x که دارای اندیس i می باشد (فرض شده است که i از 1 تا 3 متغییر است) مقادیری به آن نسبت داده شده است. مقدار x برای i های مختلف 1و2و3 به ترتیب برابر با 2و3و4 می باشد. دقت بفرمایید که در صورتی GAMS این کد را لحاظ خواهد کد که اندیس i از قبل توسط دستور Set تعریف شده باشد.
دستور Table: جهت وارد کردن پارامترها/داده های ثابت و همچنین پارامترهایی که دارای اندیس هستند استفاده می شود.
مثال زیر می تواند یک جدول دو بعدی را به نمایش بگذارد:
Table a(i,j)
- 1 2 3 4
1 0 3 9 8
2 7 6 0 2
3 1 1 1 1
4 0 6 8 3
این جدول بیان می کند که داده ای به نام a در مدل موجود است که به اندیس های i و j وابسته است (فرض نموده ایم که این اندیس ها از 1 تا 3 متغییر می باشند). مقادیر مختلف a به شکل یک ماتریس 4*4 به نمایش گذاشته شده است. مجدداً بیان می کنیم که اندیس های i و j پیش تر باید توسط دستور Set تعریف شده باشند.
دستورات Interface: نرم افزار GAMS علاوه بر اینکه در محیط خود می تواند داده خوانی کند، توانایی باز خوانی اطلاعات از نرم افزارهای دیگر نظیر Excel و Access را نیز دارد. با استفاده از یک سری دستورات، کاربر می تواند بدون اینکه محیط GAMS را شلوغ تر کند، اطلاعات را از روی نرم افزارهای دیگر بخواند و حتی نتایجی را روی آنها بنویسد. این امر را Interface بین نرم افزارها می نامند.
مثال زیر شیوه ی تعریف یک جدول سه بعدی را در قالب Interface بین GAMS و Excel نشان دهد.
$onecho > Model.txt
I=Model.xls
R=Cost5-s!a2:d27
O=Model.inc
$offecho
$call =xls2gms @Model.txt
Table d(i,j,s) distance
$include Model.inc
;
کد بالا برای ماتریس های 3 بعدی ثابت می باشد. این کد بیان می کند که ماتریس d که سه بعدی می باشد، در فایل excelی ،که با نام model.xls ذخیره شده است و شامل یک برگه (Sheet) به نام Cost5 می باشد، موجود می باشد. مقادیر d نیز از سلول a2 تا سلول d27 ادامه دارد.
توجه بفرمایید که تمامی 4 دستور بالا، در همین برگه تحت تاپیک های مربوط به خود به تفصیل بیان خواهند شد.
نکته ی مهم: همانطور که گفته شد، کاربرد دستور Parameter و دستور Table با هم یکسان است. ولی به زبانی ساده بیان می کنیم که:
اگر یک پارامتر در مدلتان داشته باشید که فاقد بعد بود (یعنی اندیس نداشت) و یا اینکه دارای یک بعد بود (یک اندیس داشت) از دستور Parameter استفاده کنید.
اگر یک پارامتر در مدلتان داشته باشید که اندیس های 2 به بالا داشت توصیه می شود که از دستور Table استفاده نمایید.
در مواقعی که تعداد اندیس های شما بالا باشد و همچنین تعداد داده هایی که استفاده می کنید نیز زیاد بود توصیه ی اکید می شود که از دستورات Interface چند بعدی استفاده نمایید.
بحث های ابتدایی در مورد تعریف پارامترهای مختلف به اتمام رسید. تعاریف تکمیلی در بخش مربوط به هر کدام از این دستورات به تفصیل مورد بحث و گفتگو قرار گرفته شده اند. جهت مطالعه ی هر کدام از این بخش ها می توانید به منوی (دسته بندی-پارامترها) مراجعه فرمایید.
خدمت عزیزانی که آموزش گام به گام را از ابتدا همراه با ما شروع نموده اند توصیه می شود که پس از مطالعه و مرور این صفحه، جهت ادامه مراحل آموزش به بخش Scalar در لیست مطالب مراجعه نمایند.
با تشکر
مدیریت سایت gamsbook.ir
ایمیل: Support@gamsbook.ir
شماره تماس: 3325-405–0919
سلام. برای تعریف یک پارامتر که یک حد بالا و پایین داره باید چطوری توی تعریف پارامترها در گمز بیاریمش؟ مثلا فرض کنید هزینه تولید توی هر دوره (cp(t)) یک پارامتره که حد بالا و پایینش 60 و 70 است.
این چیزی که من میگم با حالتی که از تابع uniform استفاده میشه فرق داره.
سلام و ادب
اگر پارامتره، خب مقدارش مشخصه دیگه. و بازه معنی نمیده
اگر متغیره، باید با .lo و .up حد پایین و پالاش رو مشخص کنین.
کاربرد این حدود چیه؟
سلام وقتتون بخیر
من پارامتری دارم که در یه محدودیت Qc(j,k,n,p) و در یک محدودیت Qc(j,k,n) باید به کار ببرم.ولی خب از دستور Alias هم نمیشه استفاده کرد.چه کاری باید انجام بدهم؟
سلام. اين دو دو پارامتر كاملا متفاوت هستند. اولي داراي 4 انديس و دومي داراي 3 انديس هست. پيشنهاد ميكنم حتما در قالب دو پارامتر جدا نوشته بشود. اما اگر به هر دليل نياز داريد از همان پارامتر استفاده كنيد، حالتي شبيه كد زير ميتواند مفيد باشد:
اما واقعا توصيه نميكنم. ممكنه خطاي محاسباتي در روند حل داشته باشيد.
موضوعات بيشتر در: http://t.me/gamsbook
خیلی ممنون از پاسختون
سلام
من پارامتری دارم بدین صورت CAPmax(i) که اندیس i نام کارخانه هاست و حداکثر ظرفیت هر یک از کارخانه ها را می رساند میخوام این پارامتر به صورت سالانه سالی 5 درصد رشد داشته باشد. این رو چگونه کدنویسی کنم
سلام
من پارامتری دارم که می خوام هر سال 5 درصد رشد کنه چطوری کدنویسی کنم؟
CAPmax(i) پارامتر است که اندیس i نام کارخانه هاست
سلام
من پارامتری دارم CAPmax(i) حالا میخوام این پارامتر سالانه ۵ درصد رشد داشته باشه و این که اندیس iهم نام کارخانه است این رو چطوری می تونم کدنویسی کنم
سلام
وقتی می گید سالیانه رشد داشته باشه، یعنی اینکه یک اندیس t هم باید به این پارامتر اضافه بشه. برای افزایش هم، می تونید به سال اول مقدار اولیه بدید و هر سال افزایش بدید.
با سلام جناب مهندس محمودی عزیز
مهندس جان من یک مجموعه مانند x(i) دارم که 19 عضو داره به این صورت
در ادامه کدی دارم مانند
چیزی که میخواستم این بود که مقادیر
(“(i)aa”)microgrid رو انتخاب کنم
به این مفهوم که مقادیر microgrid رو که با مقادیر aa یکی هستن انتخاب کنم برای مثال
نمیدونم این چطوری در گمز مدل کنم ممنونم میشم کمکم کنین!
سلام و ادب
تابع aa رو بصورت floor(….1,19.1) تعریف کنین که 19هم بتونه تولید بشه.
بعدشم اینکه چرا انقد قضیه رو بپیچونیم؟ بهتر نیست که اندیس به جای aa داشته باشیم؟ مثلا اندیس j که با i آلیاس شده باشه؟ مفهوم رو نباید پیچوند. الان من کاربردش رو متوجه نشدم
با تشکر
microgrid در اینجا پارامتر ثابت است اما من میخوام هر سری مقادیر مختلف اون به صورت رندم انتخاب کنم
پس یه شرط بذارین که هر گاه aa(i)=microgrid بود شرط رو برقرار کنه
با تشکر میشه بفرمایین چطوری برای دو پارامتر شرط بزارم؟
اینو ببینید، ممکنه به کارتون بیاد.
اینو بازم میگم، مفهومی که دارین بیان میکنین گنگ هست. به هر حال مورد بالا ممکنه کمکتون کنه عزیز
و مدل مسئله هم غیر خطی هست. وقتی متغییر رو با SEMIOTIC VARIABLE تعریف می کنم و حد بالا و پایین رو به صورت B.lo=0 و B.up=1 تعریف می کنم این خطا رو میده
65 Discrete variables can only appear in MIP, RMIP, MINLP
RMINLP MIQCP or RMIQCP MPEC RMPEC problems.
256 Error(s) in analyzing solve statement. More detail appears
Below the solve statement above
مسیله با DNLP تعریف کردم
جدای از اینکه درست تعریف کردین یا نه، مدل شما از حالت lp خارج شده و تبدیل شده به mip یا Minlp
منظورم متغییر بود و یه متغییری که مقدارش بین صفر و یک باشد رو چه جوری تعریف کنم به صورتی که بزرگتر مساوی یا کوچکتر مساوی نیست (یعنی B>0 و B<1) یعنی نباید B بزرگتر صفر و کوچکتر مساوی یک بشه بلکه باید مقدارش یه عددی بین صفر و یک به دست بیاد
سلام
اینو بذارین بعد از تعریف متغیر b
[css]
b.lo=0.001;
b.up=.999;
[css]
این حدود رو بسته به نیاز می تونید تغییر بدید.
اگر بخواییم که در یک کد غیرخطی به جز چند متغییر مقدار یک پارامتر هم محاسبه بشه چیکار باید کنیم؟
سلام
یعنی چی مقدار پارامتر محاسبه بشه؟ پارامتر خودش مقدار داره. متوجه نمیشم
سلام با تشکر از سایت خوبتون
چرا اعداد نماد علمی به دست میده گمز، درحالیکه من کد زیر روهم نوشته ام و ام بزرگم هم عدد کوچکی هست.
0<onecho$
epint 0
offecho$
test.optfile=1
سلام
آپشنی که استفاده کردین برای تلرانس هست و برای این نیازی که فرمودین نیست. باید یه آپشن مناسب پیدا کنین.
سلام من یه معادله ای تعریف کردم مطالق زیر
(z(i,j) =e= sqrt(sqr(LN(i,j,’x’)) + sqr(LN(i,j,’r
حالا در جایی نیاز دارم 1 تقسیم بر z رو بدست بیارم ولی ارور میده و از حل خارج میشه و می گه عبارت 0 میشه
در حالی که z هیچ مقدار صفری نداره
ارور : (Exec Error at line 144: division by zero (0
سلام
یا طرفین وسطین کنین، و مخرج رو ضربدر اون طرف محدودیت کنین. یا اینکه اگر امکانش نبود، به زیر مخرج یه عدد خیلی کوچیک نظیر 0.00001 اضافه کنین.
سلام و عرض تشکر بابت پاسخگویی های خوبتون
چطوری میتونم یک پارامتر با 4 اندیس تعریف کنم ؟
سلام
مچکرم.
اگه رندم باشه که با پارامتر تعریفش کنین و بعدشم فرمولشو بنویسین.
اگه به صورت جدوله، به شکل زیر تعریف کنین. به اندیس اول و دوم، وعلامت نقطه دقت کنین. تو ستونها میتونین k,m رو بذارین، یا اینکه تو سطر میتونین i.j.k رو تعریف کنین، و تو ستون m رو.
table d(i,j,k,m)
k1.m1
i1.j1 2
i1.j2 3
سلام
من یک پارامتر دارم به صورت (ct(i,j که اندیس های i و j متعلق به یک مجموعه چند بعدی مثلا A می باشد که خود A حاصل اجتماع چند مجموعه دیگر است، بحث کدنویسی مجموعه ها انجام شده است اما میخواستم بدانم برای یک پارامتر با این ویژگی چه باید کرد؟
سلام
در مورد A و مجموعه های درگیر بیشتر صحبت کنید لطفا. این مشکل تعریف پارامتر هم بر میگرده به خود مجموعه ها
سلام،چطور میشه برای دو پارامتر مجزا عددهای تصادفی برابر تولید کرد
یعنی مفهوم این کد که اشتباه هست رو برسونه :
;(dissd(s,d)=dissw(s,w)=uniform(20,60
سلام
تو دو خط بنویسین. اینجوری اشتباهه.
توی دو خط هم ارور میده بخاطر اندیس های متفاوتشون
سلام چطوردرگمزبایدپارامترهاروفازیواردکنیم مثلا وقتی مقدار تقاضا یا عرضه فازی باشه؟؟
سلام
قبلا که پارامتر شما a(i بودهف الان به شکل a(f,i) تعریفش کنین. که f یه مجموعه س شامل l,m,u
یا a رو به شکل al(i), am(i),au(i تعریف کنین.
سلام ببخشید داخل معادلات می شه دو تا متغیر که وابسته به اندیس های متفاوتی هستند رو با هم جمع زد؟
مثل زیر مثلا:
سلام
بله.
ببخشید در بخش ورودی پارامترهای فازی(عدم قطعیت) رو چطور باید وارد کنیم؟
سلام
میتونین یه اندیس به پارامتر فازیتون اضافه کنین. مثلا x(i,j) تبدیل میشه به x(fn,i,j که fn یه اندیسه که l,m,u رو شامل میشه. یا میتونین xl(i,j و xm(i,j و xu(i,j تعریف کنین. و هر جا لازم بود ازشون استفاده کنین.
ببخشید که گیجتون کردم
من در مدلم دوتا متغیر دارم، یکی x هستش و اون یکی y هستش که هر دو هم باینری هستند و من در آخر کد مقادیر این x و y و همچنین مقدار هزینه کلمو یا همون تابع هدفمو میخوام . من تابع هدفم مینیمم کردن هزینس که توش یک wq دارم که همون زمان انتظار در صف هستش که از فرمول های lq و پای صفر بدست میاد. همین lq و پای صفر خودشون بر حسب x و y که متغیرهای مسئلم هستند، حساب میشن. در واقع انگار wq من از یک رابطه بدست میاد که توش متغیرهای مسئلم هست و حالا من نمیدونم این wq رو باید چطوری تعریف کنم.
سلام
باید متغیر تعریف بشه. و اون فرمولی که رابطه ی بین x,y و wp هم هست رو هم باید به صورت محدودیت ذکر کنین. (دلیلش اینه که شما از قبل نمیدونین مقدار wq چیه. اگه میدونین که باید پارامتر تعریف بشه و بهش عدد داده بشه)
خیلی ممنون
سلام
من یک پارامتری در تابع هدفم دارم که این پارامتر خودش یک فرمولی داره و این فرمول داخلش یکی از متغیرهای مسئلم هست، این رو باید چطور تعریف کنم؟ (در واقع فرمول های تئوری صف رو دارم که مثلا فرمولای پای صفر و lq رو توی مدلم دارم بعدش از این هافرمول wq بدست میاد که اون رو میخوام بزارم توی تابع هدف )
میخوام ببینم که چون داخل فرمول پارامترم ، متغیرم هست مشکلی نداره توی همون پارامتر ها تعریفش کنم؟
خودم سعی کردم فرمول نهایی رو بدست بیارم دستی و بعد مستقیم ببرم تابع هدف اما خب فقط واسه جاهایی که تعداد خدمت دهندم 2 تا باشه، این فرمول ساده شده بدست میاد و تعریفش خیلی هم پیچیده میشه اما برای تعداد خدمت دهنده های بیشتر نمیشه فرمول مستقیم بدست اورد و گذاشت توی تابع هدف.
ممنون میشم راهنماییم کنید
سلام
طبق چیزی که فرمودین باید متغییر تعریفش کنین نه پارامتر.
اخه متغیر تعریف کنم اونوقت باید اخر مسئله اون رو هم دیسپلی کنم؟
بعد مثلا من wq رو میخوام دیگه، ولی برای اینکه wq رو بدست بیارم باید پای صفر و lq رو اول بدست بیارم که توی فرموله این دو، متغیرهای مسئلم استفاده شده و با استفاده از فرمول lq و پای صفر هست که که wq من بدست میاد اگر بخوام متغیر تعریف کنم اونوقت باید پای صفر و lq رم متغیر تعریف کنم و میشه 3 تا متغیر یعنی؟
شما منو گیج کردین.
شما کدوم یک از پارامترها رو به عنوان معلوم و ورودی به مدل میدین؟
کدوم یک از نماد های شما به عنوان متغیره و مجهول و مدل باید بدست بیاره؟
کدوم پارامترا بعد از حل مدل محاسبه میشن؟ (یعنی تو مدل دخالتی ندارن و بعد از حل مدل باید حساب بشن)
رابطه رو نمیتونم درست بنویسم، جابه جا ارسال میشه
سلام، ممنون از سایت خوبتون
عذر میخوام من یه پارامتر دارم که این پارامتر از یه رابطه بدست میاد. رابطه به شکل زیر هست. من چه جوری این D رو وارد گمز کنم؟
سلام
ti چیه ؟ این if که نوشتین فقط پارامتر توشه یا متغیر هم داره؟ و اینکه چرا نوشتین ti و Ti اینا توگمز یکین که… واضح بنویسین لطفا
این if فقط پارامتر داخلش هست و متغیر نداره. این دو مقدار هم t زمان شروع اختلال براساس کسر زمانی و T هم کسری از دوره زمانی که اختلال طول کشیده هست و مقدار یکسانی نداره، درسته اشتباه تایپ کردم توی گمز هر دو یکی هستن. من چه جوری اینو باید کد کنم؟
سلام
اگه همه این چیزایی که نوشتین پارامتر باشن، میتونین این خط رو بنویسین.
سلام ، وقتتون بخیر
برای اینکه پارامتر فازی رو تعریف کنیم
مثلا یه عدد فازی ذوزنفه ای (50و40و30و20)
چطوری تو گمز باید تعریف کنیم؟(باید دیفازی کنیم دیگه درسته؟)
اگه بله از چه روشی برای دیفازی کردن استفاده کنم(روش متداول چیه؟)
سلام
معمولا به دو روش تعریف میکنن. بسته به نیازتون هر کدوم رو خواستین میتونین انتخاب کنین.
روش اول:
یه مجموعه به اسم fz تعریف کنین:
بعد پارامتر هایی که فازی هستن رو یه اندیس fz بهشون بدین و مقدار دهی کنین.
روش دوم:
اگه یه پارامتر a دارین که قراره فازی بشه. این a رو به جاش 4 تا aL,am1,am2,aR تعریف کنین.
برای دیفازی کردن روش متداول جمع (L+2m1+2m2+R)/(6) هست.
سلام خیلی ممنون از اطلاعات مفیدتان
یک سوالی داشتم در رابطه با اختصاص داده در قسمت پارامترها. اگر 250000 هزار تا وسیله برقی یکسان داشته باشیم که ظرفیت هر کدام مثلا 12kwh باشد، این رو چجوری تعریف میکنیم؟
سلام
مرسی.
یعنی چی چجوری؟
ممنون از شما مشکل حل شد
باسلام و خسته نباشيد به شما، ممنون از سايت خوبتون. من مي خواهم در مدل، از داده هايي با بيش از دو بعد استفاده كنم. وقتي ميخواهم دستور interface را تايپ كنم، كلمه interface به رنگ آبي ظاهر نمي شود كه بتوانم بقيه دستور را بنويسم. ميخواستم بپرسم كه ايراد كار چيه؟
ميشه از همون دستور table براي داده هايي با بيش از دو بعد نيز استفاد كرد؟
بله. مهندس مناسب تره که تاپیک table رو بخونین
سلام
ممنونم.
کی گفته باید آبی بشه یا کی گفته که Interface دستور آماده گمزه؟
سلام…. خسته نباشید
می بخشید سوالم تکراری هست اما چون زمان زیادی از آخرین سوال در این مورد میگذره میپرسم… لینک توضیحات بیشتر در رابطه با interface رو در سایت نگذاشتید؟
ممنون میشم پاسخگو باشید
سلام
خواهش میکنم
نه هنوز. تو کامنتا بیشتر توضیح دادیم
سلام. ممنون برای آموزش هاتون. هنوز دستور Interface رو برای آموزش قرار ندادید؟ ممنون بابت زحماتتون.
سلام
ممنون. نه مناسفانه. به زودی میذاریم. یکم سرمون شلوغه
سلام ، ببخشید من اینترفیس بین گمز و اکسل رو برای 4بعدی و 5بعدی می خوام. اگه لطف کنید راهنمایی کنید واقعا ممنون میشم. خیلی بهش نیاز دارم
سلام
دو روش دارین
یکی توسط خود گمز
دیگری هم توسط فراخوانی از نرم افزارهایی مثل اکسل
روش اول:
از دستور table استفاده کنید:
table a(i,j,k)
--- 1 2 3
1.1 0 1 3
1.2 5 6 1
2.1 0 3 4
2.2 0 0 0
روش دوم هم فراخوانی از اکسل هست که تو همین یکی دو روزه من لینکش رو تو سایت تو بخش داده ها خواهم گذاشت.
موفق باشین
ببخشید مطالب Interface رو میشه زود تر بذارین؟ من فوری لازم دارم
سلام.
واقعا فوری نمیشه.
واسع چند بعدی می خواین براتون بفرستم.
الان واقعا نمیشه مطالبش یکم وقت گیره
موفق باشین
سلام
ببخشید میشه زودتر کد اینترفیس رو بذارین؟
من میخوام اینترفیس بین متلب و گمز رو انجام بدم.
منبعی میشه پیشنهاد کنین؟
سلام.
یه مقاله سال 2010 در این رابطه نوشته شده. انگلیسی هست. ولی منبع بسیار خوبیه
عنوان: GDXMRW: Interfacing GAMS and MATLAB
مولفان: Michael C. Ferris Rishabh Jainy Steven Dirkse
سال انتشار: 2010
موفق باشید