واردن کردن داده های مسئله

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

وقتی به GAMS دستور می دهید که پس از حل مدل، مقدار فلان متغییر را به من نشان بده، GAMS دقیقاً این عمل را انجام خواهد داد. این متغییر ابتدا باید توسط شما به عنوان متغییر به نرم افزار فهمانده شده باشد. اگر اندیسی دارد، مجموعه ای که این اندیس را شامل می شود (و دامنه تغییرات آن) نیز از قبل باید تعریف شده باشد.
یا مثلاً وقتی در مدلتان پارامتری به نام مثلاً a دارید و می خواهید از آن در کد نویسی استفاده کنید، این پارامتر نیز باید به GAMS فهمانده شود. توجه داشته باشید که این طبیعت و زبان کامپیوتر است که شما باید خو را با آن تطبیق دهید و نه اینکه زبان خود را آن طور که فرا گرفته اید، در مکالمه با کامپیوتر نیز از آن استفاده کنید. حال فرض کنید که این پارامتر اندیسی نیز دارد. جهت وارد کردن این پارامتر در نرم افزار ابتدا باید مجموعه ی مربوط به اندیس را تعریف کرده باشد.
مثالی دیگر تعریف معادلات شما می باشد. اگر مدلی دارید که در آن تعدادی معادله یا نامعادله مانند یک مدل بهینه سازی دارای تابع هدف و تعدادی محدودیت وجود دارد، شما باید برای هر کدام از معادلات اسمی انتخاب کنید و به GAMS دستور دهید که چه عملی روی آن انجام دهد.
با توجه به مثال های فوق، در کد نویسی در محیط GAMS جهت وارد کردن داده های مختلف از مجموعه ها (Sets)، تعاریف، پارامترها (Parameters)، متغیرها (Variables) و … استفاده می شود. این عمل را Data Entry می نامند.
یک دسته بندی کلی برای وراد کردن داده ها می تواند به صورت زیر باشد:
تعریف مجموعه ها: این تعاریف با دستورات Set، Alias تعریف و مشابه سازی می شوند.
تعریف پارامترها: توسط دستوراتی مانند Parameter، Table، Scalar و همچنین اعمالی مانند Interface انجام می پذیرد.
تعریف متغیرها: متغییرها را می توان توسط توسط دستوراتی مانند Variable, Positive Variable, Binary Variable و … تعریف نمود.

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

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

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

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

 

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

56 دیدگاه

  1. امیر

    باسلام.اگربخایم یه مسئله عمومی تعریف کنیم چیکار باید کرد.مثلا iاز۱تاm?وهمچنین برای دستور حذف زیرتور چ کدی لازم هستش؟ممنون میشم از راهنماییتون

  2. Fatemeh

    سلام
    باتشکر از سایت خوبتون
    من توی پارامترهام M دارم که به معنی عدد خیلی بزرگه…و باید به این پارامتر بزرگترین عدد ممکن رو بدم چون توی کاهش زمان حل خیلی تاثیر داره….شما نمیدونید بزرگترین عدد ممکن که میشه وارد گمز کرد چنده؟
    مرسی

    1. محمودی

      سلام
      لطفا مقداری در مورد محدودیتتون و همچنین متغیرهایی که توش دخیلن صحبت کنین

  3. shayan

    سلام من یه مدل MILP اجرا می کنم با این که گپ به صفر می رسه ولی مدل متوقف نمیشه و ادامه میده علتش را می دانید؟

    1. محمودی

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

  4. amin

    سلام و خسته نباشید
    برای یک مجموعه alias(k,m) که هردوتا میخواین تو یک دستور شرطی از یک زیر مجموعه استفاده کنند چیکار میتونیم بکنیم مثلا
    )Smin (k be sharte i va m be sharte i

    1. محمودی

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

  5. Fatemeh

    سلام

    خیلی ممنون از سایت خوبتون

    من میخام کد گمزم از یک جواب اولیه شروع کنه…ایا میشه همچین کاری کرد؟ ممنون میشم راهنماییم کنید.

    1. سلام منظورتون اینه برای یک سایز مساله حل کنید و سایز مساله رو زیاد کنید ؟ یا اینکه داده هاییو در نظر بگیرین و تغییر داده بدین ؟ برای هر دو صورت میشه ! اگه منظورتون دو صورتی که گفتم نیست بیشتر توضیح بدین.

  6. Fatemeh

    منظورم مثل الگوریتم های فراابتکاری که با جواب اولیه شروع میشند.

    مثلا گمز بیاد از یک جواب اولیه برای متغیرهای مسئله شروع کنه و جواب رو بهبود بده..چطوری میشه اینکارو کرد؟…مرسی

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

      1. Fatemeh

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

        1. من تاحالا انجام ندادم و تاحالا ندیدم !! ولی شاید بشه ولی کار زمان نریه !! توی متلب میشه با فراخوانی خیلی راحت همه چیزو به هم ربط داد ! ولی الگوریتم بخوای توی گمز بنویسی کار سخت و زمان بر میشه ! چون توی این زمینه کار با متلب راحت تره به نظرم بهتره وقت نزاری!!

        2. محمودی

          سلام
          احتمالا منظور شما جواب اولیه هست یا همون initial solve. شما براش دو راه دارین. یکی اینکه بیاین از دستور variable.fx استفاده کنین که این واسه زمانیه که شما به طور قطع میدونین که مدل شما جواب متغیر x رو مثلا ۱۰ میده. واسه همین میزنین x.fx=10 .
          اگه ندونین دقیقش چنده ولی حدودی بدونین چه مقداری میگیره، مثلا حدودا ۱۰ میشه، باید بزنین x.l=10 . اینجوری گمز سعی میکنه با همین جواب اولیه که بهش دادین بهتر و سرعتر به جواب برسه.
          مبحث متغیرها هم میتونه براتون مفید باشه.

        3. Fatemeh

          بله من جوابمو گرفتم…..خیلی ممنونم

  7. رضا

    سلام و خسته نباشید
    چطور میتونم محدودیت y(i,j)-x(j)>0 که به ازای همه i ها است رو در شرط if تعریف کنم؟
    if (y(i,j)-x(j)>0,؟؟؟؟؟؟
    و نامساوی در گمز چطور نشون داده میشه؟
    تشکر

  8. آرش

    باسلام و خسته نباشید
    ببخشید یه مجموعه دارم میخوام بدونم چطور تو مدلم کدش کنم
    VA={(i,j);if l≠j then d_ij+d_jl<b ,otherwise d_ij<b}

    چون بعد در محدودیت ها لازمه که ذکر کنیم برای هر (i,j) عضو VA .
    بخاطر همین قبلش نیازه که این مجموعه تعریف شود.
    مرسی

  9. 7748

    سلام . وقت بخیر . قبلا یه برنامه رو برام اصلاح کرده بودید. توی اون برنامه نتونستم ماتریس موردنظرم رو اون طور که می خوام تولید کنم. بنابراین مجبور شدم داده ها رو در مطلب تولید و سپس به صورت فایل اکسل در گمز وارد کنم . مشکل من اینجاست که توی برنامه قبلی می تونستم i, j رو alias کنم. اما توی برنامه جدید نمیشه این کار رو انجام داد و به همین خاطر در تعریف توابع به مشکل برمی خورم. اگه بتونم یه جوری i,j رو alias کنم تمام مشکل برنامه حل میشه . نمی دونم چرا نمیشه این کار رو کرد. اگه کمکم کنید ممنون میشم.
    توی برنامه زیر دو تا ماتریس Q, G رو از اکسل فرا خوانی می کنه …

    set i /
    $call =xls2gms r=a2:a5 i=filename.xls o=set100.inc
    $include set100.inc
    /;
    set j /
    $call =xls2gms r=b1:e1 s=”,” i=filename.xls o=set101.inc
    $include set101.inc
    /;

    table Q(i,j) asdfg
    $call =xls2gms r=A1:D4 i=filename.xls o=qwer.inc
    $include qwer.inc
    ;
    table G(i,j) asdfg
    $call =xls2gms r=A1:D4 i=filename2.xls o=kll.inc
    $include kll.inc
    ;
    alias (i,j);

  10. 7748

    نمیشه . چون i,j ای قبل از این تعریف نشده که بخواد alias بشه . i , j رو به عنوان اندیس از اکسل فراخوانی می کنه

    1. محمودی

      سلام
      خب وقتی هم i و هم J رو از اکسل بخونه که نمیتونه آلیاس کنه. باید یکی رو بخونه و اون یکی رو بهش الیاس کنین

  11. 7748

    نمیشه . چون i,j ای قبل از این تعریف نشده که بخواد alias بشه .

  12. 7748

    مگر این که یه جوری قبل از بشه تعریفشون کرد .
    به نظر شما امکان نداره مشکل از اندیس های a2 تا a5 و b1 تا e1 باشه ؟ ولی نمی دونم چطور باید تغییرشون داد

    1. محمودی

      قبل از شروع table q و بعد از اتمام دستور set i میتونین آلیاس کنین.

  13. 7748

    همه این کارا رو کردم اما نشد . فکر می کنم مشکل از خود تعریف i , j باشه . شاید اسم گذاری خونه های ماتریس موجود در اکسل رو باید عوض کرد…..

    1. محمودی

      سلام
      خب display کنین، ببینید چی رو نشون میده. ضمنا لطفا به همون سوالات ریپلای کنین، اینجوری کسی که نظرات رو بخونه نمیدونه چی مربوط به چی هست. مرسی

      1. 7748

        سلام باشه حتما….
        display کردم دقیقا عین هم می یان . ولی بازم alias نمیشن. میشه بی زحمت شما یه بار برنامه ای رو که گذاشتم تو گمز اجرا کنین؟؟

        1. محمودی

          ممنون.
          کد و فایل اکسل رو بفرستین به ایمیل سایت لطفا

        2. 7748

          سلام
          خیلی خیلی ممنون. کمکتون مشکل برنامم رو حل کرد. متشکرم….

  14. سبحان

    سلام

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

    1. محمودی

      سلام
      مقداری به جهت تابع هدف شما بستگی داره. و اینکه شما میخواین کمینه کنین یا بیشینه. البته اگه این دو عبارت مجهول نیستن (یعنی پارامتر هستن) اینا لازم نیست و ساده میتونین شرطی بنویسین.
      یه مثال میتونه اینجوری باشه که: فرض کنیم x,y دو عبارت شما باشن. و تابع هدف شما این شکلی باشه (مینیمم بشه هدف):

      min z=x-y+something;

      اگه یه w تعریف کنیم که متغیر بزرگتر مساوی صفر باشه، به شکل زیر دو محدودیت زیر میتونن نوشته بشن و w تو تابع هدف جایگزین بشه:

      min z=w+something
      w>=x-y
      w>=0

  15. محدثه

    سلام وقتتون بخیر
    من داده ها و مجموعه های مدلمو تو اکسل وارد کردم. خوشبختانه تمام پارامترهای دوبعدی و سه بعدی و چهاربعدی رو میخونه اما وقتی یه پارامتر ۱ بعدی مثل L(i) وارد میکنم گمز ارور ۱۴۱ میده. حتی رعایت میکنم که از دستور parameter استفاده کنم نه دستور table. میخواستم بدونم پارامتر ۱ بعدی رو باید چجوری تو اکسل وارد کنم؟
    مشکلش کجاست؟
    خیلی خیلی ممنونم بابت اطلاعات خوبی که در اختیار بقیه قرار میدید.

    1. محمودی

      سلام
      تشکر.
      از این کد استفاده کنین:

      set i /i1*i10/
      parameter v(i)
      $CALL GDXXRW.EXE temp.xlsx par=v rng=sheet1!a1 rdim=1
      $GDXIN temp.gdx
      $LOADDC v
      $GDXIN

      1. محدثه

        ممنون
        میشه دستور xls2gms و طریقه وارد کردن پارامتر ۱ بعدی تو اکسل رو بگین؟

  16. احمد

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

  17. ن ر

    سلام. خسته نباشید. همونطور که می دونید در matlab و در مورد مثلا مسایل چند هدفه اگه بخواهیم از مجموع وزنی استفاده کنیم میشه مقدار بهینه تابع هدف رو از یک ام_فایل دیگه فراخوانی کرد و بعد محاسبات رو ادامه داد. ممکنه بگید توی گمز هم اینکار ممکنه؟ یعنی میشه بین فایلهای گمز لینک برقرار کرد؟ ممنون

  18. kk

    با عرض سلام و تبریک سال نو خدمت شما
    ممنون میشم اگر من رو راهنمایی بفرمایید.
    یک جدول رو در گمز طراحی کردم اما حالا باید آن را در اکسل بنویسم و فراخوانی کنم…
    سه مجموعه داده iو jو k دارم و جدول گمز به صورت (table(i,j,k هست که i سطر جدول و (j,k) ستون جدول هستند.
    در دستوراتی که مینویسم مدام با خطا در خواندن فایل مواجه میشم. بسیار سپاسگزارم.

    جدول به صورت زیر هست

    Table lambda(i,j,k)
    j1.k1 j2.k2 j3.k2 j4.k3 j5.k1 j6.k3 j7.k3
    i1 0 1 1 0 0 1 1
    i2 0 0 0 0 1 0 0
    i3 1 0 1 1 0 0 0
    i4 1 0 1 0 0 1 1
    i5 0 1 0 1 1 0 0
    i6 1 1 0 1 1 0 1;
    
    1. محمودی

      سلام
      از دستور $call gdxxrw استفاده کنین. توی کانال تلگرام یه فیلم اموزشی کوتاه گذاشتیم. چک کنین.

  19. kk

    ممنون از پاسخ شما…از فیلم آموزشی استفاده کردم….اشکالی که وجود داره این هست که فایل gdx تولید میشه و من در گمز بازش میکنم اما در ادامه کد بارگزاری نمیشه و خطای زیر رو میده:
    no such file or directory

    1. محمودی

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

        1. kk

          سلام
          خیر آقای مهندس. پاسخی دریافت نکردم.

        2. محمودی

          بله ببخشید.
          کد رو دیدم و درست نوشته شده، شما کافیه که علامت سیمیکالون ; رو بعد از gdxin وردارین. مشکل حل میشه.

  20. سارا

    با سلام و تشکر از سایت بسیار مفیدتان.
    من یک سوالی دارم
    من متغیری به اسم x(s,t) تعریف کردم که s از ۱ تا ۴ و t از یک تا ۳ هستش.
    الان میخوام بگم در کلیه s ها، مقدار x در t=3 مثلا برابر ۱۰ هستش.
    میشه بگین چه جوری بنویسم؟
    به شکل زیر نوشتم منتهی ارور دارم
    x.fx(‘t3’)=10;

  21. سارا

    با سلام
    آیا امکان اصلاح کد رو دارین؟
    من کدی نوشتم میخام مشکا کارم رو پیدا کنم نمیتونم
    امکان برای ما هست؟

    1. سارا

      به این دلیل نیاز دارم که من یه OPF-dc طبق کتاب جناب دکتر سرودی و کدهای موجود نوشتم ولی با تغییر دادن شبکه ام و تعداد باس ها به جواب infeasible میرسم

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