دستور 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
شماره تماس: ۳۳۲۵-۴۰۵–۰۹۱۹

 

درباره نویسنده

83 دیدگاه

  1. ff

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

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

    1. محمودی

      سلام
      لطف کنید که مشخص کنید که d و s و n متغیر هستند یا پارامتر تا راهنماییتون کنم.
      موفق باشین

  2. قاسمی

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

    1. محمودی

      سلام
      وقتی شما متغیر مذکور رو تعریف کردید از اون خط به بعد 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;
    );

    1. محمودی

      سلام
      کد زیر کمکتون میکنه

      parameter r(p);
      loop(p,
      r(p)=SomeThing ;
      );

  4. MB

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

    parameters

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

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

  5. mb

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

    parameters

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

      1. mb

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

        1. محمودی

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

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

  6. SF

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

    1. محمودی

      سلام
      این سوالی هست که اغلب کاربران گمز باهاش مواجه هستن.
      شما دو تا راه دارین. اول اینکه یه فرمول بنویسین (مثلا چند تا محدودیتش کنین) و این شرایطی که گفتین رو توش لحاظ کنین. تمرین خوبیه واسطون.
      روش دوم هم استفاده از دستور 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
    ممنون میشم اگه راهنماییم کنید

    1. محمودی

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

  8. nr

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

    من دارم یک مدلی رو که برای حرکت 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/;

    1. محمودی

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

  10. bahar

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

    1. محمودی

      سلام
      ممنون.
      به این روش 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 نوشت؟

    1. محمودی

      سلام
      به شکل زیر تعریف کنین:

      D("1")=uniform(10,20);

      سوال دوم. بله میشه

  12. ملیحه

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

  13. ملیحه

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

    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

    1. محمودی

      سلام
      شما وقتی میگید مجموعه i 1 2 3 هست، دیگه مجاز نیستید که تو جداول و پارامترها چیزی مثل i1 رو بزنین، باید همون ۱ رو بذارین، مطالب همین صفحه رو با دقت مطالعه کنین
      موفق باشین

  14. ملیحه

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

  15. شبنم

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

    1. محمودی

      سلام
      از تابع uniform میتونین استفاده کنین. مث uniform(2,4)

  16. nn

    با سلام

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

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

    با سپاس

    1. محمودی

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

      parameter a(i);

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

      1. nn

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

        یه سوال دیگه داشتم از خدممتون. من یک مجموعه اندیس 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 رو تعریف کنم.
        با تشکر

        1. محمودی

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

  17. mazyar

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

    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;

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

    1. محمودی

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

  18. mazyar

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

  19. مینا

    سلام
    برای عدد pi در گمز دستوری وجود دارد؟ یا باید مقدار عددی آن (۳٫۱۴) را قرار دهیم؟
    مرسی

    1. محمودی

      سلام
      کافیه که pi رو استفاده کنین همینجوری که هست. جزو فانکشنای تعریف شده گمزه.

  20. بهمن

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

      1. بهمن

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

        1. محمودی

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

  21. محسن

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

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

    1. محمودی

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

  22. da

    با سلام
    پارامتر با توزیع یکنواخت پیوسته رو چطوری باید نوشت؟
    ممنون!

    1. محمودی

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

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

  23. پیمان

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

    1. سلام
      با دستور ord اینکار انجام پذیر هست.
      t$(ord(t)<۶) این دستور را هم در جمع و هم در ابتدای محدودیت ها می تونید استفاده کنید.

  24. رویا

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

    1. محمودی

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

  25. رویا

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

    1. محمودی

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

  26. رویا

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

  27. رویا

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

  28. رویا

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

    1. مسلم هست که ord نمیشناسه! مدلتونو برای سایت ارسال کنین تا مشکل مدلتونو بررسی کنیم.

  29. آرش

    چگونه میتوان مجموعه ای مانند {N={(I,j)│dij≤s را در گمز کد کرد؟
    بطوریکه d,s پارامترند.
    لطفا راهنمایی بفرمایید… با سپاس

    1. محمودی

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

  30. آرش

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


    1. set i
      / 2
      3
      7
      5 / ;
      set j
      / 1
      2
      3
      4 / ;
      set N(i,j)
      / 2.1
      3.2
      7.3
      5.4 /;

      توی محدودیت ها هر جا خواستین بگین عضو N بنویسین $(N)

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

  32. بهاره

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

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

    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 قرار می دهم زمان حل مساله به صورت قابل توجهی کاهش پیدا می کنه.

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

    1. محمودی

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

  33. عباس

    لطفا در دو سطح مقدماتی و پیشرفته کتابهایی رو در رابطه با آموزش گمز پیشنهاد کنید.(لطفا نام نویسندگان رو هم بیان کنید).

    1. محمودی

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

  34. فرناز

    با سلام و تشکر از زحمات شما

    ببخشید من یک سوال داشتم ، من تو تابع هدف یک همچین رابطه ای دارم sum(s ,fo(s)*h(s)) که h متغیری هست با همچین جوابایی مثلا [۲ ۱ ۰ ۳ ] , (s) f پارامتر میباشد با همچین عددهایی [۱۰ ۲۰ ۳۰ ۱۵] من میخوام که h(s) بزرگتر مساوی دو هستند انتخاب بشن (به عبارتی اگر یک وجود داشت صفرشه) و بعد ضرب در f(s) بشوند یعنی h بشه [۲ ۰ ۰ ۳] , فک میکنم باید شرط بزارم h(s) >=2 ولی هر کاری کردم ج ندادو میشه راهنمایی بفرماییدو واقعا ممنون میشم.

    1. محمودی

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

      h(s)=e=2*y1+3*y2;
      

      اینجوری h فقط میتونه صفر، دو و یا سه و یا ۵ رو بگیره. (اگه ۵ رو نمیخواین بگیره، میتونین شرط بذارین h.up=3 یا اینکه محدودیت بذارین y1+y2<=۱ موفق باشید

      1. فرناز

        با سلام مجدد و بسیار ممنون از پاسختون

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

        1. محمودی

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

  35. گرامی

    سلام خسته نباشید..
    من کد پخش بار dc یک سیستم سه شینرو نوشتم که فقط شین ۳ بار داره پس دستور به صورت load(n) load at bus n /n3 0.85/ در میاد حالا اگر من بخوام این عمل رو برای ۲۴ ساعت انجام بدم، یعنی یک ست k/1*24/ براش مشخص کنم و بخوام تو هر ساعت شین ۳، بار متفاوتی دریافت کنه باید دستور رو به چه صورت بنویسم؟؟

    1. محمودی

      سلام
      متوجه منظور شما نشدم. منظورتون اینه که load(n,t) داشته باشین؟

  36. omid

    با سلام و ادب خدمت شما
    یک پارامتر سه بعدی دارم که حاصل بهینه سازی گمز هستش مثلا P(b,j,t) حال اگه بخوام این پارامتر سه بعدی رو به یک پارامتر دو بعدی مثلا A(L,t) تبدیل کنم چه کار می تونم بکنم؟

    1. محمودی

      سلام
      ارتباط L با سایر اندیسا چیه؟ و اینکه رویه باید مشخص و تشریح بشه.
      معمولا این کارا با loop انجام میشه.

  37. صادق

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

      1. صادق

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

  38. فرزاد

    سلام کد زیر همش ERROR 119 میده
    لطفا راهنماییم کنید.

    * zahra jandaghian
    sets
    EFFL /EFFL1,EFFL2,EFFL3/
    T /I,II,III/
    I /1,2,3/
    J /1,2,3/
    L /A,B,C,D,E,F/
    scalar
    EFFL1 /19/
    EFFL2 /59/
    EFFL3 /152/;
    PARAMETERS
    COST
    /COSTI 0.6
    COSTII 0.2
    COSTIII 1.2/
    CIN1(L)
    / A 1
    B 200
    C 70
    D 49
    E 0
    F 0/
    CIN2(L)
    /A 20
    B 160
    C 0
    D 0
    E 325.7
    F 0/
    CIN3(L)
    /A 5.5
    B 195
    C 234.4
    D 131.25
    E 508.7
    F 164.48/
    COUT1(L)
    /A 89
    B 200
    C 145
    D 110
    E 0
    F 0/
    COUT2(L)
    /A 98
    B 300
    C 100
    D 90
    E 100
    F 62.78/
    COUT3(L)
    /A 99
    B 288
    C 460
    D 298
    E 169.2
    F 117.3/
    RI(L)
    /A 0.66
    B 0
    C 0.65
    D 0.65
    E 0
    F 0/
    RII(L)
    /A 0.6
    B 0.7
    C 0.65
    D 0.66
    E 0.36
    F 0.65/
    RIII(L)
    /A 0.7
    B 0.72
    C 0.7
    D 0.7
    E 0.42
    F 0.65/;
    VARIABLES
    FI1
    FI2
    FI3
    FII1
    FII2
    FII3
    FIII1
    FIII2
    FIII3
    FO1
    FO2
    FO3
    WI
    WII
    WIII
    CINI(L)
    CINII(L)
    CINIII(L)
    TFLOW
    XI I
    XI II
    XI III
    XII I
    XII II
    XII III
    XIII I
    XIII II
    XIII III
    Positive variable
    FI1,FI2,FI3,FII1,FII2,FII3,FIII1,FIII2,FIII3,XI I,XI II,XI III,XII I,XII II,XII III,XIII I,XIII II,XIII III,FO1,FO2,FO3,WI,WII,WIII,CINI(L),CINII(L),CINIII(L);
    FI1.L=0;
    FI2.L=0;
    FI3.L=0;
    FII1.L=EFFL1;
    FII2.L=EFFL2;
    FII3.L=EFFL3;
    FIII1.L=0;
    FIII2.L=0;
    FIII3.L=0;
    FO1.L=0;
    FO2.L=0;
    FO3.L=0;
    *XI I.L=0;
    *XII II.L=0;
    *XIII III.L=0;
    WI.L=0;
    WII.L=0;
    WIII.L=0;
    CINI.L(L)=0;
    CINII.L(L)=0;
    CINIII.L(L)=0;
    EQUATIONS
    OBJFUNC
    CINLETI(L)
    CINLETII(L)
    CINLETIII(L)
    COUTLET(L)
    OBJFUNC TFLOW=E=FI1*COSTI+FI2*COSTI+FI3*COSTI+FII1*COSTII+FII2*COSTII+FII3*COSTII+FIII1*COSTIII+FIII2*COSTIII+FIII3*COSTIII+XI1*COSTI+XII1*COSTII+XIII1*COSTIII+XI2*COSTI+XII2*COSTII+XIII2*COSTIII+XI3*COST1+XII2*COSTII+XIII3*COSTIII;
    CINLETI(L).. =E=FI1*(CINI(L)-CIN1(L))+FI2*(CINI(L)-CIN2(L))+FI3*(CINI(L)-CIN3(L))+XI II*(CINI(L)-(1-RII(L))*CINII(L))+XI III*(CINI(L)-(1-RIII(L))*CINIII(L))=E=0;
    CINLETII(L) FII1*(CINII(L)-CIN1(L))+FII2*(CINII(L)-CIN2(L))+FII3*(CINII(L)-CIN3(L))+XII I*(CINII(K)-(1-RI(L))*CINI(K))+XII III*(CINII(L)-(1-RIII(L))*CINI(L))=E=0;
    CINLETIII(L) FIII1*(CINII(L)-CIN1(L))+FIII2*(CINII(L)-CIN2(L))+FIII3*(CINII(L)-CIN3(L))+XIII I*(CINIII(L)-(1-RI(L))*CINI(L))+XIII II*(CINIII(L)-(1-RII(L))*CINII(L))=E=0;
    COUTLET(L) FO1*(CIN1(L)-COUT1(L))+FO2*(CIN2(L)-COUT2(L))+FO3*(CIN3(L)-COUT3(L))+WI*((1-RI(L))*CINI(L)-COUT1(L))+WII*((1-RII(L))*CINII(L)-COUT2(L))+WIII*((1-RIII(L))*CINIII(L)-COUT3(L))=L=0;
    MODEL M /ALL/;
    SOLVE M USING NLP MINIMIZING TFLOW;
    DISPLAY FI1.L ,FI2.L ,FI3.L ,FII1.L ,FII2.L,FII3.L,FIII1.L,FIII2.L,FIII3.L,XII I.L,XII III.L,XI II.L,XI III.L,XIII I.L,XIII II.L,FO1.L,FO2.L,FO3.L,WI.L,WII.L,WIII.L,CINIII.L,CINII.L,CINI.L;
    

دیدگاهی دارید؟