۲۴

پارامترها

در بخش های قبل شیوه ی ایجاد مجموعه ها، که اندیس های (زیر نویس ها، مجموعه ها، زیر مجموعه ها، مجموعه های مشابه) مختلف را می توان توسط آنها تعریف کرد، آموزش داده شد.

در این بخش عبارتی تحت عنوان پارامتر را تعریف نموده و سپس روش های مختلف ورود آن توسط گزاره های از پیش تعیین شده ی GAMS را مورد بررسی قرار می دهیم.

یک پارامتر یا یک داده ی ورودی، در تحقیق در عملیات، علم بهینه سازی، علم جبر و سایر علوم مرتبط با برنامه ریزی ریاضی به صورت زیر تعریف می شود:
پارامتر: یک پارامتر مقداریست که از قبل اندازه گیری و مشخص شده است و با ورود آن به یک مدل یا معادله به حل دقیق/تر آن کمک می کند.
به عنوان مثال:
۱٫ در حرکت یک پرتابه یا سقوط آزاد، مقدار نیروی گرانش ثابت (۹٫۸) در نظر گرفته شده است. (عدد ثابت)
۲٫ در یک مسئله ی تحقیق در عملیات، مقادیر ضرایب تابع هدف (C) ، مقدار ضرایب محدودیت ها (A) ، مقادیر سمت راست محدودیت ها (B) نوعی پارامتر محسوب می شوند که از قبل مقدار آن ها را می دانیم. (ماتریس)

با دقت به مثال های فوق مشاهده می شود که یک پارامتر یا شامل یک عدد ثابت و یا یک ماتریس می باشد. یک پارامتر را می توان به توسط دستورهای مختلفی می توان تعریف نمود. این دستورها را می توان به چهار دسته ی عمده ی Interface, Table, Parameter, Scalar تقسیم بندی کرد.

دستور Scalar : جهت وارد کردن پارامترها/داده هایی مورد استفاده قرار می گیرد که مقادیری یکه و ثابت در مسئله به خود می گیرند.
فرم کلی این دستور و یک مثال از آن را در زیر مشاهده می کنید:

Scalar ParameterName/Value or the Quantity/;
*Example1:
Scalar Tehran/1000/;

مثال بالا بیان می کند که کمیتی به نام Tehran ثابت بوده و از نوع Scalar می باشد. همچنین مقدار این کمیت برابر با ۱۰۰۰ می باشد.

دستور 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 که در مدل استفاده می شود برابر با ۰٫۱ در نظر گرفته شده است. در مثال دوم پارامتر x که دارای اندیس i می باشد (فرض شده است که i از ۱ تا ۳ متغییر است) مقادیری به آن نسبت داده شده است. مقدار x برای i های مختلف ۱و۲و۳ به ترتیب برابر با ۲و۳و۴ می باشد. دقت بفرمایید که در صورتی 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 وابسته است (فرض نموده ایم که این اندیس ها از ۱ تا ۳ متغییر می باشند). مقادیر مختلف a به شکل یک ماتریس ۴*۴ به نمایش گذاشته شده است. مجدداً بیان می کنیم که اندیس های 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
;

کد بالا برای ماتریس های ۳ بعدی ثابت می باشد. این کد بیان می کند که ماتریس d که سه بعدی می باشد، در فایل excelی ،که با نام model.xls ذخیره شده است و شامل یک برگه (Sheet) به نام Cost5 می باشد، موجود می باشد. مقادیر d نیز از سلول a2 تا سلول d27 ادامه دارد.

توجه بفرمایید که تمامی ۴ دستور بالا، در همین برگه تحت تاپیک های مربوط به خود به تفصیل بیان خواهند شد.

نکته ی مهم: همانطور که گفته شد، کاربرد دستور Parameter و دستور Table با هم یکسان است. ولی به زبانی ساده بیان می کنیم که:
اگر یک پارامتر در مدلتان داشته باشید که فاقد بعد بود (یعنی اندیس نداشت) و یا اینکه دارای یک بعد بود (یک اندیس داشت) از دستور Parameter استفاده کنید.
اگر یک پارامتر در مدلتان داشته باشید که اندیس های ۲ به بالا داشت توصیه می شود که از دستور Table استفاده نمایید.
در مواقعی که تعداد اندیس های شما بالا باشد و همچنین تعداد داده هایی که استفاده می کنید نیز زیاد بود توصیه ی اکید می شود که از دستورات Interface چند بعدی استفاده نمایید.

بحث های ابتدایی در مورد تعریف پارامترهای مختلف به اتمام رسید. تعاریف تکمیلی در بخش مربوط به هر کدام از این دستورات به تفصیل مورد بحث و گفتگو قرار گرفته شده اند. جهت مطالعه ی هر کدام از این بخش ها می توانید به منوی (دسته بندی-پارامترها) مراجعه فرمایید.

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

با تشکر
مدیریت سایت gamsbook.ir

ایمیل: Support@gamsbook.ir
شماره تماس: ۳۳۲۵-۴۰۵–۰۹۱۹

 

24 دیدگاه در “پارامترها

      • سلام
        ببخشید میشه زودتر کد اینترفیس رو بذارین؟
        من میخوام اینترفیس بین متلب و گمز رو انجام بدم.
        منبعی میشه پیشنهاد کنین؟

        • سلام.
          یه مقاله سال ۲۰۱۰ در این رابطه نوشته شده. انگلیسی هست. ولی منبع بسیار خوبیه
          عنوان: GDXMRW: Interfacing GAMS and MATLAB
          مولفان: Michael C. Ferris Rishabh Jainy Steven Dirkse
          سال انتشار: ۲۰۱۰
          موفق باشید

  1. سلام ، ببخشید من اینترفیس بین گمز و اکسل رو برای ۴بعدی و ۵بعدی می خوام. اگه لطف کنید راهنمایی کنید واقعا ممنون میشم. خیلی بهش نیاز دارم

    • سلام
      دو روش دارین
      یکی توسط خود گمز
      دیگری هم توسط فراخوانی از نرم افزارهایی مثل اکسل
      روش اول:
      از دستور 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

      روش دوم هم فراخوانی از اکسل هست که تو همین یکی دو روزه من لینکش رو تو سایت تو بخش داده ها خواهم گذاشت.
      موفق باشین

  2. سلام…. خسته نباشید
    می بخشید سوالم تکراری هست اما چون زمان زیادی از آخرین سوال در این مورد میگذره میپرسم… لینک توضیحات بیشتر در رابطه با interface رو در سایت نگذاشتید؟
    ممنون میشم پاسخگو باشید

  3. باسلام و خسته نباشید به شما، ممنون از سایت خوبتون. من می خواهم در مدل، از داده هایی با بیش از دو بعد استفاده کنم. وقتی میخواهم دستور interface را تایپ کنم، کلمه interface به رنگ آبی ظاهر نمی شود که بتوانم بقیه دستور را بنویسم. میخواستم بپرسم که ایراد کار چیه؟

  4. سلام خیلی ممنون از اطلاعات مفیدتان
    یک سوالی داشتم در رابطه با اختصاص داده در قسمت پارامترها. اگر ۲۵۰۰۰۰ هزار تا وسیله برقی یکسان داشته باشیم که ظرفیت هر کدام مثلا ۱۲kwh باشد، این رو چجوری تعریف میکنیم؟

  5. سلام ، وقتتون بخیر
    برای اینکه پارامتر فازی رو تعریف کنیم
    مثلا یه عدد فازی ذوزنفه ای (۵۰و۴۰و۳۰و۲۰)
    چطوری تو گمز باید تعریف کنیم؟(باید دیفازی کنیم دیگه درسته؟)

    اگه بله از چه روشی برای دیفازی کردن استفاده کنم(روش متداول چیه؟)

    • سلام
      معمولا به دو روش تعریف میکنن. بسته به نیازتون هر کدوم رو خواستین میتونین انتخاب کنین.
      روش اول:
      یه مجموعه به اسم fz تعریف کنین:

      set fz/L,m1,m2,R/;
      

      بعد پارامتر هایی که فازی هستن رو یه اندیس fz بهشون بدین و مقدار دهی کنین.
      روش دوم:
      اگه یه پارامتر a دارین که قراره فازی بشه. این a رو به جاش ۴ تا aL,am1,am2,aR تعریف کنین.
      برای دیفازی کردن روش متداول جمع (L+2m1+2m2+R)/(6) هست.

  6. سلام، ممنون از سایت خوبتون
    عذر میخوام من یه پارامتر دارم که این پارامتر از یه رابطه بدست میاد. رابطه به شکل زیر هست. من چه جوری این D رو وارد گمز کنم؟

     If  ti + Ti     pi/Cpi        D =  Cpi * (pi/Cpi – ti
    
    • سلام
      ti چیه ؟ این if که نوشتین فقط پارامتر توشه یا متغیر هم داره؟ و اینکه چرا نوشتین ti و Ti اینا توگمز یکین که… واضح بنویسین لطفا

      • این if فقط پارامتر داخلش هست و متغیر نداره. این دو مقدار هم t زمان شروع اختلال براساس کسر زمانی و T هم کسری از دوره زمانی که اختلال طول کشیده هست و مقدار یکسانی نداره، درسته اشتباه تایپ کردم توی گمز هر دو یکی هستن. من چه جوری اینو باید کد کنم؟

            D=Cpi* Tdi       if      ti+Tdi   Pi/Cpi
        
        • سلام
          اگه همه این چیزایی که نوشتین پارامتر باشن، میتونین این خط رو بنویسین.

          D=(cp(i)+Td(i))$(t(i)+td(i)>pi/cp(i));
          

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *