۶۷

دستور parameter

تعدادی از بردارهای ثابت و داده های محاسباتی (چه به اندیس ها وابسته باشند چه نباشند) را با دستور Parameter تعریف می کنند. دستور کلی آن تقریبا مشابه کمیت های scalar است. فرض کنیم داده ها و بردارهای زیر را داریم:

parameter-Examples

دستورات مربوط به هر کدام از این بردارها و پارامتر ها به صورت زیر خواهد بود:

*Example1:
parameter tehran/3/;
*Example2:
parameter a/1/, b/3/, c/2.4/, alpha/0.25/;
*Example3:
parameter d/5/, e/2/, f(j)/1 3,2 0,3 6/;
*Example4:
parameter Gela(c)/c1 10,c2 100,c3 1000/;
*Example5:
parameter a(i)/(a1,a4) 4,(a5*a9) 12/;


ذکر این نکته لازم است که برای تعریف f, Gela و a به دلیل اندیس دار بودن این داده ها باید ابتدا اندیس مربوط به هر یک تعریف شده و سپس به تعریف آنها پرداخت. مجموعه های این اندیس ها را می توان به شکل زیر تعریف نمود: (این مجموعه ها باید در خطوطی قبل از دستور parameter تعریف شده باشند.


Sets j/1*3/
c/c1,c2,c3/
i/a1*a9/ ;


توسط دستور parameter می توان داده های با بیش از ۲ بُعد (۲ اندیس) نیز تعریف نمود. دو مثال زیر مثالهایی از داده هایی با ۳ بعد می باشند:

Data-Entry-Parameter-3D

توضیح: در مثال اول پارامتر multi به i,k,j وابسته است. به طوری که اگر i=1 و j=1 و k=2 باشند، multi مقدار ۳۰ را اختیار می کُند. حالَُ اگر ترکیبی مانند i=3, j=2, k=1 وجود داشته باشد، GAMS خود به خود مقدار آن را صفر در نظر می گیرد.
در مثال دوم نیز اگر آقای احمدی(مستخدم) زیر دست آقای عزیزی(مدیر) در”سازمان ۳ ” انجام وظیفه کند دستمزدی معادل ۲۰۰۰ واحد خواهد داشت.

ادامه ی مدل سازی مثال کاربردی ۱:
در صورتی که آموزش گام به گام را از ابتدا پیگیری نموده اید. ملاحظه می فرمایید که در این مثال سه بردار a و b و c موجودند. بردارهای b و c را توسط دستور parameter به شکل زیر می توانیم تعریف نماییم. (بردار a نیز به دلیل سهولت بیشتر توسط دستور Table تعریف خواهد شد- هر چند که این امر با دستور parameter هم قابل اجرا کد کردن است. علت این کار طولانی شدن و وقت گیر بودن کد نویسی مربوطه می باشد.)

parameters-Example1

دستور parameter تا حدی مورد بحث قرار گرفت. امیدواریم که گره ای از مشکلات شما در سر و کله زدن با این دستور گشوده باشیم.

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

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

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

 

67 دیدگاه در “دستور parameter

  1. با عرض سلام و وقت بخیر

    چگونه میتوان مجموعه ای مانند {Ni={j│dijt≤s را در گمز کد کرد؟ لطفا بنده رو راهنمایی بفرمایید… با سپاس.

  2. سلام، آیا امکان تغیر مقدار یکی از عناصر یک پارامتر وجود دارد؟ مثلا پارامتر r(i)=0 در ابتدا تعریف شده و در جای دیگر r(1)=7 گردد. اگر بله با چه دستوری؟
    سپاس

    • سلام
      وقتی شما متغیر مذکور رو تعریف کردید از اون خط به بعد r مقدار صفر میگیره. ولی اگه میخواین r(1)=7 بشه طبق دستور زیر عمل کنین. (یه مثاله فقط)

      parameter r(i);
      r(i)=0;
      r("1")=7;

  3. ممنونم از پاسخگویی سریعتون، من یه مشکل دیگه ام دارم اینه که میخوام در یه حلقه for هر بار یکی از عناصر r مقدار بگیره، ولی وقتی به طریق زیر تعریف کردم ارور میده، اصلا میشه این کارو کرد تو گمز؟

    set p /1*10/;
    patameter r(p);
    scalar n;
    for (n = 1 to 10,
    r(“n”)=7;
    );

  4. با سلام، یه سوال داشتم اگه لطف کنید راهنمایی کنید ممنون میشم. اگه پارامترها یک مقدار تصادفی بین یک بازه بگیرن یعنی مثلا (D=uniform(5,10 چطور باید تو گمز وارد کنم. من به صورت زیر وارد میکنم خطای ۹۶ میده.

    parameters

    (D(k,j,t)=uniform(5 10

    (S(l,j,t)=uniform(15 30;

  5. با سلام، یه سوال داشتم اگه لطف کنید راهنمایی کنید ممنون میشم. اگه پارامترها یک مقدار تصادفی بین یک بازه بگیرن یعنی مثلا (۵,۱۰)D=uniform چطور باید تو گمز وارد کنم. من به صورت زیر وارد میکنم خطای ۹۶ میده.

    parameters

    D(k,j,t)=uniform(5 10)
    S(l,j,t)=uniform(15 30);

      • ممنون از راهنماییتون ولی اگه بین ۵ و ۱۰ کاما بزارم که واسه اونم خطا می گیره. همچنین با گذاشتن کاما ۵)uniform آبی میمونه ولی ۱۰ مشکی میشه. وقتی هم که دقیقا کد بالا رو وارد میکنم فقط به جای کاما، اسپیس میزنم خطای ۹۶ میده. کد رو باید تو قسمت parameters وارد کنم دیگه؟

        • شما باید ابتدا پارامتر رو تعریف کنین، سمی کالون بذارین بعدش فرمول رو بنویسین. مشکل دقیقا همین جاست. دقت کنید:

          parameter x;
          x=unifrom(4,6);

  6. سلام. یه سوال دارم میخواستم اگه امکانش باشه راهنماییم کنین. یه پارامتر پنج اندیسه دارم که دو مقدار فقط میتونه بگیره برای مثال اعداد ۵۷۰ و ۵۲۰٫ اما این مقادیر با توجه به شرطی که برای یک متغیر (پنج اندیسه) وجود داره تعیین میشه. و این شرط به این صورته؛ اگه متغیرم مقداری بین صفر و ۸۵۰ بگیره اون پارامتر ۵۷۰ و اگه مقداری بزرگ تر مساوی ۸۵۰ شد اون پارامتر ۵۲۰ بشه. این شرط رو با دلار تو یه محدودیت نشون دادم اما ارور میده و مقدار پارامترو میخواد. نمیدونم اینو چطور تو گمز بنویسم
    ممنون میشم اگه راهنماییم کنید.

    • سلام
      این سوالی هست که اغلب کاربران گمز باهاش مواجه هستن.
      شما دو تا راه دارین. اول اینکه یه فرمول بنویسین (مثلا چند تا محدودیتش کنین) و این شرایطی که گفتین رو توش لحاظ کنین. تمرین خوبیه واسطون.
      روش دوم هم استفاده از دستور ifthen در gams هست. شما این دستور رو یاد بگیرین. سادست.

      c1.. x=e=ifthen(y>0,5,2)

      کد بالا میگه که اگه y>0 باشه آنگاه x برابر ۵ میشه. در غیر این صورت x برابر با ۲ میشه.
      دو تا نکته این وسط وجود داره:
      ۱٫ شما هر دو رو باید متغیر تعریف کنین.
      ۲٫ اگه از دستور ifthen استفاده کردید باید از solver های مخصوصی مثل sbb استفاده کنین.
      پاینده باشید

  7. سلام
    من یه پارامتر تعریف کردم،مثلا (dis(i،که /i1*i30/.بعد یه متغیر دارم مثل x،بعد میخوام یه متغیر دیگه من مقدارش برابر بشه با (y=dis(i=x،یعنی مثلا اگر x=5 شد،متغیر y من برابر بشه با آرایه ۵ام پارامتر dis
    ممنون میشم اگه راهنماییم کنید

    • سلام
      از دستور ifthen استفاده کنین. در ضمن، تو نوشتن شرط مربوطه دقت کنید که Ord باید استفاده کنین یا سایر شرطها رو

  8. سلام. وقتتون بخیر. خیلی خیلی ممنون برای وبسایتتون.

    من دارم یک مدلی رو که برای حرکت AGV نوشته شده رو کد میکنم. اما تو اولش موندم وای به حال بقیش!

    v: مجموعه‌ی ماشین‌های خودراهنما =۲
    ww: مجموعه‌ی کارگاه‌ها =۴
    cc: مجموعه‌ی محصولات =۳
    (U(c: تعداد مراحل ساخت محصول c

    3=(U(1
    3=(U(2
    4=(U(3

    (s(c,1), s(c,1),.., s(c,m) , …, s(c,u(c)) } : S(c} مجموعه‌ی مراحل ساخت هر محصول و(s(c,m مرحله m ام از ساخت محصول c

    (s(1,1), s(1,2), s(1,3) } : S(1}
    (s(2,1), s(2,2), s(2,3) } : S(2}
    (s(3,1), s(3,2), s(3,3) , s(3,4) } : S(3}

    مجموعه‌ی مراحل ساخت همه محصولات
    (TS=s(1)Ụ s (2) Ụs(3

    (Seq ( c: مجموعه‌ی مراحل ساخت هر محصول در هر ایستگاه کاری ( ترتیب ساخت هر محصول) و (q(c,m,W محصول c ام در مرحله m ام ساخت در ایستگاه w ام.

    {(Seq ( c ) : { q(3,1,1), q(3,2,2), q(3,3,3), q(3,4,4

    من تا اینجا اینجوری نوشتم:

    ;/Scalar v / 2
    ;/Scalar ww / 4
    ;/Scalar cc / 3

    ;/set k /1*v
    ;/set w /1*ww
    ;/set c /1*cc

    ;(alias(w,r

    ;/Parameter u(c)/1 3,2 3,3 4/;

    ;/Parameter s(c)/1 s1,2 s2,3 s3/;

    ((table s(c,m(c
    3 2 1
    (s(1,1) s(2,1) s(3,1
    ( s(1,2) s(2,2) s(3,2
    (s(1,3) s(2,3) s(3,3
    (s(3,4

    این جدول آخریه اعدادش بهم میخورررره……

    ستونش از ۱ تا ۴ نوشتم و سطر آخرش هم دو تا صفر داره

    حالا….

    من از جایی که میخوام( S(c ها رو معرفی کنم. گیر کردم . چه کار کنم؟ m رو معرفی کنم؟ چطوری؟

    برای (Seq ( c که خدا بدادم برسه …. اصلا چی بگم….

    میتونید کمکم کنید؟ ممنون میشم.

    شانس من با چه مدلی دارم گمز یاد میگیرم:(

  9. میشه لطف کنین راهنماییم کنید کد زیر چه اشکالی داره که ارور ۱۲۲ رو میده؟
    sets
    j/1,2/
    it/1/;
    sets
    z(it,j)/1.1,1.2/;
    parameter alfa(z)/1.1 1,1.2 1/;

  10. سلام.ممنون از مطالب مفیدتون.اگر بخواهیم به یک متغیر مقدار اولیه بدهیم وبعد در مراحل بعدی با استفاده از معادلات محاسبه شود .باید این مقدار در قسمت معادلات وارد
    شود یا اسکالرها؟مثلا۱۰۰۰= (۱,۱) x

    • سلام
      ممنون.
      به این روش variable initialization میگن. بعد اینکه متغیر رو تعریف کردین. میگین که جناب گمز مقدار این متغیر رو از یانجا شروع کن:

      x.l("1","1")=1000;

  11. با سلام و احترام
    بنده در مدلم پارامترهایی با مقادیر زیر دارم، چگونه می توانم در گمز مدل کنم؟
    i=1,2,3,4
    d(i)
    d1=uniform(10-20)
    d2=uniform(30-40)
    d3=uniform(5-10)
    d4=uniform(7-14)
    نمادها و پارامترها را تعریف کردم در مقداردهی مشکل دارم.
    سوال دوم آیا در جدول می توان مقدار یک پارامتر را به صورت uniform نوشت؟

  12. سلام من کد زیر را نوشتم همش اروز۱۷۰ برای نقض دامنه میده .آخه مشکلش چیه؟؟؟

    set
    i roz ha/1,2,3/ ;
    set
    j doure zamani/1,2,3,4/ ;
    set
    l ostadan/1,2,3/ ;
    set
    M dars ha/1,2,3,4,5,6/ ;
    set
    N kelas ha/1,2/ ;
    parameter a (i,j,l) ademesional /i1.j1.l1 1
    i1.j1.l2 1
    i1.j2.l1 1
    i1.j3.l1 1

  13. سلام ببخشیدیه سوال دیگه داشتم :
    ضرایب تابع هدف رو هم باید در قسمت پارامتر ها بیاریم؟
    مثل ضرایب جریمه که اولویت ایجاد میکنن

  14. با سلام
    من برای تحلیل حساسیت در نرم افزار گمز (کدنویسی به رو عادی)، باید ابعاد مدل را چندین بار بزرگ کنم که چند جدول با اعدادی تصادفی دارم، برای تولید جداولی از اعداد تصادفی بین یک رنج عدد خاص، چه فرمول هایی باید اضافه کرد؟
    با تشکر

  15. با سلام

    ممنون از مطالب عالیتون.

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

    با سپاس

    • سلام
      مرسی لطف دارین
      مث پارامترای دیگه تعریف کنین.

      parameter a(i);

      بعد دیگه در طول کد بلایی که میخواین سرشون بیارین

      • خیلی ممنون از پاسخ سوالی دادین.

        یه سوال دیگه داشتم از خدممتون. من یک مجموعه اندیس j=1…n(p رو دارم که خود n(p با توجه به مقدارp مقادیر متفاوتی میگیرید.
        p/1*2
        n(1)=2
        n(2)=3
        یه بار
        j=1,2
        بار دوم
        j=1,2,3
        که در اینصورت با توجه به مقدار p , اندیس متفاوته. حال به چه صورت باید اندیس j رو تعریف کنم.
        با تشکر

        • سلام
          خب روش زیاده. اگه مدلتون همینقده و تعداد p ها بیشتر نمیشه، شما بهتره که به صورت دستی یه j تعریف کنین و همین j رو به دو بخش j1 و j2 تقسیم کنین و که j1,j2 زیر مجموعه j هستن و یکیشون مقادیر ۱و۲ و یکیشون مقادری ۱ تا ۳ رو میگیره.
          اگه مقادیر p بیشتر بشه، بهتره از دستور شرطی eval استفاده کنین. که نیازمند مقداری مطالعه هست
          سربلند باشید

  16. با عرض سلام و خسته نباشید
    خدمت اعضای محترم سایت تخصصی گمز و تشکر بابت سایت خوبتون
    من یک برنامه گمز دارم که تابع هدفم دو هدفه است و از روش ضرایب وزنی استفاده کرده ام به این صورت

    positive variables

    wc(iter) wight coefficient
    we(iter) wight coefficient ;

    wc.fx(iter)$(ord(iter)eq 0)=0;
    we.fx(iter)$(ord(iter)eq 0)=1;
    wc.fx(iter)$(ord(iter)eq 1)=1;
    we.fx(iter)$(ord(iter)eq 1)=0;

    eq1(iter)..wc(iter)$(ord(iter) eq 2)=e=((wc(iter-1)+wc(iter-2))/2);
    eq2(iter)..we(iter)$(ord(iter) eq 2)=e=((we(iter-1)+we(iter-2))/2);
    eq3(iter)..(wc(iter)+we(iter))=e=1;

    اما نمیدانم که برای تکرارهای بعدی برای ضرایب وزنی جواب منطقی نمیگیرم.
    با تشکر

    • سلام
      ممنون لطف دارین.
      منظورتون از تکرارای بعدی چیه؟ وزنی که تکرار نداره. یه بار یه هدف حساب میشه. دفعه بعد اون یکی. بعد جفتشون با هم

  17. سلام
    ممنون که جواب دادید
    تکرار اول و دوم خودمون به ضرایب وزنی مقدار میدهیم اما برای تکرارهای بعدی برای اینکه مشخص بشه مقدار ضریب وزنی چقدر است از این فرمول ها استفاده می کنیم. برای اینکه نتایج قابل قبول تری بدست بیاند.

  18. سلام جناب محمودی
    در کدی ک نوشتم مدل حل شد، جوابم راضی کننده بود
    ولی بعدش متوجه شدم ک ۲تا از پارامترهام اضافیه و در هیچ جای مدل استفاده نمیشه، پارامترها رو ک حذف کردم،نتونستم از گمز جواب بگیرم، حالا موندم چ کار کنم؟؟ خب اون پارامترای بی استفاده چطور رو مدل تاثیر میذاره؟ پارامتر رو دوباره وارد کد کنم؟؟؟ اینم بگم ک پارامترام بصورت uniformeهستن

      • ممنون از جوابتون
        اروری نمیده، یعنی Normal copletion میشه
        هیچ اروری هم نمیبینم،آخه انگار مدل رو حل میکنه و تمام متغیرها صفر بدست میاد
        البته اینو یادم رفت بگم، تقریبا همه پارامترام توی loop هستن
        جوابم کامل بود و یهو اینجوری شد والا موندم چ کار کنم
        بازم تشکر میکنم

        • پس ظاهرا اینایی که گفتین، ظاهرا یه سری از پارامترا به این پارامترایی که حذف کردین وابسته بودن. الان که حذفشون کردین باید براشون جایگذین پیدا کنین

  19. با سلام و تشکر از سایت خوبتون

    اگر پارامتری که در تابع هدف قرار داره، در دل خودش متغییر تصمیم وجود داره، کجا باید معادله پارامتر رو تعریف کرد؟

    • سلام
      وقتی یه پارامتر به یه متغیر تصمیم وابسته ست، پس خودش متغیره دیگه و باید متغیر تعریف بشه. و باید فرمولی که لازمه به عنوان یه محدودیت نوشته بشه. اگه شرط شما فرقی داره با این قضیه، باید از دستورات شرطی شرط مربوطه رو بنویسین.
      خواهش میکنم مرسی

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

      parameter a(i,j);
      a(i,j)=uniform(10,30);

  20. سلام وقتتون بخیر
    اگر بخوایم یک معادله را فقط به ازای بخشی از اندیس ها تعریف کنیم چطوری میشه؟
    مثال
    فرض کنید یک معادله را میخواهیم تنها به ازای سال های ۱ تا ۵ تعریف کنیم در حالی که اندیس t ( زمان ) از ۱ تا ۲۰ تعریف شده است?

  21. سلام
    چطور میشه پارامتر رو به اندیس تبدیل کرد؟
    می دونم که با ord میشه اندیس رو به پارامتر تبدیل کرد ولی من یه جدول یک ردیفه دارم که می خوام شمارنده ش رو خودم مشخص کنم ، برای این کار یه پارامتر تعریف کردم و مقدار اولیه بهش دادم و بعد در حلقه ای که نوشتم ، این شماره رو یکی زیاد کردم و دوباره تو خودش ریختم ، بعد که می خوام از این مقدار جدید پارامتر به عنوان اندیس استفاده کنم میگه باید set کنم،
    ممکنه راهنمایی کنید

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

  22. cnt = 1;
    loop(i,
    if(a(“1”,i) = 1,
    q(“1”,cnt) = ord(i);
    cnt = cnt + 1;
    );
    );
    این کدی که نوشتم و خطای بالا را داده
    البته اندیس ها و پارامترها را قبلا تعریف کردم

  23. q یک جدولی است که اگر شرط a برای صدق کنه باید با اندیس i پر بشه
    منتهی مساله اینه که برای q نیاز به اندیسی دارم که خودم ترتیب ش رو مشخص کنم

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

  25. بعد یه سوال دیگه
    تو یکی از کامنت های بخش ” مجموعه های دو بعدی” ، شما دستور uel را بجای ord پیشنهاد داده بودید ولی تو اینترنت که من نتونستم چیزی پیدا کنم ، مدل ord هم که ازش استفاده می کنم پیغام میده که این دستور رو نمیشناسه.

  26. سلام
    مجموعه N محدودیت نیست یک مجموعه است باید اول تعریفش کنیم
    چون بعد توی محدودیت ها میخواهیم بگیم مثلا برای هر (I,j ) عضو N
    مرسی که را هنمایی میکنید.

  27. سلام یه سوال داشتم دو تا اندیس s و t توی گمز تعریف کردم حالا میخوام متغیر x(s) را در بازه s<t جمع ببندم این عبارت را می نویسم ایراد میگیره sum((s$(ord(s)<t),x(s))

  28. با سلام و ضمن سپاس از راهنمایی های موثر شما.

    من در حال نوشتن مدلی در گمز هستم که بخشی از پاارمترها به این صورت تعریف میشه:

    parameter v(i,j,k);

    v(i,j,’1′)=uniform(19.44,27.78);
    v(i,j,’2′)=uniform(8.33,16.67);
    v(i,j,’3′)=uniform(2.78,8.33);
    v(i,j,’4′)=uniform(8.33,16.67);
    v(i,j,’5′)=uniform(19.44,27.78);

    parameter g(i,j,k,u);

    g(i,j,k,u)=landa*(k_Eff(u)*N(u)*Vi(u)/v(i,j,k)+M_curb(u)*gamma(u)*alpha+beta(u)*gamma(u)*v(i,j,k)*v(i,j,k));

    ظاهرا تعریف پارامترها به این صورت روی زمان حل مساله بسیار تاثیر داره چون وقتی عدد ثابت به جای پارامتر g قرار می دهم زمان حل مساله به صورت قابل توجهی کاهش پیدا می کنه.

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

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

پاسخ دهید

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