خروجی های نرم افزار

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

در این فصل به تشریح خروجی های استاندارد، خطاهای متداول و بهبود خروجی GAMS مورد بحث قرار خواهند گرفت.
مثال کاربردی ۱ -که قبلاً کد نویسی کردیم- را در نظر بگیرید. این مدل کاملاً آماده ی حل و گرفتن نتایج حاصله می باشد. برای حل یک مدل چند مسیر عمومی وجود دارد که نهایتاً نتیجه ی یکسانی خواهند داشت. ۱- به منوی File/Run می رویم. ۲- دکمه ی F9 را فشار می دهیم. ۳- در روش سوم طبق شکل زیر در قسمت Command Line دستور ساده ی gams example1 را تایپ می کنیم.

how-to-run

۳- روش سوم که بسیار متداول تر می باشد، استفاده از دکمه ی Run که در شکل زیر نشان داده شده است می باشد.

how-to-run-2

مدل را Run کنید. پس از Run کردن مدل، بلافاصله پنجره ی پویای Proccess Window باز خواهد شد. این پنجره فرآیند کد خوانی GAMS، پیشرفت مرحله به مرحله ی حل مدل، فازهای مختلف آن، زمان شروع و زمان پایانِ حل مسئله، میزان Gap و کران های بالا و پایین، Errorهای احتمالی و اطلاعات لحظه ای این فرآیند را نشان می دهد. در این پنجره Error ها با رنگ قرمز و موقعیت ها و شرایط مهم به هنگام حل مدل (بعضا تغییر در رویه ها و نتیجه گیری های مختلف توسط GAMS و…) با رنگ آبی نشان داده می شوند. با دبل کلیک روی سطر قرمز به سطر مربوط به خطا در کد نوشته شده(یا مکان نما در فایل lst) خواهیم رفت. همچنین با دبل کلیک روی سطر آبی به زیر فرآیند مربوطه در فایل lst خواهیم رفت. توجه شود که Error ها در همین فصل به طور کامل و کاربردی، مورد بحث و گفتگو قرار خواهند گرفت و در صورت مشاهده ی هر گونه خطا در برنامه ی خود به این بخش مراجعه کنید.

process-window

به علاوه Process window دو کلید و دو گزینه نیز دارد.
Summary only : در صورت زدن تیک این گزینه ، تنها خطوط با رنگ آبی یا قرمز و خطوطی که با (—-) شروع شده اند نمایش داده می شوند. به این ترتیب تعداد خطوط نمایش داده شده، کم خواهند شد.
Update : در صورت زدن تیک این گزینه ، همزمان که فرایندِ حل پیشرفت می کند کاربر قادر خواهد بود بدون scroll کردن، آخرین گزارش اجرایی را همزمان با پیشرفت حل مدل ببیند. اگر این تیک برداشته شود، تنها با scroll کردن می توان سطور مختلف این پنجره را مشاهده نمود.
Stop : با زدن این دکمه، تمامی فرایند حل مدل قطع خواهد شد. اگر مدل کاملاً حل شده باشد، دکمه stop به open log تبدیل خواهد شد.
شایان ذکر است که همزمان با حل مدل، سه فایل دیگر همنام با فایل example1.exe ولی با فرمت های متفاوت شامل، .log و .lxi و .lst در دایرکتوری GAMS -که شامل خروجی های GAMS می باشند- تولید می شوند.
یک log file ، فایلی با فرمت (.log) می باشد (در مثال مورد بررسی ما example1.log) که بلافاصله پس از Run کردن مدل در دایرکتوری GAMS تولید می شود. در واقع یک log file همان اطلاعات موجود در process window است که به صورت ایستا برای زخیره سازی و استفاده ی مجدد تعریف شده است. این فایل با استفاده از برنامه های editor (مانند notepad) نیز قابل خواندن می باشد.
یک lxi :
یک فایل lst اصلی ترین خروجی در نرم افزار GAMS می باشد. این خروجی به طور کامل در بخش بعد تحت عنوان خروجی استاندارد تشریح خواهد شد.



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

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

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

 

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

161 دیدگاه

  1. SF

    سلام ببخشید که مزاحم میشم. من مدلمو تو GAMS نوشتم و Run کردم. مدل به صورت MINLP هست. تو روند حل تا Iteration آخر مینویسه OPT و مقدار تابع هدف منطقی و ثابت هست اما تو آخرین تکرار مینویسه No feasible و مقدار تابع را صفر قرار میده. برای یه مثال کوچیکتر جواب داده و مدل شدنی بوده. می خواستم اگه بشه راهنماییم کنید که چرا جواب نمیده؟ و اینکه ممکنه به خاطر تعداد بالای تکرار باشه و اگه آره میشه جوری تنظیم کرد که در سطح پایین تری متوقف شه؟
    زمان Run حدودا بیست دقیقه ست و Solver استفاده شده Bonmin هست

    1. محمودی

      سلام
      این جوابی که داده به خاطر نشدنی بودن مسئله شما هست احتمالا. مدل رو بررسی مجدد کنید.
      بله میشه حتی زمان رو gap رو محدود کرد.
      واسه شرط توقف زمانی از دستور reslim
      و برای توقف از نظر gap: از دستور optcr استفاده کنین.
      مثال:

      option reslim=3600;
      option optcr=0;

      من توصیه م انه که از baron هم استفاده کنین.

  2. AT

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

    1. محمودی

      سلام
      وقتی گمز متوقف شد، زمانی را به شما می دهد. این زمان را در execution time می بینید.
      خواهش میکنم

  3. AT

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

    1. وحید

      با سلام، برای تعیین تعداد اعشار در خروجی میشه کمک کنیم، از دستور options decimal=n استفاده کردم جواب نداد، میشه راهنمایی بفرمایید. ممنون

  4. محدثه

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

    1. MOHSEN

      با سلام
      فکر کنم این راه جواب شما رو بده
      Table x(J,i) “Data for Input”
      $include “inPUT.txt”;
      باید اسم فایل داده شما input باشه .ابتدا جدول رو تعریف کنین بعد از دستور $include استفاده کنین

  5. فاطمه

    سلام

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

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

    باتشکر

    1. محمودی

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

  6. 7748

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

    دوم اینکه چطور می تونم زمان اجرای برنامه رو با دستور display نشون بدم؟؟

    1. محمودی

      سلام
      سوال اولو دقیقا متوجه نشدم. ولی احتمالا منظورش اینه که همین محدودیتی برقرار نمیشه.
      سوال دوم: modelname.resusd

  7. 7748

    سلام . آیا توی گمز دستوری وجود داره که زمان اجرای چند خط از برنامه رو نشون بده؟
    مثلا برای ماتریس Q می خوام مقدار زیر رو حساب کنم و سپس زمان محاسبه ش رو بهم نشون بده
    A1(i)=sum(j,Q(i,j));
    A(i)=A1(i)+c(i);
    M=smax(i,A(i));

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

      scalar starttime; starttime = jnow;
      YOURCODE
      scalar elapsed; elapsed = (jnow - starttime)*24*3600;
      display elapsed;

      1. 7748

        ممنون از پاسختون.
        یه سوال دیگه
        چند تا مدل نوشتم که همشون از روش LP و یکیشون از روش MIQCP حل میشه. جواب بهینه مسائل LP رو میده اما جواب بهینه مسأله MIQCP رو صفر میده. دلیلش چی هست؟

        1. محمودی

          سلام
          فضای شدنی همه یکی هست؟ یعنی این Lp ها و این MIQCP دقیق داده ها و محدودیت های مشترکی دارن یا خیر؟

        2. 7748

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

        3. محمودی

          محدودیت مشترک نباشه تضمینی نیست که جوابا یکی باشه. ممکنه از لایسنس هم باشه. چند خط آخر process window رو مشاهده کنین.

  8. ن ر

    سلام و خسته نباشید. ممکنه ببینین سوال من راه حلش چیه؟
    من یک مساله نمونه با ابعاد بزرگ رو می خوام با بارون حل کنم. تو نمونه های کوچیک حواب می ده ولی در حالت بزرگ، وقتی reslim رو مثلا ۷۰۰۰ میزارم روی حدود یکساعت نرم افزار خود به خود قطع میشه و پیام stop workingمیده. برای چک کردن قدرت کامپیوتر مدل رو خطی و ساده تر کردم و با سیپلکس حل کردم تا حدود سه ساعت هم مشکلی پیش نیومد. به نطرتون چه باید کرد؟

    1. محمودی

      سلام
      اروری که داد ارور گمز بود یا از این خطاهایی که ویندوز میده رو داده بود؟
      بله این مشکل پیش میاد بعضی وقتا. پیشنهاد من اینه که از لیندو استفاده کنین. تاپیک زیر رو بخونین حتما
      دانلود گمز به همراه لایسنس و راهنمای نصب
      البته یه پیشنهاد دیگه هم اینه که روی آیکون (یا شورتکات یا جایی که نصب شده یا تو منوی start) گمز کلیک راست کرده و properties رو بزنین. بعد compatibility رو بزنین، بعد تیک run this program رو بزنین، و گزینه ی windows xp (service pack 2) رو انتخاب کنین. شاید درست شد. و اینکه اگه سیستم عامل شما ویندوز نیست من پیشنهادی ندارم

        1. محمودی

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

        2. ن ر

          متاسفانه هنوز حل نشده . از سالور دیگه ای به جز لیندو استفاده کردم و روی مدل باز کار کردم. ولی بازهم روی حدود ۳ ساعت نتونست جواب پیدا کنه و ارور متوقف شدن نرم افزار اومد (پنجره … has stop working ) و بعد در process window ذکر شد که جوابی پیدا نشد.سیستم عامل هم ویستا است. آیا به نظرتون لیندو می تونه کاری که بارون نتونست رو انجام بده؟

        3. محمودی

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

        4. ن ر

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

        5. محمودی

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

  9. بهناز

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

  10. بهناز

    منظور از عبارات Best possible، Absolute gap، MIP Solution، ،Relative gap، Final Solve چیه؟
    مدل من یه مدل خطی هست و انتظار دارم جواب بهینه دقیق به دست بیارم. چرااین اتفاق نمی افته؟

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

  11. ستاره

    سلام می بخشید من یه مدل LP-METRIC دارم وقتی تابع z اصلی که ترکیب ۴تا هدفه را مینویسم ارور میده
    Model Assemble /all/ ;
    Solve Assemble using nlp minimizing f1 ;
    Solve Assemble using nlp maximizing f2 ;
    Solve Assemble using nlp minimizing f3 ;
    Solve Assemble using nlp maximizing f4 ;

    Solve Assemble using nlp minimizing Z ;

    objective..z=e=(w1*((f1-z1)/z1)**(p)+w2*((z2 -f2)/z2 )**(p) +w3*((f3- z3 )/z3 )**(p)+w4*((z4 – f4 )/ z4 )**(p))**(1/p)

    — objective =E=

    objective.. (0)*f1 + (0)*f2 + (0)*f3 + (0)*f4 + z =E= 0 ; (LHS = UNDF)

    1. محمودی

      سلام
      این روش سوال پرسیدن نیست. شما ارور رو باید بفرستین. ضمن اینکه تو مخرج ها معمولا ماکسیمم f رو مینتویسن. مثلا میزنن f1max-z1/(f1max-f1min)

  12. سارا

    با سلام خدمت شما.ممنون از سایت مفیدتون
    من یک مسأله minlp نسبتا در ابعاد بزرگ دارم که توابع مثلثاتی توش هست و از dicopt استفاده کردهام. وقتی برنامه را اجرا میکنم اول infeasibility میاره بعد نیم ساعتی objective را نشان میدهد و بعد این پیامoptimal solution convergence too slow و میگه که تغییرات تابع هدف برای چند تکرار خیلی کم بوده و بعد احساس میکنم برنامه واگرا میشه.
    خواستم ببینم آیا دستوری هست که اگه تابع هدف برای چند تکرار یک مقدار داشت، برنامه باز ادامه بده و اون پیامی که گفتم را نیاره.

    1. محمودی

      سلام
      مرسی و خواهش میکنم.
      بله همچین دستوری وجود داره. شما باید از optionی به نام continue استفاده کنین که مقدارش صفر باید باشه. کد زیر رو بین دستور Model و solve کپی کنین. yourmodelname هم اسم مدل شماست.

      $onecho > Dicopt.opt
      continue 0
      $offecho
      Your_mode_name.optfile=1;

  13. لیلا

    با سلام و خسته نباشید.
    من یک مدل گمز دارم که وقتی اجرا میکنم در قسمت خروجی میگه جواب بهینه است اما یک مقدار گپ هم نشون میده!!!! زمان حل رو زیاد کردم و تا یک ساعت رسوندم اما هنوز جوابی که نشون میده گپ داره. مساله هم زیاد بزرگ نیست.
    ایراد از چیه؟ آیا مدل ریاضی هم ممکن است ایراد داشته باشد؟

    1. محمودی

      سلام
      دستور زیر رو به قبل از دستور solve انتقال بدین.
      Option optcr=0;

      1. لیلا

        option mip=cplex;

        option reslim=3600;
        option threads=0;
        option optca=0,optcr=0;
        solve integration using MIP minimizing zz;

        اینا رو آخر برنامه نوشتم

        1. لیلا

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

        2. محمودی

          سلام
          از display استفاده کنین. مثلا display a

        3. محمودی

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

    2. لیلا

      relative gap رو میده ۰٫۶٫
      زیاده
      اگه پارامترم اندیس داشت باید چی بزنم؟

  14. ن ر

    سلام. من برنامه ای رو ران میکنم و برای بعضی مساله های نمونه ارور exit code =3میده. می تونید راهنمایی کنید؟ ممنون

    1. محمودی

      سلام
      موارد زیادی میتونه باعث بوجود اومدن این ارور بشه…

  15. لیلا

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

    1. محمودی

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

  16. یاسمن

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

    1. محمودی

      سلام
      علت نشدنی بودن معمولا ایناست:
      ۱- ساختار مدل اشتباه باشه و مدل نویسی مشکل داشته باشه. پس مدل رو با مقالات پایه مقایسه کنین و بیشتر روش فکر کنین. دستورات شرطی خیلی ساده هم روی جواب تاثیر داره. کم کم محدودیت ها رو مدل اضافه کنین و پیدا کنین که کدوم محدودیتا به هم تناقض دارن. تحلیل کنین.
      ۲- داده هایی که مدل داده شده مناسب نباشه. بهتره با یه مثال ساده شروع کنین کار رو.

  17. سلام
    معذرت میخوام من یک مدل غیر خطی بهینه سازی دارم که در گمز کدنویسی کردم و خروجی هم گرفتم ولی در status model ،حالت locally optimal به جای بهینه کلی نوشته شده.میشه لطفا راهنمایی کنید چیکار کنم تا به جواب بهیه کل برسم؟
    اکتفا به همین جواب درسته یا غلط؟
    با تشکر

    1. محمودی

      سلام
      اکتفا بهش نمیشه چیزی خواصی در موردش گفت. گپی هم که اعلام کرده مهمه.
      اولا شرط زمان رو مد نظر داشته باشین شما. محدودیت زمانی شما باید بر حسب زمان حل مدل شما باشه. مثلا اگه تو هزار ثانیه متوقف شده و این پیام رو داده، زمان حل رو بیشتر کنین.
      ثانیا یکی از روش هایی که از لوکال خارج میکنه مسئله رو، جواب آغازین هست. شما یه جواب آغازین به متغیرهاتون بدین. مثلا x.l=5 تا جوابای دیگه ای هم بتونه تولید کنه.
      از سالورهای دیگه هم کمک بگیرین.

  18. ح.ب

    سلام
    خیلی ممنون از اینکه جواب دادید.
    میشه لطفا بفرمایید زمان حل را چطور افزایش بدم.
    .سالورهای دیگه برای مدل غیر خطی را میشه خواهش کنم نام ببرید.
    سپاسگذارم

    1. محمودی

      سلام
      این کد رو به قبل از دستور solve انتقال بدین و مسئله رو ران کنین. ۲۰۰۰۰ همون زمان توقف هست به ثانیه.
      option reslim=20000;
      سالورای زیادی هستن که برای غیر خطی میتونن مناسب باشن. مثلا بارون، لیندو، دیکاپت، اس بی بی. شما اینا رو میتونین تو بخش file/option/solvers ببینین.

  19. معصومه صدقی

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

    1. محمودی

      سلام
      خب مهندس یه سرچ میزدین تو همین سایت پیدا میکردن حتما.
      تو بخش مطالب، یه دسته له نام دانلود و نصب گمز گذاشتیم. همون رو دنبال کنین مشکل حل میشه.

  20. معصومه صدقی

    سلام
    خیلی ممنون از مطالب مفید سایت شما.
    یک سوال داشتم در یک محدودیت می خوام مجموع ظرفیت های i در هر سال برابر با سهم همان سال به علاوه ی مجموع سهم باقیمانده از سال های قبل.چطوری باید متغیر ها رو اندیس بذارم.هر جور مینویسم ارور میده.
    محدودیت مورد نظر:
    con..SUM(i,X(yr,i))=E=UP(yr)+SUM(yr-1,(UP(yr-1)-SUM(i,X(yr-1,i))));
    میشه لطفا بفرمایید درست عبارت بالارو چه جوری بنویسم؟
    ممنون

    1. محمودی

      سلام
      مرسی و خواهش میکنم.
      محدودیت رو اشتباه نوشتین.
      con(yr)..SUM(i,X(yr,i))=E=UP(yr)+SUM(yrprime$(ord(yrprime) <= ord(yr) ),(UP(yr-1)-SUM(i,X(yr-1,i)))); ypprime رو باید الیاس yr کنین. مفهومش رو من کاری ندارم.

  21. معصومه صدقی

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

    1. محمودی

      سلام

      if(x<1,
      y=1;
      else
      y=3;
      );

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

  22. mohamad alika

    سلام
    آقای محمودی میشه لطفا بفرمایید چطور باید این شرط رو در ساختار مدلم بنویسم؟
    تابع هدف من حاصلضرب مجموع سود ۵ کشاورز است.برخی کشاورزها مجموع سودشان صفر می شود و همین باعث میشه کل تابع هدف صفر بشه.یه دستور می فرمایید که بنویسم و با اون به مدل بگم اگر مجموع سود یک مزرعه صفر شد در تابع هدف اون مزرعه وارد نشود.
    sumation(f)=E=sum(yr,benefit(yr,f);
    تابع هدف
    prod(f,sumation(f))
    تابع هدف بالایی است.اون شر را می فرمایید چیکار کنم؟
    خیلی خیلی ممنون و متشکر

    1. محمودی

      سلام
      ابتدا بفرمایین که این ضرب کردن سودها معنی خاصی میده؟ درسته که اینا خوبه که بالا باشن، ولی این ضربشون چه مفهومی پشتش هست؟

  23. mohamad alika

    سلام
    هدفم استفاده از یک تابع معروف به نام تابع ضربی نش است که میخوام حاصلضرب سود ۵ مزرعه باهم ماکزیمم شود.یه سوال واسم پیش اوم دوباره از شما بپرسم به علاوه سوال قبلم.
    در گمز برای اینکه سود این ۵ مزرعه که هرکدام یک تابع غیر خطی هستند را در تابع هدف ضرب کنم باد از دستور prod استفاده کنم؟
    میشه لطفا فرم صحیح نوشتن prod را بفرمایید.همش به مشکل می خورم.دسترسی ندارم به چیزی فقط از شما میتوونم کمک بگیرم.
    این فرمت درسته آیا؟
    z= prod(f,benefit(f))
    که تابع benefit(f)=E= sum(c,prc(f,c)*y(f,c)*Area(f,c))-sum(c,crop(f,c)*Area(f,c))-sum(c,cw(f,c)*nw(f,c)*Area(f,c))-prc*volume(f);
    می باشد.
    نباید در z =e=prod((f,c),benefit(f)) بنویسم؟
    واقعا ممنون

  24. م

    سلام. من مدلی در گمز نوشتم . این عبارت مربوط به تابع هدفشه که قسمت اول اون رو صفر برمیگردونه… در حالیکه n مجموعه سال هاست و مقدار گرفته
    ممکنه راهنمایین کنین… واقعاً کلافه شدم … خیلی راه ها رو امتحان کردم.. نمیدونم مشکل از کجاست. CF هم یک متغیرثابته…

    Cobj=e=sum(n,(CF**ord(n))*sum(s,F(s,n)*C0(s,n)))

    1. محمودی

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

  25. بهاره

    با سلام و ضمن تشکر از سایت خوبتون.
    من مدلی در گمز پیاده کردم و Option reslim=3600; قرار دادم. خروجی زیر رو در بخش Solution Report گرفتم:
    MIP status(107): time limit exceeded
    Cplex Time: 3601.25sec (det. 335583.58 ticks)
    Fixing integer variables, and solving final LP…
    Fixed MIP status(1): optimal
    Cplex Time: 0.14sec (det. 22.24 ticks)
    Resource limit exceeded.
    این خروجی دقیقا بعد از ۳۶۰۰ ثانیه به دست اومده. الان یعنی به جواب بهینه رسیده؟ یا یکی از جوابهای موجه رو گزارش میکنه؟
    و اینکه من بر اساس مطالبی که در سایت خوندم برای تعیین زمان اجرای مدل عبارت display Untitled_1.resusd; رو اضافه کردم. با اینکه پس از یک ساعت نرم افزار خروجی رو به من داده ولی به ازای display Untitled_1.resusd; خروجی زیر رو گرفتم:
    —- ۳۷۹ MODEL Untitled_1.ResUsd = 3601.688

    EXECUTION TIME = 1.154 SECONDS 7 MB 24.8.3 r60202 WEX-WEI
    یعنی مدل من در حدود ۱٫۱۵ ثانیه حل شده؟!!
    این در حالیه که حتی در حالت قبل هم که پیش فرض Option reslim=1000; بود نمی تونست جواب رو به دست بیاره…
    ممنون میشم راهنمایی بفرمایید.

    1. محمودی

      سلام
      تشکر.
      نه یه جواب موجه رو داره گزارش میکنه. gap رو ببینید. اونجایی که آخر تو پنجره ی process window نوشته absolute gap و relative gap. این میشه مقدار خطایی که با جواب بهینه ی احتمالی داره. نرم افزار خودش اینو حساب میکنه و گزارش میده.
      برا زمان حل هم خیر! همونطور که میبینید نوشته ۳۶۰۱٫۶۸۸ این زمان نهایی حل هست. که یه ثانیه ش تقریبا برا خوندن داده ها و سایر مواردی که گمز رو اماده میکنه تا شروع به حل مدل و توقف کردن مدل هست. اون تایم آخر هم که یه ثانیه ست باید نگاه کنین کجا اینو گفته. احتمالا برای display کردن داده ها و نشون دادن solvar اینا باشه. و قطعا ربطی به زمان حل مدل نداره.

      1. بهاره

        ممنونم از راهنماییتون.
        الان خروجی که به من داده این هست:
        MIP Solution: 725.645867 (600530 iterations, 529 nodes)
        Final Solve: 725.645867 (11 iterations)

        Best possible: -924.198551
        Absolute gap: 1649.844418
        Relative gap: 1.000000
        این جواب Best possible مربوط به چی هست؟ راجع به این گپ ها توضیح میدین؟ اون Absolute gap یعنی جواب به دست اومده انقدر با جواب بهینه فاصله داره؟!

        1. محمودی

          سلام
          برای گپ:
          گمز یا solver های مرتبط، در حل مسائل MIP دو تعریف عمده دارن. best integer و best estimate . اولی یعنی جواب بهینه مسئله و تو همه محدودیت ها صدق میکنه.
          دومی به این معنیه که بهترین جوابی که میتونه بدون در نظر گرفتن محدودیت integer بودن متغیرها به دست میاد هست.
          تفاوت این دو تعریف میشه absolute gap و اگه به شکل درصدی هم بیانش کنیم میشه relative gap
          جهت مشاهده فرمول دقیق و محاسبات اینجا کلیک کنید.

          برای اینکه الان گپ رو یک داده، این یعنی اینکه مدل فقط تونسته یه جواب شدنی برا مدل تولید کنه و تو این زمانی که دادین نتونسته مسئله اولیه رو به دوگان نزدیک کنه. پس شما باید سعی کنین که جواب رو بهترش کنین.
          زمان رو ببرین بالا
          مدلسازی رو بهترش کنین.
          از شرط ها استفاده کنین که مقداری محدودیت ها کمتر بشه و …
          برای تابع هدفتون هم (در صورتی که باید بزرگتر مساوی صفر باشه) حداقل مقدار صفر قرار بدین. z.lo=0

  26. نیما

    سلام آقای محمودی
    من یه مدلی دارم حل که میکنم با گمز همه متغیرها رو جواب صفر میده!
    مشکل از کجا می تونه باشه؟

    1. محمودی

      سلام
      چند تا دلیل داره:
      ۱- ممکنه واقعا جواب بهینه ش همین باشه.
      ۲- ممکنه نشدنی باشه با این شرایط و باید چک کنین که توی پنجره ی process window چیزی در مورد نشدنی بودن مدل گفته یانه. این نشدنی بودن ممکنه به چهار دلیل باشه. داده نا مناسب. ضعف سالور. اشتباه بودن مدل سازی. اشتباه بودن کد نویسی.
      ۳- ممکنه لایسنس نداشته باشین. برا لایسنس برید تو بخش دانلود نرم افزار گمز همین سایت. راهنمایی کردیم اونجا.
      همه موارد رو باید چک کنید.

  27. نیما

    سلام مجدد. باز هم ممنون بابت وقتی که میگذارید.
    راستش با یکی از سالورها جواب گرفتم بالاخره (مدلم MINLP هستش، ولی بعنوان مثال با خیلی از سالورها از جمله بارون جواب نمی گیرم دلیلشم نفهیمیدم).
    جدا از ضعف سالور، آیا ممکنه با یه سالور جواب گرفت در حالیکه بقول شما مدل سازی یا کدنویسی اون اشکال داره؟

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

    1. محمودی

      سلام
      خواهش میکنم.
      دلیل نمیخواد. سالورا هر کدوم از یه رویه ای تبعیت می کنن که به جواب برسن. حالا یه سری میرسن. یه سری نه. مطمئن هم بشین که واقعا جواب مناسبی رو بهتون داده.
      بله ممکنه مشکل از کد نویسی هم باشه ولی یه سالور جواب بده. شما اول مدل، بعد داده ها و بعد کد نویسی رو کاملا دقیق چک کنین.
      اینکه حساس نیست چیز عجیبی نیست در کل. ولی اگه از لحاظ منطقی انتظار دارین که حساس باشه. باید مجددا مدل و داده ها رو چک کنین!
      برا اینکه بگین اول با هدف obj بیا مدل رو solve کن. بعدش بیا تابع هدف obj رو فیکس کن. بعد بیا اون متغیری که من میگم رو هم بزرگش کن. میشه. اینجوری:

      solve mymodel using minlp maximizing obj;
      obj.fx=obj.l;
      solve mymodel usiing minlp maximizing myvariable;
      
  28. نیما

    سلام
    error 328: wrong suffix on equation assignment–allowable are: l, m, lo, up
    در ادامه خطاهای دیگری هم بدنبال داره

    1. محمودی

      سلام
      ویژگی اشتباهی رو از محدودیت درخواست کردین. مثلا بیاد بنویسین objective.l یا objective.scale چی نوشتین؟

  29. نیما

    والا دقیقا همونطوری نوشتم که شما فرمودی منتها ارور میده

    Error 148: dimension difference
    error 246: objective variable is not a free variable
    

    و ۲-۳ خطا در ادامه که احتمالا بخاطر همین دوتا ارور باشه…

    ببینید من میخوام علاوه بر اینکه تابع هدفم ماکزیمم سازی میشه، متغیر تصمیمم که سرعت (سرعتی که وسایل نقلیه بین دو گره حرکت میکنند) هستش optimize بشود. حالا ممکنه این optimization سرعت باتوجه به داده های ورودی مدل حداکثر و یا حداقل شود. ضمن اینکه برای سرعت کران بالا و پایین منظور کرده ام.
    سوال دیگه اینکه آیا میشه قسمت سوم کدی که گفتین رو اینجوری نوشت:

    solve mymodel using minlp optimizing myvariable;
    

    بجای maximizing از کلمه optimizing استفاده کنم، گمز میشناسه?

    1. محمودی

      سلام
      لطفا به همون سوال و جوابی که داشتیم ریپلای کنین فقط.
      این دو تا ارور خیلی واظح گفتن که تابع هدف باید متغیر آزاد تعریف بشه. variable or free variable
      سوال دوم: اینجوری مدل دو هدفه میشه و باید از روشهای چند هدفه استفاده کنین. مثلا روشهای وزنی یا روش های پارتویی مثل eps constraint. باید در موردشون مطالعه کنید.
      سوال سوم: خیر.

  30. sanaz

    با سلام و تشکر از سایت خوبتون
    من مدلم minlp هستش که با سالور bonmin حلش کردم، تو کامنتا خوندم شما گفتین بهتره از dicopt و baron استفاده بشه اما این دو برای من demo هستن و با bonmin حل کردم، بعد از حل دو تا ارور ابی رنگ با این متن میاد:

    error at line 136: division by zero (0)
    error at line 137: division by zero (0)
    

    جوابایی که داده هم غیرعادیه ، این ارور بعد از حل برای چی میاد چطور رفع کنم؟ مدلم مشکل داره یعنی؟

    1. محمودی

      سلام
      برای اینکه سالورهاتون full بشن این تاپیک رو بخونین.
      خطای تقصیم بر صفر در گمز تو مدلهای غیر خطی پیش میاد. این خطا میگه که شما متغیری رو گذاشتین تو مخرج که ممکنه صفر هم بشه. پس ارور میده یهو. میتونین به مخرج یه عدد خیلی کوچیک مثل ۰٫۰۰۰۰۱ اضافه کنین و این مشکل رفع میشه.

  31. sanaz

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

  32. زینب

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

    1. محمودی

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

      1. زینب

        ببخشید من وقتی مدلو ران میکنم این پیغامو میده:

        The file you want to run is not in the current process directory.
        

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

        1. محمودی

          سلام
          مطمئن بشین که مسئله با گپ صفر حل میشه. این کد رو قبل از دستور solve وارد کنین.

          option optcr=0, optca=0;
          
        2. زینب

          سلام
          خیلیییییی ممنون مشکل حل شد
          فقط یه سوال دیگه داشتم
          اینکه من از دستور display استفاده کردم
          توی جواب میزنه:

          ۱۰۰VARIABLE z.L = 1185846.103
          این صد قبل از وریبل معنیش چیه؟

        3. محمودی

          مبگه تو خط ۱۰۰ از دستور display استفاده کردین

  33. کریمی

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

      1. کریمی

        سلام. یعنی همگرا نمیشه . البته وقتی حجم مسئله رو که کوچک میکنم حل میکنه ولی وقتی که حالت اصلی مسئله رو میخوام حل کنه، درصد گپی که تو هر iteration نشون میده رفته رفته زیاد میشه و تو مقدار مثلا ۱۴۰% میمونه

        1. محمودی

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

  34. کریمی

    البته این رو هم بگم که به روش big M خطی سازی کردمش.

  35. علی

    با عرض سلام
    من یه برنامه تو گمز ران کردم که تو اون متغیر (FL(B,S به ازای B,S های مختلف یه سری مقادیر گرفته
    حالا می خوام یه متغیر دیگه تعریف کنم که برابر با یکی از مقادیر (FL(B,S هست. یعنی می خوام این
    کد رو بنویسم (C = FL(1,2. چجوری میشه این کد رو نوشت؟

    1. محمودی

      سلام
      همین عبارت رو به صورت محدودیت بنویسین اگه c برای شما متغیر هست. و به جای F این رو بنویسین:

      F('1','2')
      
  36. کریمی

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

    1. کریمی

      در ضمن از دستور constraint.m برای بدست آوردن دوگان محدودیتهام استفاده میکنم

    2. محمودی

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

  37. sanaz

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

    1. محمودی

      سلام
      مرسی
      غیر عادی یعنی چی؟
      محدودیت چرا اعمال نمیشه؟
      و وقتی بر میدارین چه پیامی میده؟ model status, solver status و اینکه گفته نشدنیه یا نامحدود؟

      1. sanaz

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

        co1(i,j,m)$(ord(j)&gt;=4).. x(i,j,m)=l=y(j);
        co2(i,m)..  sum(j,x(i,j,m))=e=1;
        co3(i,j).. sum(m,x(i,j,m))=l=1;
        co4 ..   (sum((i,j,m)$(ord(j)&gt;=4),b(i)*x(i,j,m)) / (sum((i,j,m),b(i)*x(i,j,m))+0.000001))=g=0.4;
        co5 ..   sum(j$(ord(j)&gt;=4),y(j))=l=3
        

        مثلا محدودیت شماره ۲ که میگه مجموع x هام به ازای i و m برابر ۱ باشه توی جواب اینطور نیس x رو که باینری تعریف کردم بهم بین صفر و یک میده و اینکه یه جاهایی هم که بین صفر و یک نیست مجدودیت ۲ رو رعایت نمیکنه،
        و وقتی که کلا محدودیت هارو برمیدارم:

        SOLVER STATUS     1 Normal Completion         
        **** MODEL STATUS      2 Locally Optimal           
        **** OBJECTIVE VALUE           267760.0000
        

        اون محدود یا نامحدودی رو که پرسیدین هم نمیدونم از کجا بفهمم یعنی نمیدونم کجاشه
        همه xها رو صفر میده و اینکه من توی متغیرام برای y(j) یه شرطی گذاشته بودم که مثلا برای j های ۱ ۲ و ۳ مقدار y(j) برابر با ۱ باشه حالا به خاطره اون متغیرهای y ام به ازای این سه تا j برابر ۱ میده، اون شرط رو برمیدارم هم اون سه تا هم صفر میشه یعنی کلا همه متغیرها صفر میشه ولی نتایج solver status و اینها همون مثله بالا میشه. منکه توی همه جملات تابع هدفم متغیرهامو دارم چطوره که متغیرها صفره ولی تابع هدفم مقدار میگیره!
        ممنون از وقتی که میذارید

        1. محمودی

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

          option optcr=0, optca=0;
          

          اینا رو که بذارین، احتمالا مدل شما یا زمان حلش میره بالا. یا نشدنی میشه. این میشه نقطه ی شروعی برای شما. فعلا این کارو بکنین.

  38. sanaz

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

    1. محمودی

      سلام
      اعداد ۰ و ۱ و اعداد خیلی خیلی نزدیک به صفر تولید میکنه؟ یا اینکه مثلا ۰٫۴ و اینا رو؟
      نوع مدل رو mip گذاشتین؟ یا rmip?
      خیر گمز میفهمدش. مشکل از مدل، و یا داده هاست.
      از سالورای دیگه هم کمک بگیرین.

      1. sanaz

        سلام
        نه نزدیک به صفر نیست مثله همون ۰،۴ و ۰،۳ و این هاست مدلم رو minlp گذاشتم و با dicopt هم حل کردم که توی سایت شما خونده بودم سالوره خوبی برای این مسائل هستش. پس احتمالا مدلم ایراد داره
        خیلی ممنون از شما که پاسخگو هستین

        1. محمودی

          سلام
          لطفا با lindo یا baron هم حل کنین، optcr=0 هم قرار بدین، پیامای model status, solver status رو اینجا بذارین

  39. sanaz

    شما گفتین که داده ها ممکنه مشکل داشته باشه من رفتم داده هامو عوض کردم دیدم جواب ها درست نشده ولی بهتر شده و دوباره در اون جهتی که بهتر شده بود تغییر دادم و بعد دیدم که جوابای مسئلم درست شدن کامل. مدل status ام هم به صورت زیر هستش:
    **** SOLVER STATUS 1 Normal Completion
    **** MODEL STATUS 8 Integer Solution
    **** OBJECTIVE VALUE 950869.3099
    واقعا ازتون ممنونم که راهنماییم کردین من گمز اصلا بلد نبودم با سایت شما کد کردمو مشکلاتمو برطرف کردم و بالخره حللش کردم خیلی خیلی ممنونم.

  40. sanaz

    مدل من حل شد خروجیام درست شد اما الان چک کردم و متوجه یه چیزی شدم اینکه من یه محدودیت واسه متغیر X گذاشته بودم که اگر فاصله بیشتر از یک مقداری باشه متغیر بشه صفر جوابش، اما توی جواب ،متغیر برای مقادیری که فاصلشون بیشتر از حدیه که من تعریف کردم صفر نیس بعضی جاها یک شده. به این صورت نوشتم کدشو:
    binary variable x(i,j,m);
    x.m(i,j,m)$(d(i,j)>35)=0;

  41. sanaz

    کدش رو عوض کردم درست شد. ممنونم
    ببخشید دوگان منظورتون چی هستش

    1. محمودی

      شما نوشته بودید x.m که این مفهوم دوگان رو میرسونه

      1. sanaz

        آهان متوجه شدم
        کدش رو کلا عوض کردم و به جای شرط محدودیت گذاشتم و حل شد.
        باز هم خیلی ممنون از سایت خوبتون و وقتی که میزارید.

        1. محمودی

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

  42. نیما

    با سلام و ادب و تشکر فراوان از سایت مفیدتون
    من مدل کارگاه باز رو تو گمز پیاده کردم با تابع هدف مینیمم کردن زمان تکمیل کار نهایی (Cmax) یا makespan و نیز با در نظرگرفتن زمان پردازش کارهای مختلف بر روی ماشین های مختلف، اما متاسفانه وقتی زمان های پردازش اعداد بزرگتری باشند ، به طوری که متغییر بهینه خروجی گمز (که همون مینیمم Cmax هستش) بیشتر از عدد ۱۰۰ بشود ، گمز خروجی نمیدهد گویا گمز اتوماتیک خروجی بهینه رو ماکسیمم به عدد ۱۰۰ محدود کرده!! چجوری میشه این محدودیت رو از گمز حذف کرد ؟؟
    با سپاس

    1. محمودی

      سلام
      آپشن زیر رو قبل از دستور solve بذارین مشکلتون حل میشه.

      option intvarup=0;
      

      توضیحات این آپشن رو تو کانال گذاشتیم.

  43. نیما

    بینهایت ممنون از راهنماییتون
    فقط یعضی وقتا M بزرگ رو تو مدل یک عدد خیلی بزرگ مثلا یک میلیارد تا بیشتر میگیرم گمز تو جواب بهینه جواب منطقی نمیده… مثلا بزرگترین زمان پردازش یک کار بر روی ماشین رو به عنوان جواب بهینه درنظر میگیره!!! ولی وقتی مثلا یک میلیون یا ۱۰۰۰۰۰ میگیرم جواب بهینه منطقی میده !
    با سپاس

    1. محمودی

      سلام
      بله همچین حالتایی زیاد پیش میاد. خود این M بزرگ بحث برانگیز هست که چجوری در نظر گرفته بشه. شما سعی کنین کوچکترین مقدار ممکن رو در نظر بگیرین (جوری که مفهوم m بزرگ باقی بمونه)
      اینکه دقیقا چه مقداری بگیرین که هم کچیک باشه و هم محدودیت درست باشه، بستگی به مدل شما و شناخت شما از مدل و مقادیر مختلفی که برای سمت راست و چپ به دست میاد داره. باید بیشتر روش فکر کنین. اینم در نظر داشته باشین که اینجوری زمان حل مدل شما ممکنه بیشتر هم بشه.

  44. مهدی

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

  45. بهار

    سلام. من توی مدل روباستم با ضرایب اطمینان حساسیتی به جریمه نقض در تابع هدف ندارند . و کلا فقط جواب ۰٫۵ یا ۱ و میدند و بین این دو مقدار نمیگیرند. علتش چیه؟

    1. محمودی

      سلام
      این دیگه برمیگرده به ساختار مدل شما (چه درست باشه چه غلط). مجددا طبق مفاهیمی که دارین باید بررسی کنین. بنده نمیتونم کمکی بکنم.

  46. amir

    سلام
    من یه مدل MINLP دارم که با dicopt حلش میکنم ولی model status رو integer soultion نشون میده متاسفانه. برای رفع این مشکل چیکار کنم؟ در ضمن solver status رو normal completion نشون میده.

    1. محمودی

      سلام
      مقادیر opctr=0, optca=0 رو قبل از دستور solve قرار بدین و مجددا تست کنین.
      اگه تغییر نکرد. ممکنه شما با دادن جواب آغازین به گمز مقداری جواب رو بهتر و یا بهینه کنین.
      از سالورهای دیگه هم استفاده کنین.

      1. amir

        opctr=0, optca=0 را قرار دادم ولی تغییر نکرد متاسفانه. بقیه ساالورها هم جواب درست رو نمیدن. baron هم نمیتونه حل کنه چون ifthen دارم تو مدلم. میشه کاریش کرد؟

        1. محمودی

          برای ifthen سالور sbb هم تست کنین.
          شاید استفاده از جواب اولیه بهتون کمک کنه. به متغیرهای جواب اولیه بدین. یعنی قبل از حل مدل، با ویژگی .L بهشون یه مقدار اولیه بدین. جوری که منطقی باشه.

  47. Asadi

    سلام
    من یه مدل نوشتم تووی تابع هدف قصد دارم مینیمم کنم ماکزیمم عبارت {A,0}
    (البته A رو الان به صورت نماد نوشتم چون حاوی سیکما هست.)

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

    با تشکر

    1. محمودی

      سلام
      شما یه متغیر آزاد در علامت مانند u تعریف کنین. این u از ۰ و A بزرگتر هست، پس تابع هدفتون میشه z=e=u
      چون u از صفر هم بزرگتره پس عبارت u.lo=0 رو باید وارد کنین.
      و محدودیت زیر هم باید اضافه بشه.

      u=g=A;
      
  48. ال

    سلام. وقتتون بخیر. یه سوال داشتم. من باید مشخصات مدلم رو تو متن مقاله بذارم که چند تا متغیر پیوسته، باینری و … داره مسئله م. تو گمز تو یه قسمتی این عبارات رو پیدا کردم اما نمی دونم مفهومشون چیه. کدوم باینری، پیوسته و integer ؟ تعداد محدودیت ها کدوم قسمت نوشته شده؟
    MODEL STATISTICS:
    BLOCKS OF EQUATIONS 36
    SINGLE EQUATIONS 125,813
    BLOCKS OF VARIABLES 20
    SINGLE VARIABLES 138,243
    NON ZERO ELEMENTS 821,717
    DISCRETE VARIABLES 5
    ممنونم

    1. محمودی

      سلام
      تو اون پنجره کوچیکه (process wondow) نشون داده میشه. ران که زدین قبل از شروع اینا رو مینویسه. دقیق میگه چند تا متغیره و….

      1. محسن

        سلام این سوال منم داشتم ولی در قسمتی که گفتین یعنی process wondow پیدا نکردم.با چه نامی تعداد متغیر ها پیوسته، باینری و محدودیت ها در همون قسمت process wondow نشون میده .میشه دقیقا بگین کجا .ممنون میشم

        1. محمودی

          سلام
          اونجایی که میگه generating minlp (mip) model ، زیرش این امار میاد. به طور دقیق تر میتونین تو فایل lst قسمت model statistics این موارد رو مشاهده کنین.

  49. امیر رضایی

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

    1. محمودی

      سلام
      سوال اول: بله امکانش هست. میتونین مقدار دوگان مربوط به یه متغیر به نام x رو بعد از دستور solve به صورت xx=x.m ذخیره کنین. xx یه پارامتر میتونه باشه.
      برای سوال دوم یک سری راهنمایی تو کانال تلگرام گذاشتیم میتونین استفاده کنین.

  50. امیر رضایی

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

    put fopt 'BendersStrategy 1'
           / 'variables.BendersPartition 0'
    loop(k, put / "x.BendersPartition(*,*,'" k.tl:0 "') " ord(k):0:0
                / "tcost.BendersPartition('" k.tl:0 "') " ord(k):0:0);
    putclose fopt;
    $onecho &gt; cplexd.op2
    BendersStrategy 2
    variables.BendersPartition 0
    x.BendersPartition 1
    tcost.BendersPartition 1
    $offecho
    $onecho &gt; cplexd.op3
    BendersStrategy 3
    $offecho
    
    1. محمودی

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

  51. نرگس نقیبی

    سلام و تشکر بسیار از زحمت هایی که میکشید
    من یک loop نوشتم برای پیاده سازی الگوریتم بندرز و داخل اون دستور if دارم. اما اجرا که میکنم حلقه تا اول if اجرا میشه و بعد exit code 3 میده. ممنون میشم اگه کمکم بکنید. کد حلقه هم به صورت زیر هست :

    parameter nonconverged /yes/;
    scalar  unbounded      /1.0e9/;
    scalar uperbound       /+inf/;
    scalar lowerbound      /-inf/;
    solve initial min zin use lp;
    display zin.l , a.l , b.l  ;
    loop(iter$(nonconverged),
    solve fsp min zfsp us lp;
    u.l=eq3.m;
    v.l=eq4.m;
    display zfsp.l , c.l , d.l , u.l , v.l , a.l , b.l ;
    if (zfsp.l&gt;0,
    feascut(iter)=yes;
    else
    solve osp min zosp us lp;
    u.l=eq7.m;
    v.l=eq8.m;
    display zosp.l , c.l , d.l , u.l , v.l , a.l , b.l ;
    uperbound=zosp.l;
    optcut(iter)=yes;
    );
    uu(iter)=u.l;
    vv(iter)=v.l;
    option optcr=0;
    solve mp minimizing zmp using lp;
    display zmp.l , c.l , d.l , a.l , b.l ;
    
    abort$(mp.modelstat1) "original model not solved optimality";
    
    nonconverged$((uperbound-lowerbound)=0)=no;
    );
    
    1. محمودی

      سلام
      مرسی. آخرش این پیام رو میده؟
      “original model not solved optimality”

  52. کامران

    سلام، من یک مدل غیر خطی نوشتم که وقتی ترتیب متغیر ها در قسمت variables را عوض می کنم جواب مسئله و مقدار تابع هدف پس از بهینه سازی عوض می شود.
    مثلا در قسمت variables به جای
    z
    B(j)
    C(j)
    A(j)
    R(i,j)
    S(i,j);
    قرار می دهم
    z
    C(j)
    B(j)
    A(j)
    R(i,j)
    S(i,j);
    دلیل چیست؟

    1. محمودی

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

      1. کامران

        خواهش می کنم، ممنون از شما
        یک سوال دیگر هم داشتم
        مدل غیر خطی من در زمان خیلی کوتاه در حد چند ثانیه Run میشه و من به همه متغیر ها مقدار اولیه داده ام و با همه solver ها هم امتحان کرده ام ولی در همه حالات نتیجه Locally Optimal هست، چطور می توانم به جواب global برسم؟

        1. محمودی

          سلام
          اگه برای همه سالورها یک جواب میده، و جوابا یکی هست، همون رو global بگیرین.

  53. کامران

    در مورد سوال مربوط به global کردن جواب، optca و optcr را هم صفر کردم ولی باز هم جواب local می دهد.

    1. محمودی

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

  54. صابر

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

    1. محمودی

      سلام
      به همون سوال ریپلای میکردین خب. نه یه پارامتر به نام مثلا a تعریف کنین و بعد از دستور solve این عبارت رو بنویسین.

      a=YourModelName.modelstat;
      

      که YourModelName اسم مدل شماست.

  55. حسین

    با سلام و خسته نباشید. متاسفانه یه کد نوشتم و وقتی با سالور mip حلش میکنم عبارت integer infeasible رو بهم میده. وقتی با سالور rmip حلش میکنم جواب بهم میده اما تمامی متغیرهایinteger مسئلرو نزدیک صفر یا نزدیک صفر مثلا ۵E-6 و تو این حدودا میده و خب فک میکنم جواب ها درست نیستند. لطفا راهنماییم کنیم تو این زمینه. ممنونم ازتون

    1. محمودی

      سلام
      با شرایط گفته شده مسئله نشدنی هست. شما باید اول فرضیات مدلتون رو مجددا چک کنین. مجددا مدل رو اصلاح و ویرایش کنین با دقت. بعد داده ها و کد رو چک کنین. بعد مدل رو با تعداد محدودیت کمتر تست کنین و هر بار رانش کنین. تا جایی که نشدنی شد باید بشینین تحلیل کنین که چرا نشدنی شده. همه این کارا رو با دثت انجام بدین موفق میشین.

  56. علی

    من از گمز ۲۵٫۲ با لایسنس ۳ استفاده میکنم یه کد نوشتم جواب میده اما وقتی از binary variable استفاده میکنم تمام خروجی هایی که متغیر باینری داره صفر میشه،در ضمن همه solver ها فعال هستند، همین کد رو روی سیستم دیگه با گمز ۲۴ کپی کردم جواب میده، مشکل از چی میتونه باشه؟

  57. باستان

    باسلام
    ببخشید بعد از حل مدل در پنجره نتایجresultبعد از جواب اخر۴تا ستاره ****نشان می دهد این۴تا ستاره مفهومش چیست؟

  58. نازی

    سلام.آیا امکانش هست که بین سی شارپ و گمز توسط فایل gdx بصورت آنلاین ارتباط برقرار کرد؟ یعنی از توی برنامه تحت وب که با سی شارپ نوشته میشه میتوان دکمه ای را زد و ورودی های گمز را وراد کرد و خروجی از گمز گرفت توسط gdx? و در این حالت باید از solver خاصی استفاده کرد؟

    1. محمودی

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

  59. زرگری

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

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