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

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

دستورات نهایی به چهار بخش اصلی تقسیم میشوند:

  • دستورات مربوط به نام گذاری مدل
  • دستورات مربوط به تعیین نوع حل کننده
  • دستورات مربوط به حل مدل
  • دستورات مربوط به زیبا سازی خروجی های مدل


به طور خلاصه، هر مدلی که شما می نویسید، که شامل یک سری معادله و نامعادله، تابع هدف و محدودیت است، باید اسمی برایش تعریف کنید. یک مدل که برایش اسم تعریف کرده اید باید به نرم افزار بگویید که به چه حل کننده ای (cplex, lingo, baron و…) باید حل بشود. یک مدل باید مشخص شود که از نوع بیشینه سازی است یا کمینه سازی. یک کاربر در صورتی که ویژگی های خواص، یا اطلاعات خواص نظیر مقدار بهینه ی فلان متغیر پس از حل مدل را بخواهد باید قبل از run کردن مدل، کد مربوط به این تغییرات را وارد محیط GAMS کند.

دستورات نهایی مدل همانند سایر دستوراتی که به عنوان حیاتی معرفی شدند باید در مدل استفاده شوند.

در این بخش سه زیر مجموعه با نام های دستور solve، دستورات model،انتخاب نوع solver، سفرشی سازی خروجی مورد بحث قرار می گیرند که در صورت علاقه مند بودن، مخاطب می تواند به این بخش ها مراجعه نماید.

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

با تشکر
مدیریت سایت gamsbook.ir
ایمیل: support@gamsbook.ir
تلفن تماس: ۳۳۲۵-۴۰۵-۰۹۱۹

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

30 دیدگاه

  1. 7748

    سلام . وقت بخیر . من یه برنامه نوشتم که خطاش برطرف شده اما خروجی رو همش صفر میده. چطور باید بفهمم کدوم خط برنامه مشکل داره؟ آیا برای این کار دستوری وجود داره ؟

    1. محمودی

      سلام
      مسئله نشدنی شده، یا جواب بیکران داره و یا لایسنس ندارین. چک کنین تو process window چی نوشته

      1. 7748

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

  2. 7748

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

    1. محمودی

      سلام
      خواهش میکنم. یه پارامتر مث gamamin1 تعریف کنین و مقدار بهینه gamamin.l رو بریزین توش.

  3. 7748

    یه سوالی برام پیش اومده .شما توی برنامه اسمی از testdataQ نیاوردین و فقط testdataG رو تعریف کردین . چطور برنامه هر دو ماتریس رو می شناسه ؟؟؟ و با اینکه من testdataQ رو از دایرکتری پاک می کنم ولی بازم testdataQ رو به عنوان ورودی می شناسه ….

    1. محمودی

      سلام
      دو تا sheet1,sheet2 رو ببینید. و نحوه ادرس دهی بهشون

  4. نیما

    سلام
    یه کد تو گمز نوشتم که داده های خروجی مدل رو میبره به اکسل که در زیر این کد رو برتون مینویسم:

    execute_unload 'openshopScheduling.gdx'
    

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

    1. محمودی

      سلام
      اینجوری شما فقط ریختین تو gdx، باید بعد اون هم بریزین تو xls

    1. محمودی

      مثلا:

      Execute_Unload "my.gdx" makespan,QQ,rrr,xx,yy;
      Execute 'GDXXRW.EXE my.gdx O=my.xls par=makespan rng=makespan!a1 par=QQ rng=QQ!a1
      
      1. Darvishi

        سلام وقتتون بخیر. سوالی در مورد این کد داشتم. در مدل من متغیرهای تصمیم ۴ یا ۵بعدی وجود دارد و میخواهم جواب متغرها پس از حل گمس در اکسل نمایش داده شود. خواستم ببینم چه تغییری باید در این کد ایجاد شود. ممنون میشم جواب بدید.

        1. محمودی

          سلام
          تغییری نیاز نیست.
          فقط دقت کنی که وقتی متغیر رو بخواین بفرستین به اکسل، به جای Par باید بنویسین var. همین

  5. نیما

    ببخشید اینجا O=my.xls باید O رو هم تعریف بکنیم اگه تعریف بکنیم چجوری باید این کار رو بکنیم یکی هم اینکه این قسمت چی هستش par=makespan rng=makespan!a1 par=QQ rng=QQ!a1 ؟؟؟ متوجه نشدم!

    1. محمودی

      شما ادرس رو با my.xls بهش دادین. این QQ یه پارامتره و makespan هم همینطور. اینا رو میریزه تو اکسل برامون. اینا فقط مثاله و دستور ثابت نیستا.

  6. نیما
    execute_unload "openshopScheduling.gdx"  Cmax, St, C, F, X, Y, Z, T, V ;
    

    این openshopScheduling اسم مدل من هستش و اینا هم متغیرها هستن میخام این متغیرهای خروجی رو تو اکسل نشون بده
    کلا اینو نوشتم :

    execute "GDXXRW.EXE openshopScheduling.gdx O=openshopScheduling.xls"  par=Cmax  rng=Cmax!a1  par=St rng=St!a1 ...
    

    با سپاس

    1. محمودی

      لطفا فقط به همون گفتگویی که داشتیم ریپلای کنین! من نمیدونم چرا همش این رو باید تکرار کنم برا بچه ها.
      نمادها رو جاشون رو عوض نکنین.

      Execute 'GDXXRW.EXE    ---- ----'
      
  7. علی

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

    1. محمودی

      سلام
      کد زیر رو قبل از دستور سالو بذارین:

      option limrow=100;
      

      100 یعنی تعداد تکرارها

  8. مجید

    باسلام وعرض ادب و احترام مهندس محمودی دو سوال داشتم: دستور option limrow=1e6 و $call gdxxrw out.gdx var=Pexcess rng=Pexcess!a1 چه کاربردی دارند. بسیار سپاسگزارم.

    1. محمودی

      سلام
      دستور limrow یعنی اینکه به گمز دستور میدیم که وقتی که مدل رو حل کرد، تو خروجی فایل lst تعداد محدودیت هایی رو که قراره باز بشن برابر ۱۰ به توان ۶ بذاره. یعنی تو بخش equation که تو lst میاد، محدودیتهای بسط داده شده به تعدادی که گفته شد نمایش داده میشن.

  9. مجید

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

    1. محمودی

      سلام
      شما که این دو تا رو به هم وصل کردین بیشتر کارتون انجام شده. و قطعا دنبال راه ساده تر هستین. دو سه تا کار خوب میتونین انجام بدین. یکی اینکه خروجی که از گمز گرفته میشه، مستقیم به اکسل فرستاده بشه و اونجا با توجه به اینکه ساده تر هست نمایشش میتونین به راحتی با برنامه ای که میخواین ارتباط برقرار کنین.
      راه دیگه اینه که یه parameter به نام مثلا Result(f,*,*) تعریف کنین. که f یه اندیس هست و تعداد سیمبل هایی که قراره ذخیره بشن رو شامل بشه. یعنی مثلا x(i و y(i,j و z که متغیر های ما هستن. ستاره هم برای این اومده که هر جا خواستیم هر اندیسی رو استفاده می کنیم. مثال زیر رو ببینین (مثال زیر ممکنه خوب نوشته نشده باشه ولی دید خوبی بهتون میده):

      sets
      f/1*3/
      ;
      parameter results(f,i,j);
      result('1',i,*)=x.l(j);
      result('2',i,j)=y.l(i,j);
      result('3',*,*)=z.l;
      

      قطعا کد بالا مشکل داره. ولی شما می تونین بهترش کنین.
      راه دیگه اینه که از دستور put,file استقاده کنین و یه فایل طراحی کنین. روش خوبی هم هست.

  10. مجید

    با سلام و تشکر فراوان
    راه حل تعریف پارامتر دقیقا راهی بود که به دنبالش بودم. بعد ا ز دستور solve پارامتر رو تعریف و نتیجه جمع و ضرب متغیرها و محاسبات رو در اون ریختم و بعد در سی شارپ فقط از اون پارامترها استفاده می کنم.
    یک سوال دیگه دارم:
    با توجه به اینکه این قسمت بعد از دستور solve هست؛ می خواستم مطمئن بشم که این کار هیچ تاثیری با قسمت قبل از solve نداشته باشه. بعبارتی آیا این کار تاثیری در حل مساله دارد یا خیر؟ ( هم جواب مساله و هم زمان حل)

  11. مجید

    سلام
    چطور می تونم یک پارامتر از تنوع string داشته باشم و خروجی مورد نظرم رو که ترکیب چند عبارت، پارامتر و متغیر است بصورت متن(رشته) دلخواه بسازم و در اون ذخیره کنم؟
    ممنون

    1. محمودی

      سلام
      با دستور put میتونین رشته تولید کنین. کافیه ادرس دهیتون دقیق باشه.

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