۴۲

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

به عنوان یک برنامه نویس در محیط 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
شماره تماس: ۳۳۲۵-۴۰۵–۰۹۱۹

 

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

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

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

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

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

  5. سلام

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

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

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

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

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

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

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

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

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

  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. سلام . وقت بخیر . قبلا یه برنامه رو برام اصلاح کرده بودید. توی اون برنامه نتونستم ماتریس موردنظرم رو اون طور که می خوام تولید کنم. بنابراین مجبور شدم داده ها رو در مطلب تولید و سپس به صورت فایل اکسل در گمز وارد کنم . مشکل من اینجاست که توی برنامه قبلی می تونستم 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. مگر این که یه جوری قبل از بشه تعریفشون کرد .
    به نظر شما امکان نداره مشکل از اندیس های a2 تا a5 و b1 تا e1 باشه ؟ ولی نمی دونم چطور باید تغییرشون داد

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

  12. سلام

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

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

      min z=x-y+something;

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

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

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

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

پاسخ دهید

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