تعریف متغیرها

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

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

همانطور که اطلاع دارید متغیر به چند قسمت مانند متغیر آزاد در علامت، مثبت، منفی، صفر و یک و… تقسیم بندی می شوند. در این بخش به نحوه ی تعریف متغیرهایی که در مدل شما مورد استفاده قرار می گیرند، پرداخته می شود.
فرض کنید در مدلتان متغییرهای زیر را دارید. همانطور که مشاهده می کنید، متغیرهای xو yو z متغیرهایی آزاد در علامت، متغیر m عدد صحیح مثبت، v صفر و یک و همچنین متغیر u فقط به ازای اندیس هایی از j که در آنها j برابر با ۵ تا ۱۰ است صادق خواهد بود، بنابراین متغیر u به نوعی محدود شده است. این متغیرها را در GAMS چطور تعریف می کنید؟

variables-sample

اینکه این متغیرها را در GAMS به چه شکل تعریف کنیم بسیار ساده است. متغیرها را با دستور کلی Variable می توان تعریف نمود. در تعریف متغیرها به دو امر بسیار مهم باید دقت نمود:

۱٫ نوع یک متغیر
در علم تحقیق در عملیات، انواع متغیرها به متغیر آزاد در علامت، متغیر مثبت، منفی، غیر منفی و… تعریف می شوند. مروری بر این متغیرها را در شکل زیر می توان مشاهده نمود:

Variable-Types

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


* Examples: How to define a variable in different types
variable x(j) ;
free variable x(j) ;
positive variable x(j) ;
nonnegative variable x(j) ;
negative variable x(j) ;
integer variable x(j) ;
binary variable x(j) ;
semicont variable x(j) ;
semiint variable x(j) ;
sos1 variable x(j) ;
sos2 variable x(j) ;


2. ویژگی های یک متغیر
در برنامه نویسی توسط GAMS یک سری ویژگی ها را می توان به یک متغیر نسبت داد. به عنوان مثال می توان گفت فلان متغیر مقداری بین فلان تا فلان دارد. در این صفحه فقط به چهار ویژگی اصلی و پر کاربرد متغیرها شامل: حد پایین متغیر، حد بالای متغیر، ثابت کردن یک متغیر و مقدار کنونی متغیر، پرداخته می شود.

۱٫ حد پایین یک متغیر
توسط دستوراتی می توان به یک متغیر ویژگی نسبت داد. یکی از این ویژگی ها حد پایین می باشد. کد زیر که شامل تعریف کلی و یک مثال از تعیین حد پایین برای دو متغیر x و y است را در نظر بگیرید:

* How to assign a attribute to the variables
variable x ;
x.lo=5 ;
variable y(j) ;
y.lo(j)=10;

کد بالا نشان می دهد که متغیر x دارای کمترین حد برابر با ۵ و متغیر y دارای حد پایین ۱۰ می باشند.

۲٫ حد بالای یک متغیر
تخصیص حد بالای به یک متغیر نیز مشابه حد پایین آن می باشد. کد زیر این امر را به ضوح به نمایش می گذارد:

* How to assign a attribute to the variables
variable x ;
x.up=5 ;
variable y(j) ;
y.up(j)=10;

کد بالا به این امر دلالت دارد که حداکثر مقداری که متغیرهای x و y می توانند به خود بگیرند به ترتیب برابر با ۵ و ۱۰ می باشد.

۳٫ ثابت کردن یک متغیر

* How to assign a attribute to the variables
variable x ;
x.fx=5 ;
variable y(j) ;
y.fx(j)=10;

در کد بالا دو متغیر به نام های x, y که آزاد در علامت هستند تعریف شده و سپس مقداری ثابت (۵ و ۱۰) به آنها تخصیص داده شده است. این شیوه ی کد نویسی به کاربر امکان تحلیل حساسیت بهتر می دهد. حتی کابر می تواند توسط این کد (ثابت کردن یک متغیر بر روی یک مقدار معین) اشکالات مدل خود از جمله نشدنی شدن جواب و یا غیر واقعی بودن آن را مورد تجزیه و تحلیل قرار دهد که این امر بسته به تجربه و کارآزمودگی وی دارد.

۴٫ مقدار کنونی یک متغیر
نوع دیگری از ویژگی های متغیرها مقدار کنونی آن ها می باشد. منظور از مقدار کنونی آن مقداریست که GAMS پس از طی مراحلی به صورت خط به خط به متغیر تخصیص داده است. به عنوان مثال یک کد GAMS را در نظر بگیرید که در آن دو مدل کد نویسی شده اند. و متغیری به نام x باید پس از مقدار گرفتن در مدل اول، جهت حل در مدل دوم، به عنوان عددی ثابت a (پارامتر ورودی) به مدل دوم معرفی شود. بنابراین کد ساده ی زیر پس از دستور solve ر مدل اول باید قرار داده شود و بدین صورت به مدل دوم فهمانده می شود که پارامتر a که در مدل دوم دقیقاً همان مقداری را دارد که متغیر x در مدل اول در حالت بهینه به خود گرفته است:

* How to assign a attribute to the variables
variable x ;
x.l=5 ;
variable y(j) ;
y.l(j)=10;

(توجه شود که در صورت عدم آشنایی با دستور solve به بخش مربوطه در نوار کناری دسته بندی، بخش حل مدل توسط GAMS مراجعه فرمایید). مثالی از این نوع مدل ها مدل های پویا در مهندسی مکانیک، مدل تعالی عمومی در اقتصاد کلان و مدل زمان بندی در مهندسی صنایع می توند باشد

نمایش ویژگی های متغیرها

فرض کنید مدلتان حل شد و پس اط حل آن مایلید تعدادی از ویژگی های متغیرهایتان به نمایش گذشته شود. به عنوان مثال می خواهید مقداری که یک متغیر در حالت بهینه به خود گرفته پس از حل مدل به نمایش گذاشته شود. جهت نمایش ویژگی های متغیرها می توان از دستور display استفاده نمود. مثال زیر این امر را به نمایش می گذارد. (دستور display در بخش مربوطه توضیح داده شده است)


ٍDisplay x.l, x.lo, y.scale, z.up ;

توسط کد بالا، GAMS پس از حل مدل شما، مقدار بهینه ی متغیر x، حد پایین متغیر x، و حد بالای متغیر z را به شما با خواهد گرداند.

بپردازیم به ادامه ی مثال کاربردی ۱:
(در صورتی که با مثال کاربردی ۱ آشنایی ندارید اینجا کلیک کنید). با دقت به مثال کاربردی ۱، مشاهده می شود که مسئله دارای یک دسته متغیر به نام x می باشد که دارای اندیس j می باشند. پس باید یک متغیر آزاد در علامت به نام x تعریف نماییم.
نکته مهم: توصیه ی اکید می کنیم که به هنگام تعریف متغیرها همیشه یک متغیر اضافی (آزاد در علامت) نیز با نام دلخواه تعریف کنید. جهت روش تر شدن موضوع به این موضوع دقت کنید که وقتی شما یک مسئله را کمینه یا بیشینه می کنید، همیشه برای تابع هدفتان یک نام تعریف می کنید. نامی که در این مثال برای تابع هدف تعریف شده است Z می باشد. پس باید دو متغیر x و z را به صورت آزاد در علامت تعریف کنیم

Example1-Variable-Def

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

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

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

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

 

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

422 دیدگاه

  1. امین

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

    1. محمودی

      سلام
      ممنون
      چشم حتماً. وقت کردیم حتماً Error های GAMS رو حتما توضیح میدیم.
      موفق باشین.

      1. حسین

        سلام ارتباط بین متغییر حالت با صفر ها و قطب ها رو میدونیی؟

  2. فاطمه

    سلام

    مطمئنید کدها درسته؟
    اخه داخل positive variable و… که ابعاد متغیر نوشته نمیشه…

      1. فاطمه

        اوکی متوچه شدم.مرسی

        من تو مدلم یه متغیر موجودی دارم که سه اندیسه است و مقدارش برای دوره صفر ثابت است
        t دوره (۳ تا دوره)
        tt دوره صفر
        i مشتری( مثلا ۲ تا مشتری)
        r کالا (۲ تا کالا)
        میخام بگم موجودیم بری دوره صفر برای هر محصولی در هر مشتری برابر یه مقدار ثابت است و برای بقیه دوره متغیره.

        چه جوری بنویسم؟
        positive variable
        I(i,t,r
        ;
        I.fx(i,tt,r

        ؟؟ مثل جدول بنویسم

        باتشکر

        1. محمودی

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

          set tt/0,1*3/
          t(tt)/1*3/
          ;

          بعدش متغیر I رو باید تعریف کنید و مقدار اولیه رو صفر بگیرید.
          به شکل زیر:

          variable II(i,tt,r)
          ;
          I.fx(i,"0",r)=Constant;

          تو کد بالا به جای constant اون مقدار اولیه رو قرار بدین.
          توجه داشته باشید وقتی مجموعه I هم تعریف کردید دیگه متغیر I باید اسمش فرق داشته باشه، مثلا II بشه.
          مقداری هم تو فرمول نویسی دقت کنید که t رو بزنید یا tt رو.
          موفق باشید

  3. ستاره

    سلام
    خیلی عالی بود… ممنون از مطالب خوبتون.. استفاده کردم.. 🙂

  4. ali

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

    1. محمودی

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

      Binary Variable x;
      Variable Y;

      x صفر و یک بوده و y همه عددی می تونه بگیره.
      متن همین صفحه رو بخونین.
      موفق باشین

      1. ali

        سلام، ممنون از راهنماییتون.
        به امید موفقیت روزافزونتون.

        1. محمودی

          ممنون علی عزیز
          شما هم همینطور

  5. مهدی

    سلام. ببخشید من یک سوال در مورد گمز داشتم
    من یک متغییر X دارم که free variable هست. حال می خواهم یک y تعریف کنم که اگر x>0 بود y=x شود در غیر این صورت (یعنی X<=0).
    سوال من این است آیا می شود قبل از مدل این کار را انجام داد؟ یعنی یک y تعریف کرد که شامل مقادیر مثبت x باشد؟

    1. محمودی

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

      1. مهدی

        سلام متشکرم که جواب دادین.
        مگر در قیود هم می توان از if then .. استفاده کرد؟
        میشه یک نموه برا همان x و y که در سوالم پرسیدم بنویسید؟
        متشکرم

        1. محمودی

          این یه مثاله:

          c1.. x=e=ifthen(t>3,y,y+1) ;

          یعنی x مساوی y هست اگر t از ۳ بزرگتر باشد. در غیر این صورت x=y+1 است.

      2. امید

        سلام برای وقتی که به ازای یک شرط، چندتا متغیر مقدار میگیرن چی؟ مثلا همین که نوشتید
        c1.. x=e=ifthen(t>3,y,y+1) ;
        اگه به ازای t>3 داشته باشیم x=y , p=w , u=r چطور نوشته میشه؟ تک تک؟

        1. محمودی

          با and از هم جداشون کنین.

          ifthen( u=r and p=w,..)
          
  6. بهاره

    با سلام

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

    1. محمودی

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

  7. هنگامه

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

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

  8. بهاره

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

    1. محمودی

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

      variable x(i,t);
      x.fx("1",t)=0;

      توجه کنین که fx همون fix کردن یک متغیر هست.
      پاینده باشید

  9. هنگامه

    یک برنامه ای دارم می نویسم که یک سری متغیر دو اندیسه را باید بده به عنوان مثال beta(i,j) وقتی این متغیر رو معرفی می کنم اررورuncontrol set entered as constant می ده.
    کلا چه جوری باید این متغیرهای دو و یا چند اندیسه را معرفی کنم.ممنون میشم به سوالم جواب بدین

    1. محمودی

      سلام
      مشکلی نداره تعریف یه متغیر. فقط حواستون باشه که سیمیکالون هاتون رو همیشه و با دقت بذارین. معمولا دستور table مشکل واسه متغیر ها ایجاد میکنه. اینو یادتون نره. بعد هر دستوری = سیمی کالون.
      مثالهای تعریف متغیر تو همین تاپیک موجودن

  10. بهاره

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

    1. محمودی

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

      variable x;
      x.up=200;

  11. ایمان

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

    1. محمودی

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

  12. مهدی

    سلام وخسته نباشید
    من نرم افزار گمز و متلب رو لینک کرده ام و به راحتی می توانم از متلب یک عدد اسکالر را به Gams بفرستم و سپس نتایج شبیه سازی رو به متلب برگردانم.
    ولی الان نیاز دارم یک ماتریس بفرستم و در Gams به یک Table تبدیل کنم. حال موندم چطوری در گمز یک Table خالی بنویسم.
    میشه کمکم کنید؟ خیلی سپاسگذارم
    من خودم این دستورو مینویسم ولی وقتی از متلب داده میفرستم جدول رو پر نمیکنه.
    sets i /1*2/
    j/1*32/;
    Table Y(i,j)
    / 1
    1
    ;

  13. مهدی

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

  14. MOHSEN

    سلام
    تشکر از مطالبتون
    در قسمت ۴٫ مقدار کنونی یک متغیر دستور داده شده اشتباه است.لطفا اصلاح فرمایید.
    دستور از ۳٫ ثابت کردن یک متغیر

    * How to assign a attribute to the variables
    variable x ;
    x.fx=5 ;
    variable y(j) ;
    y.fx(j)=10; کپی شده

  15. میثم

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

  16. fatemeh

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

    باتشکر

    1. محمودی

      سلام
      مدلتون نشدنی هست احتمالا، و یا اینکه تایپ مدلتون رو گذاشتین rminlp که از آزاد سازی استفاده می کنه
      خواهش میکنم

      1. fatemeh

        مرسی

        مدلم مسیریابی داره…برای داده های کوچیک ران کردم…متغیر رو صفر و یک درمیاره…ولی داده ها مو بزرگ میکنم…پیوسته در میاره

        با minlp حل کردم….

        احتمال داره ایراد از لایسنس باشه؟ مثلا گمز و لایسنس بهم نخورن؟

        1. محمودی

          سلام
          اگه جواب داده که خیر همچین مشکلی وجود نداره. مشکل نشدنی بودنه ظاهرا
          خواهش میکنم

        2. fatemeh

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

          فقط یه سوال. من مثالمو بزرگتر تر از ۲۰ مشتری میکنم گمز ۱۶ دقیقه حل میکنه بعدش بدون اینکه جوابی بده متوقف میشه…بخش solvar نیست..مشکل از چیه؟

          باتشکر

        3. محمودی

          سلام
          شرط توقف در گمز یکیشون زمانه. به صورت دیفالت گمز هزار ثانیه یا ۱۶ دقیقه متوقف میشه.
          خواستین بیشترش کنین کد زیر رو به اول مدلتون اضافه کنین:

          Option reslim=3600;

          3600 یعنی بعد انقد ثانیه متوقف شو
          خواهش میکنم

  17. n.z.

    با سلام
    قبل از هر چیز از مطالب مفیدی که در سایت قرار می دهید تشکر می کنم. من یک سوال در مورد تعریف متغیرها دارم. یک مجموعه ۳۵ عضوی برای j دارم که یکی از متغیرهای مدل تنها می تواند مقادیر ۱۰و۱۳ و ۱۵ را از بین این مجموعه اختیار کند. چگونه می توان بیان نمود که این متغیر تنها به ازای اندیس های فوق برقرار است.
    ممنون

    1. محمودی

      سلام
      روش اول، برای اینکار باید از ابتکار عمل داشته باشین. میتونین متغیر رو به ازای j تعریف کنین و این متغیر رو روی یه مقدار که وجودش رو بی معنی میکنه فیکس کنین (مثلا بگین که مقدارش ۱۰۰۰۰۰ میشه و اگه این بشه تاثیری رو جواب نداشته باشه) بعد تو خط بعدی بگین که همین متغیر به ازای ۱۰و۱۳و۱۵ مقدار (level, .L) منطقی رو بهش بدین. چون اگه این کارو بکنین به مدل اجازه میده که به متغیر به ازای این سه عدد بتونه مقدار بده.
      روش دیگه اینه که همچین متغیری تعریف نکنین و صرفا سه متغیر دیگه تعریف کنین و تو دهنتون مثلا x1 رو همون x(“10”) بگیرین و بقیه ماجرا
      روش دیگه اینه که این متغیر رو تعریف کنین. مثل X(j) و j رو هم با مثلا jj آلیاس alias کنید. بعد هرجا x(jj) و j داشتید با استفاده از شرط بگین که jj باید برابر این سه تا باشه
      روش چهارم اینه که بعد اینکه مجموعه رو تعریف کردید، یک مجموعه دیگه تعریف کنید که زیر مجموعه مجموعه اولی باشه و فقط این سه عو توش باشه. مناسب ترین روش احتمالا روش آخره
      چقد زیاد شد
      موفق باشید

  18. MOHSEN

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

  19. amin

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

    1. محمودی

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

  20. amin

    سلام
    من یه متغیر اینتیجر تعریف کردم ولی جوابش ۱۶٫۱۲۵ شده .
    مگه میشه؟؟؟؟؟؟

  21. پردیس

    سلام
    من میخوام در مدلم یکی از متغیرهای باینری رو ریلکس کنم. یعنی فقط یکی از متغیرهای باینریم بجای ۰ یا ۱، مقداری بین ۰ و ۱ داشته باشه. میشه راهنماییم کنید؟
    ممنون

    1. محمودی

      سلام
      نوع متغیر رو positive تعریف کنید و برای upper bound و lower bound تعریف کنین.
      برای اطلاع از این دو ویژگی به بخش متغیرها مراجعه کنین
      موفق باشین

      1. پردیس

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

  22. samin

    سلام و تشکر از سایت و پاسخگویی بی نظیرتون.
    من یه سوال در مورد تعریف اندیسها دارد.
    فرض کنید یه مجموعه U دارم که اجتماع دو مجموعه I و L هست. تا اینجاش رو همونطور که خودتون گفته بودین نوشتم.

    کد این قسمت و تو کامنت بعدی گذاشتم

    حالا برای اینکه مشخص کنم مثلا هرجا ۱ تا ۳ استفاده شد، منظورم مجموعه I بوده و هرجا اندیس ۴ تا ۸ استفاده شد، منظورم مجموعه L بوده، باید چیکار کنم. چون فرض کنید یه مسأله مسیریابی داریم که همه نقاط تو مجموعه U اومده و وقتی داریم جدول فاصله رو تعریف می کنیم، فاصله همه گرهها رو توش نمایش میدیم. اما گاهی فقط با مجموعه i که مثلا انبارها هست سروکار داریم. ممنون

    1. محمودی

      سلام
      ممنون و خواهش میکنم
      کافیه که تو اون محدودیی که متغیر یا پارامتری که استفاده میکنین، به جای u بذارین i یا L.
      یعنی شما یه بار مثلا x(u) رو تعریف میکنین، سری بعد مثلا تو محدودیت اول باید فقط مقادیر i رو بگیره. پی اونجا میزنین x(i).
      به همین سادگی

  23. samin

    خیلی ممنون از جواب سریعتون. من البته یه کار دیگه کردم، اونحایی که set تعریف میشه، اندیس ها رو دستی و برای j از ۱ تا ۳ و برای i از ۴ تا ۸ گذاشتم و درست شد. خیلی ممنون.
    یه سوال دیگه هم دارم، من دو متغیر دارم که یکیش غیر منفی (non negative) و اون یکی باینریه. میخوام در صورتی که متغیر اولم مقدار بزرگتر از صفر میگیره، متغیر دومم مقدار یک بگیره و در صورتی که متغیر اولم صفر میشه، دومی هم صفر بشه. میخوام به صورت محدودیت بنویسمش.
    سوالم OR ایه، میدونم ولی احتمالا شما میتونین جواب بدین.
    بازم ممنونم

    1. محمودی

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

  24. elham

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

    generating MINLP model test
    Error at line 123: Equation infeasible due to rhs value
    United_8.gms(153) 4 Mb 1 Error
    ...

    1. محمودی

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

      1. elham

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

        1. محمودی

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

  25. MOHSEN

    با سلام
    من یه محدودیت دارم که باید خطی بشه . ولی تو محدودیت متغیر لگاریتمی دارم. جطور می تونم تغییر متعیر رو اجرا کنم. مثلا فرض کنیم در محدودیت اول داشته باشیم
    log x1+ x2=L=10
    چطور می تونم تغییر متغییر بدم. مثلا
    t=log x1
    تا محدودیت به فرم t+x2=l=10 تبدیل شودو خطی شود.
    با تشکر

    1. محمودی

      سلام
      همین روشتون صحیحه. ولی باید t رو متغیر تعریف کنین. و به حدود واقعی t توجه کنین! مقداری دقت کنین بهش. بعد اینکه برنامه هم جواب داد، یه پارامتر به اسم x1 تعریف کنین و مقادیر t رو به x1 تبدیل کنین
      موفق باشین

  26. دریا

    سلام
    یک سوال داشتم بزرگوار

    من یک ست به این صورت تعریف کرده ام
    set i pump /1,2/ I
    الان اگر بخوام به پمپ یک و ۲ دو هر کدام یک عدد مجزا بدهم چطور باید آدرس دهی کنم؟
    چون اگر اینجوری بنویسم p(i).L=4
    هم پمپ۱ رو ۴ در نظر میگیره هم پمپ۲ رو
    اما من میخوام به پمپ ۱ مقدار ۴ بدهم و به پمپ۲ مقدار۱۰

    ممنون میشوم راهنماییم کنید
    متشکرم

    1. محمودی

      سلام این روشا خوبه:

      Parameter a(i) /1 4,2 10/ ;
      Or
      Parameter a(i);
      A("1)=4;
      A("2")=10;

      موفق باشین

  27. s.m

    سلام شبتون بخیر واقعا شرمنده ام من دوباره مزاحمتون شدم سؤالی داشتم از حضورتون
    اگر یک متغیر داشته باشیم به نام (X(i,j,k,t که باینری هست و این محدودیت برای هر (i,j) عضو (E(i,j برقرار باشه (عرض کرده بودم خدمتتون که (E(i,j زوج مرتب های (i,j) هست که در اون i از j کوچیکتره) و در اون i باید مخالف صفر باشه، حالا یک متغیر دیگه داریم به نام (X(0,j,k,t که فقط مقادیر ۰ و ۱ و ۲ رو می تونه شامل بشه.من این دو محدودیت رو نمی دونم چطور تعریف کنم اگر کمکم کنید ممنونتون میشم.

    1. محمودی

      سلام
      ببینید شما می تونید که i1 رو به عنوان مجموعه مرجعتون تعریف کنین. این محموعه مرجع شامل مقادیر i هست به علاوه مقدار صفر. پس شما بهتره مجموعه i رو زیر مجموعه i1 تعریف کنین. به این شکل: (فرض کنیم که i از یک تا ده باشه)

      set i1/0,1*10/
      i(i1)/1*10/;

      بعد شما نیاز دارین که X رو تعریف کنین. x رو هم به صورت زیر می تونین تعریف کنین. این تعریف به شما این امکان رو میده هرجا بخواین ۰ رو به کار ببرین یا i رو:

      variable x(i1,j,k,t)

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

      1. s.m

        سلام جناب محمودی،ممنون از پاسخگوییتون. فکر کنم شما متوجه منظور بنده نشدید سوال من اینه که ما فقط توی محدودیتها با دستور $ روی دامنه ها شرط می ذاریم ولی الان من این شرطو میخوام توی تعریف متغیر بذارم مثلا توی تعریف متغیر من (X(i,j,k,t عضو مجموعه {۰و۱} هست ولی جلوش این شرط رو داریم که :
        (i,j)∀ که عضو (E(i,j هستش و i≠۰ و هر k عضو K و هر t عضو T
        مشکل من اینه این متغیر تو هیچ محدودیتی نیست که اگر بود من این شرطها رو همونجا براش میذاشتم و این متغیر فقط توی تابع هدف تعریف شده.من این شرطایی که جلوش هست رو نمی دونم کجا براش تعریف کنم.
        و اینکه قسمت دوم سؤالم اینه که همین متغیر در صورتی که i برابر صفر باشه یعنی (X(0,j,k,t علاوه بر مقادیر ۰و۱ مقدار ۲ رو هم می تونه اختیار کنه بنظرتون برای تعریف این متغیر بصورت زیر بنویسم درسته؟
        /set j/1*5
        /set jj/0
        (semiint variable X(jj,j,k,t
        X(jj,j,k,t).lo=0
        X(jj,j,k,t).up=2

        1. محمودی

          سلام
          ببینید تو قسمت متغیر، شما نمیتونید این شرط ها رو بذارین. به یاد داشته باشین یه متغیر فقط وقتی تو معادلات استفاده میشه معنی پیدا میکنه. پس شما یه بار X رو تعریف میکنین، تو مرحله بعد، هر جا X استفاده بشه شرط رو می تونین براش بذارین.
          سوال دوم، بله همینی که تعریف کردین درسته. فقط دقت کنین که هر چی کدتون ساده تر باشه ویرایش و فهمش آسون تره. پس خیلی ساده تعریف کنین X1(i,j,k,t) به یک متغیر باینری هست و متغیر x2(j,k,t) یک متغیر شبه صحیحه.

  28. هادی

    سلام
    سوال داشتم از حضورتون

    من میخواستم یک متغیر رو محدود کنم مثل نرخ بهره که حد بالا و پایین داشته باشه اما وقتی حد بالا و پایین تو بخش اسکار میذارم دستگاه حل نمیشه. دلیلش اینه که من ۱۵۷ متغیر و ۱۵۷ مجهول دارم اما دستگاه میگه متغیرهای آزادت کمه البته جفتش رو ۱۵۷ نشنون میده

    SCALAR
    ROWCLOS rest-of-world closure /1/;
    FSAV.FX = FSAV0;
    EXR.LO = -INF;
    EXR.UP = +INF;
    EXR.L = EXR0;

    RT.LO = 0;
    RT.UP = 0.21;
    RT.L = RT0;

    در بخش جواب هم اینو میگه


    MODEL STATISTICS

    BLOCKS OF EQUATIONS 48 SINGLE EQUATIONS 157
    BLOCKS OF VARIABLES 46 SINGLE VARIABLES 157
    NON ZERO ELEMENTS 583 NON LINEAR N-Z 254
    DERIVATIVE POOL 10 CONSTANT POOL 105
    CODE LENGTH 772

    **** Unmatched variable not free or fixed
    RT

    **** Counts do not match
    Single equations in unmatched =E= blocks 157
    Unmatched single free variables 156

    **** Unmatched free variables = 156

    1. محمودی

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

      1. هادی

        Variables
        RT loan rate of return;

        Equation
        YBANKDEF.. YBANK =E= (rt * LOANT) – (R * TDT);

        Initial value
        RT0 = SUM(INSDNG,SAM(‘DBK-CA’,INSDNG))/SUM(CAPINSNGP, SAM(CAPINSNGP,’DBK-CP’));

        RT.L = RT0;

        DISPLAY
        RT.L;

        RT.LO = 0;
        RT.UP = 0.21;
        RT.L = RT0;

        DISPLAY RT.UP ;

  29. هادی

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

    RT.LO = -INF;
    RT.UP = +INF;
    RT.L = RT0;

    بزنم قبول میکنه و جواب میده.

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

    1. محمودی

      سلام
      model type رو CNS گذاشتین؟ یا شایدم MCP؟
      فرض میکنم از این دو استفاده کردین. ببینین MCP این محدودیت گذاشتن رو قبول نمیکنه! باید کاملا آزاد باشه متغیرتون. به جاش سعی کنید که یه معادله دیگه به فرمول هاتون اضافه کنین به شکلی که این محدودیت بازه رو که میخواین برای متغیر اعمال کنین رو نشون بده. دیگه با ابتکار خودتون.
      اگه اینا رو نتونستین یه کار دیگه هم میشه کرد. اینکه شما یک متغیر رو optimize کنین با ی چیزی مث dnlp. فعلا گذارش رو بدین تا عرض کنم

  30. هادی

    نه کل کد اندازه یه دفتر صد برگه. تو وورد میشه صد صفه. اما کدهای مربوط به این متغیر همینه.

  31. s.m

    سلام،بله شما درست می فرمایید الان متوجه اشتباهم شدم راستش من یک محدودیت دارم که این متغیر توی اون استفاده شده ولی چون این محدودیت برای هر زیرمجموعه ۲ تایی و ۳ تایی و … از مجموعه j باید برقرار باشه استادم به من گفت که چون ممکنه loop ایجاد بشه من این محدودیتو تو مدلم نذارم و در آخر که جوابهامو از مدل گرفتم بصورت دستی بررسی کنم که آیا این محدودیت نقض میشه یا نه؟حالا نمی دونم این کارو بکنم یا نه چون فکر کنم به احتمال زیاد بیشتر جوابهام توسط این محدودیت نقض بشه
    امکانش هست من این محدودیتو براتون اینجا بنویسم تا شما نظرتونو راجع بهش بفرمایید؟شرمنده م ممنون میشم از لطفتون

    1. محمودی

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

      1. s.m

        سلام،وقتتون بخیر
        N مثلا مجموعه {۰,۱,۲,۳,۴,۵} و E مجموعه ی (i,j) هایی هست که در اون i,j عضو N هستن و i<j هستش. (E(S هم مجموعه ی (i,j) هایی از E هست که در اون i,j عضو S هستن(S زیرمجموعه N هستش.(X(i,j,k,t و (z(i,k,t هم هر دو متغیرن.
        حالا محدودیت من اینه

        ((sum(i$S,z(i,k,t))-z(e,k,t)=g=sum((i,j)$E(S),X(i,j,k,t

        و این محدودیت برای هر S زیرمجموعه N که حداقل دو عضو داشته باشه(ینی مجموعه های ۲ تایی و ۳ تایی و … و ۶ تایی) و برای هر e عضو مجموعه S و برای هر k و t برقرار هست.
        ممنون ازتون

        1. محمودی

          مرسی همچنین.
          مجموعه E رو عرض کردم خدمتتون تو یکی از کامنتا.
          الان مهمترین چیزی که نیاز دارین، تعریف مجموعه s هست. این مجموعه رو میتونین با استفاده از کامنتی که برای آقای غفاری در بخش مجموعه ها گذاشتم تعریف کنین.
          درصورتی که S رو خوب تعریف کنین، فکر میکنم با این اوصاف تمام اون چیزی که نیاز دارین رو فهمیدین. اون کد رو تو گمز کپی کنین و یه بار ران کنین و نتایجش رو ببینین. بعد میفهمین چیکارش کنین
          موفق باشین

        1. s.m

          سلام و وقت بخیر.براتون کامنت گذاشته بودم و اون محدودیتو توضیح داده بودم ولی مثل اینکه نرسیده دوباره براتون می نویسمش.
          یک مجموعه به اسم N داریم که مثلا شامل اعداد {۰,۱,۲,۳,۴,۵,۶} هستش. E مجموعه ای از زوج مرتب های بشکل (i,j) هست که در اون i,j هر دو عضو N هستن و i<j هستش.
          (E(S هم مجموعه (i,j) هایی از E هستش که در اون i , j عضو مجموعه S هستن.(فرض می کنیم S زیرمجموعه N هستش). در ضمن (X(i,j,k,t و (Z(i,k,t هر دو متغیر هستند.

          حالا محدودیتی که من دارم به این شکل هستش:

          (sum((i,j)$E(S),X(i,j,k,t))=l=sum(i$S,Z(i,k,t))-Z(e,k,t

          و این محدودیت به ازای هر S زیرمجموعه N که اندازه ش بزرگتر مساوی ۲ هست برقراره(ینی زیرمجموعه های ۲عضوی و ۳ عضوی و… تا ۶ عضوی) و برای هر e عضو مجموعه S , هر k و هر t ای برقراره.
          میشه لطفا کمکم کنید.خیلی خیلی ممنونتون میشم

  32. m

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

    ۱٫ در حالتی که مساله دو هدفه باشه، روش اپسیلون به چه صورتی هست و باید چیکار کنیم؟

    ۲٫ و اینکه نتایجی که تولید می کنه به صورت چندهدفه هست؟یعنی هربار اجرا به تعداد اهدافمون عدد میده؟

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

    خیلی ممنونم

    1. محمودی

      سلام
      ۱٫ خب مدل رو طبق متدی که ارائه شده کد می کنین و ازش جواب میگیرین.
      ۲٫ به تعدادی که مسئله رو تقسیم میکنین جواب برای تابع هدفاتون ارائه می ده. مثلا برای هر کدوم ده عدد بهتون میده
      ۳٫ کد متلب اگه منظورتون الگوریتم های فرا ابتکاری و ابتکاریه، این جوابا دقیق نیستن هر چند ممکنه جواب دقیق رو بدن. کلا هر وقت بخواین دو رویه رو با هم مقایسه کنین باید مقیاس داشته باشین، بعضی مقیاس ها شامل اینا هستن: زمان حل توسط هر رویه، تعداد تکرار برای رسیدن به جواب، گپ هر کدام در یک زمان مشخص و …
      خواهش میکنم و موفق باشین

  33. سمیرا

    سلام . وقتتون بخیر و ممنون از این همه وقتی که میزارین
    یه سوالی داشتم . خواستم بپرسم علامت دلار یا همون $ برای چه موقعی استفاده میشه ؟
    من تو مدلم یه مجموعه ای رو تعریف کردم که در اونS>(d(i,j))
    حالا میخوام در یک سامیشن به عنوان کران پایین، j رو عضو این مجموعه تعریف کنم
    میشه کمکم کنید ؟

    1. محمودی

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

  34. شبنم

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

  35. الناز

    سلام،
    من توی گمز خیلی مبتدی ام. یه سواله هرجا میگردم جوابشو پیدا نمیکنم. اگر بخوام بنویسم جمع Xi,j ها به شرطه که i با j برابر نباشد، موقع استفاده از sum چجوری شرط برابر نبودنو بیارم؟ اصلاً علامت نا مساوی تو گمز چیه؟
    با تشکر

  36. حمید

    سلام
    من میخوام مقدار اولیه یک متغیر رو در زمان صفر برای گمز تعریف کنم، طول دوره زمانی ۲۴ ساعت، و میخوام در زمان صفر مقدار ثابتی به یکی از متغیرهای وابسته به زمانم بدم
    اما متاسفانه به مشکل خوردم، اگه لطف کنید راهنمایی کنید ممنون میشم…

    t /1*24/

    1. محمودی

      سلام
      یه t1 تعریف کنین که t زیر مجموعه اون باشه

      Set t1/0*24/
      T(t1)/1*24/;

      بعد به اون t1=0 مقدار اولیه بدین. دقت کنین که متغیر هم باید به ازای t1 تعریف بشه.

  37. s.m

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

    1. محمودی

      جوابتون دقیق نیست. کد زیر رو به ابتدای کدتون اضافه کنین. اگه همه جوابها رو صفر کرد، مشکل از مدلتونه و نشدنیه و باید تغییرش بدین.

      option reslim=1000;
      option optcr=0;

  38. s.m

    و اینکه چرا مقادیر متغیرهای تصمیم در خروجی پراکنده هستند؟

    1. محمودی

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

      1. s.m

        تغییری ایجاد نشد، در ماتریس متغیرهای تصمیم باینری تعدادی ۱ و مابقی اعداد اعشاری مثبت و اعشاری منفی هستند!
        آیا در صورتی که z آزاد در علامت باشد جواب داریم و منفی است؟ z باید آزاد در علامت در نظر گرفته شود؟

        1. محمودی

          خب سالور رو بزنین روی بارون. بعد دوباره ران کنید. نتیجه رو بگید

    1. محمودی

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

        1. محمودی

          دو یا چندتا از محدودیت ها با هم تناقض دارن. اونا رو باید دستکاری کنین. یا محدودیت ها ، داده ها…
          بهتره سر به سرش بذارین دیگه. تحلیل کنین مدل رو

  39. s.m

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

  40. محمد

    با سلام و تشکر از زحماتتون
    در صورتی که روی یک متغیر شرط داشته باشیم و در equation لحاظ کنیم روش چیست؟
    مثلا اگر متغیر Pi بزرگتر از متغیر Pj باشد از رابطه زیر استفاده شود:
    P=sqrt Pi-Pj , و در غیر اینصورت P=sqrt Pj-Pi

    1. با سلام ممنون
      در محدودیت ها می توان از دستور ifthen استفاده کرد.

      (ifthen(condition, expressioniftrue,expressioniffalse

  41. مهلا

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

    1. محمودی

      سلام
      یه مجموعه مرجع تعریف کنین که همه این مجموعه هایی که g و h شامل میشن رو شامل بشه، بعد g و h رو از رو اون انتخاب کنید. یا میتونین x رو به صورت x(*,*,k) تعریف کنین و هر بار چیزی که میخواین رو به کار ببرین. اگه جوابتون رو نگرفتین بیشتر صحبت کنید در مورد مجموعه ها و چگونگی استفاده شون.

      1. مهلا

        مرسی از کمکتون
        برای وارد کردن ∀s⊂i∪j∪k ,i∪j⊆s
        و xghv≥۱ ∑ که h∈{i∪j∪k}-s,g∈s,v∈V باید چطوری مجوعه ها و محدودیت رو وارد کنم؟

        1. محمودی

          i و j و k رو تعریف کنید.
          بعدش با دستور زیر اینا رو اجتماع بگیرید ازشون.

          set s/set.i,set.j,set.k/

          بعد:

          c1(g,h,v)$(ord(h) ne ord(g)).. x(g,h,v)=g=1;

          دقت کنید که باید s,h,g هر سه آلیاس هم باشن.
          جهت اطلاعات بیشتر به بخش مجموعه‌ها مراجعه کنین.

      1. مهلا

        سلام من سیگما زدم ولی ارور میده.میشه دستور قبل رو با سیگما بنویسید(سیگما روی هر سه اندیس g,h,v می باشد)

        1. محمودی

          سلام

          c1.. sum((g,h,v)$(ord(h) ne ord(g))x(g,h,v)=g=1;

          اگه درست نوشته باشم البته

  42. مرضیه

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

    1. محمودی

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

  43. m.m

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

    1. محمودی

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

  44. با سلام و ضمن تبریک سال نو
    با توجه به اینکه برای تعریف توان دوم یک متغیر باید از علات ** در گمز استفاده کرد، اما بنده پس از استفاده این علامت ، در خروجی نرم افزار ضریب متغیر مربوطه را صفر کرده (به جای اینکه به توان دو برساند) در نتیبجه جوابی بدست نمیدهد.
    کد به صورت زیر است:
    eq9(j)..(v2(j))**2=g=a(‘3’,j)*r(j);
    ولی در خروجی به صورت زیر نشان داده میشود:
    —- eq9 =G=

    eq9(1).. (0)*v2(1) – 20*r(1) =G= 0 ; (LHS = 0)

    eq9(2).. (0)*v2(2) + 35*r(2) =G= 0 ; (LHS = 0)

    eq9(3).. (0)*v2(3) – 14*r(3) =G= 0 ; (LHS = 0)

    لطفا کمکم کنید.;)

    1. محمودی

      سلام
      احتمالا مدل شما یه طوریه که v2 صفر میشه همیشه. یا بهتره براش صفر بشه

      1. در حالت کلی هم هنگامی که یک متغیر به توان دو را مینویسم ، (حتی بدون سایر محدودیتها و …) نمیتواند توان دو را نشان دهد و به جای آن ضریب را صفر میگذارد.(در حالیکه استفاده از علامت ** برای اعداد چنین مشکلی را پیش نمیاورد.)
        با تشکر

        1. محمودی

          سلام
          جالبه. منم الان دقت کردم. کد زیر رو کپی کنین و ران کنین. هر بار به جای ۱+x یه عدد دیگه بذارین. هر سری سر خود یه عددی میده که منم نمیفهممش.

          positive variable x;
          variable z;
          equation obj;
          obj.. z=e=(1+x)**2;
          model a /all/;
          solve a using nlp minimizing z;
          display z.l,x.l;

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

  45. محسن

    با سلام و ادب
    خسته نباشی استاد

    اگر در تایع هدف، یک پارامتری همانند d(i,j,t) در مخرج کسر وجود داشته باشد که برخی از آرایه های آن صفر باشد، سبب می شود تابع تقسیم بر صفر شود و ارور دهد.
    شرط $ را باید کجا نوشت؟
    تمام کامنتا رو بررسی کردم، دیدم همیشه در محدودیت شرط گذاشتید، آیا در توی تابع هدف، در کجا باید شرط کجاست؟

    OF1 .. z1=e= sum((i,j),ATAW(i,j,t)/d(i,j,t))

    1. محمودی

      سلام.
      اولا تو دستور sum اندیس t رو فراموش کردین. ثانیا اینجا:

      sum((i,j,t)$(d(i,j,t) ne d(i,j,t)),.....)

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

  46. افرا

    سلام.ببخشید میدونم خیلی سوال پرسیدم.میشه بگید خطی سازی x/y چه طور باید انجام بشه؟

    1. سلام ! Z=X/Y بگیرین و طرفین وسطین کنین که تقسیم به ضرب تبدیل بشه. و با توجه به نوع متغیر هاتون (باینری یا عدد صحیح) روش هایی برای خطی کردن وجود داره! توضیح بدین x و y نوعشون چیه!

      1. افرا

        سلام.ممنون از پاسخ گویی شما.هر دو متغییر عددصحیح هستند.

        1. امید

          سلام وقتتون بخیر میشه این جزوه رو برا منم بفرستین؟ خیلی حیاتیه برام. ممنون

      2. ثمین

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

        1. KM

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

        2. محمودی

          سلام
          جزوه مدونی نداریم. مشکل چیه

  47. طریقت

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

    1. محمودی

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

      1. طریقت

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

        c13(t,p) .. Big_number*abs(t-landa(p))=g=1-aa(t,p);
        c14(t,p) .. abs(t-landa(p))=l=(1-aa(t,p))*Big_number;
        c15(t,p) .. Big_number*abs(t-mio(p))=g=1-bb(t,p);
        c16(t,p) .. abs(t-mio(p))=l=(1-bb(t,p))*Big_number;
        c17(t,p) .. sum((tt,p) $ (ord(tt)<t+1),aa(tt,p))-sum((tt,p) $ (ord(tt)<t+1),bb(tt,p))=l=Qauc;

        متغیرهای aa و bb متغیرهای صفر و یک هستند که بررسی میکنند آیا پالت p در لحظه t به سیستم وارد و از اون خارج شده یا نه
        من تنها راهی که به ذهنم میرسه اینه که جاهایی که از t به عنوان متغیر استفاده کردم جاش l(t) رو بزارم و در پارامترها l(t) را به صورت نظیر به نظیر با t تعریف کنم ولی با توجه به زیاد بودن تعداد بازه های زمانی این کار خیلی سخت میشه.
        خیلی ممنون

        1. محمودی

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

  48. رویا

    سلام
    می خواستم بدونم مقایسه پارامتر و اندیس در گمز غلطه؟

    loop(j,
    if(a(“1”,j) = 1,
    cnt = 0;
    ******while(cnt > j,
    cnt = cnt + 1;
    );
    b(“1”,j) = cnt;
    );
    );
    ممنون می شم کمک کنید

  49. آزاده

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


    1. – S = Sum((i,j)$(q(i,j)>0),q(i,j));

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

      1. محمودی

        جهت تکمیل فرمایشات خانم رمضانی،
        شما دو راه اساسی دارین (حداقل من فعلا اینا به ذهنم میرسه):
        یا اینکه مث خانم رمضانی که فرمودن لوپ تعریف کنین و هر بار اضافه کنین ببینین کدوم بهینه ست.
        یا اینکه اگه بتونین محدودیتتون رو جوری بنویسین که دستور ifthen رو بتونین توش پیاده کنین که خوب میشه براتون. ifthen رو تو کامنتای بخش معادلات تشریح کردیم. مثلا شرط بنویسین که اگه t

  50. اسماعیلی

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

    1. محمودی

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

      1. اسماعیلی

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

        1. محمودی

          سلام
          مجددا عذرخواهی میکنم. ولی خوب مطرح نمیکنین سوالتون رو. لطفا با x و y و a و i و j توضیح بدین. و بگین هر کدوم چه نقشی دارن. فکر میکنم مشکل ساده تر از این باشه که پیچیده شده الان.

  51. Ehsan.Safaei

    سلام. من در مدلم ضرب دو عدد صحیح رو دارم که مدل من رو غیر خطی کرده. برای خطی سازی چه کنم؟

    1. محمودی

      سلام
      متغیرای عدد صحیحتون باینری هم هستن یا فقط عدد صحیحن؟

      1. Ehsan.Safaei

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

        1. محمودی

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

          x=l=u*M;
          y=l=(1-u)*M;

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

        2. Ehsan.Safaei

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

        3. محمودی

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

  52. روح الله

    سلام. اگر متغیر مجهول ما بین دو حد بالا و پایین که دو متغیر معلوم هستند بود،
    مثلا L(j)<Q(j)<U(j)l بود که Q متغیر مجهول و L و U دو پارامتر معلوم که در قسمت پارامترها تعریف و مقداردهی شده اند بود، این عبارت را به صورت دو نامساوی و دو محدودیت جداگانه در قسمتی که محدودیتها را تعریف میکنیم می آوریم یا در قسمت تعریف پارامترها؟

  53. اسماعیلی

    بسیار سپاسگزار.خوشبختانه مشکل حل شد.الان یه مشکل دیگه دارم.ممنون میشم راهنماییم کنید.
    فرض کنید مجموعه i از اجتماع دو مجموعه w,d بدست میاد.حالا یه سری از محدودیت های ما به ازای هر w است.این رو چطوری باید در گمز بنویسیم؟

  54. pouya

    سلام. ببخشید مزاحم شدم. من تو کدم متغیرهای باینری تعریف کردم و البته مساله به صورت MINLP است. منتهی پس از run و نمایش جوابها، این متغیرها به صورت اعشاری حل شده‌اند. مثلا ۰٫۲ یا ۰٫۸۹٫ مشکل از کجاست؟

    1. محمودی

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

  55. pouya

    ضمنا با هر solver که بگین، حل کردم و حتی با rminlp هم حل کردم. ولی تو فکر کنم تو همشون اینجوری میاد.

  56. پوریا

    با سلام و قدر دانی از شما
    حاصلضرب دو متغیر پیوسته که همزمان نمی توانند مقدار بگیرند به چه صورت خطی می شه؟ مثلا x.y=0 که هیچکدام باینری نیستند و در صورت مقدار گرفتن یکی دیگری صفر میشه.با تشکر

    1. محمودی

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

      x=l=u*M;
      y=l=(1-u)*M;

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

  57. KM

    با سلام وتشکر بابت مطالب آموزنده تون
    سوالی داشتم ممنون میشم راهنماییم کنید
    میخام متغیری بنویسم که نشان‌ دهنده زمانی باشه که ،یک اندیس از سه اندیس متغیر باینری x مقدار مشخصی رو گرفته، مثلا زمانی که ایکس با j=3 یک میشه رو بیان کنه

    T(x(f,j=3,d)=1)

    در ست / ۳*۱/ j نوشته شده است

    1. سلام باید از اندیس مورد نظر را در ” قرار بدین. مثلا

      X(f,'3',d)

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

      1. KM

        سلام .ممنونم
        منظورم از تی ایکس، زمانی هست که متغیر ایکس، مقدار یک میگیره
        T(x(f,’3′,d)

        1. KM

          یعنی نمیدونم چطور متغیر t3 تعریف کنم که معرف زمانی باشه که X(f,’3′,t) =1 هست

        2. t3 چه نوع متغیری هست ؟
          مثلا می تونین این محدودیت را بنویسین

          t3=L=bigM*X(f,'3',t);

          بستگی به مدلتون داره .

        3. سلام تی نمیتونه تابعی از ایکس باشه ها ! با محدودیت باید منظورتونو برسونین به گمز

  58. اسماعیلی

    سلام و خسته نباشید.
    یه جایی گفته بودید که چطوی میشه در خروجی که نشان میده تعداد اعشار رو دست کاری کرد.من هرچی می گردم نمی تونم پیداش کنم.لطف می کنین دوباره بگین؟
    مثلا اگه عدد ۱٫۳۲۴۵ می خوایم تو خروجی نشون بده ۱٫۲۳
    ممنون

  59. behnam

    سلام
    می خواستم دستور ((Sum(i,v(i,j را طوری بنویسم که در آن اندیس i برای هر j تغییر کند.
    فرض کنید اندیس j مربوط به یک واحد تولیدی است و بازه ی تغییرات i برای هر واحد به طور خاص تغییر می کند.
    با تشکر

    1. محمودی

      سلام
      اگه هر i مربوط به هر j هست که sum نمیخواد.
      اگه برای هر j مثلا چندتا i داریم، باید یه مجموعه چند بعدی تعریف کنین، مث E(i,j) که هر جا E یک بشه یعنی i,j در ارتباط هستن.
      برای تعریف E(i,j) از صفحه ی زیر کمک بگیرین.
      تعریف رابطه بین دو اندیس در گمز
      بعد E باید به صورت شرطی به کد شما اضافه بشه. اینجوری:

      sum(i,$E(i,j),v(i,j));

  60. محمدرضا

    سلام.
    من یک مجموعه تعریف کردم به شکل مقابل: C //C1*C2
    روی این مجموعه آلیاس گرفتم و مجموعه B رو هم با همین اعضا تعریف کردم.
    مجموعه سومی هم تعریف کردم بدین شکل:
    R //R1*R4
    روی C و B پارامتری دو بعدی تعریف کردم به شکل زیر:
    RR(C,B) //C1.C2 2,C2.C1 2,C1.C3 3,C3.C1 3,C2.C3 4,C3.C2 4
    حالا میخوام در یکی از محدودیتهام به ازای هر عضو BوC، روی متغیری مثل F(C,B,R) روی اندیس R جمع بگیرم، بنحوی که اولا Cهایی که اندیس شون برابره و در پارامتر RR نیستند،(مثل .C1)C1) در نظر گرفته نشن، ثانیا حد بالای R همواره به ازای مقداری که در پارامتر براشون تعریف شده، تغییر کنه، مثلا وقتی که داره محدودیتم رو به ازای C1وC2 محاسبه میکنه، مقدار RR(C1.C2) که برابر ۲ هست رو در نظر بگیره و حد بالای R رو تا ۲ در نظر بگیره. چطوری این محدودیت رو تعریف کنم؟
    مرسی و شرمنده بابت طویل شدن توضیحات!

    1. محمودی

      سلام
      الان محدودیت رو دارین و میخواین شرطا رو بذارین یا میخواین یه محدودیت تعریف کنین؟

      1. محمدرضا

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

        1. محمودی

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

          C1(C,B)$(ord(c) ne ord(b) )sum(R$(ord(R) < = RR(C,B),F(C,B,R)

  61. محمدرضا

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

  62. محمدرضا

    سلام مجدد،
    اول از همه خیلی ممنونم بخاطر سایت خوبتون، من حتمن به یک طریق از خجالت گردانندگان این وبسایت خوب در میام.
    و اما بعد، من تو مدلم، یک متغیر دارم q_jct، این متغیر در تابع هدف و محدودیت ها با اندیس های مختلف که جنسشون یکسانه حل بکار رفته. منظور از اینکه میگم اندیس های متفاوت با جنس یکسان یعنی این متغیر، به فرم های q_jct، q_j’ct، q_j’c’t در مدل بکار رفته. واضحه که من نیاز به استفاده از آلیاس دارم برای تعریف مجموعه j’ از روی مجموعه j مثلا. سوالم اینه که آیا نیاز هست که من برای هر کدوم از این سه تا متغیر، یک متغیر متمایز تعریف بشه، یعنی مثلا بازای q_jct، q1، بازای q_j’ct، q2، و برای q_j’c’t، q3 ، یا اینکه نیاز نیست و میشه مثلا با تعریف یک q1 و تخصیص اندیس کار رو انجام داد؟
    ببیخشید طولانی شد
    ممنون.

    1. محمودی

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

  63. محمدعلی

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

    1. محمودی

      سلام
      تو اینگونه مسائل میتونین مثلا یه I(t) تعریف کنین. که این I موجودی تو هر دوره هست. بعد یه I0 هم تعریف کنین که واسه دوره صفره و پارامتره. هر جا I برا دوره اول داشتین، از I0 استفاده کنین. این سریعترین راه ممکنه. و از همه روشای دیگه هم فکر کمتری لازم داره. روش زیاده. باز خواستین عرض میکنم. فقط به مسئله بستگی داره

      1. محمدعلی

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

  64. reza

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

    1. محمودی

      سلام
      چشم حتما. مقداری سرمون شلوغه. چشم و ممنون بابت نظر مفیدتون

  65. ملیکا

    سلام یه معادله خطی به این شکل در داخل گمز میخواهیم بنویسم ک
    L (T)= 0 ,T<ET
    L(T)= T-ET/E-ET,ET<T<E
    L(T)=1,E<T<L
    L(T)=EL-T/EL-L,L<TEL
    که در اینجا ET ,EL, E,L,پارامتر اندیس دار هستند، و Tمتغییر است، L هم متغییر،این و چطوری باید نوشت از طریق IFTHEN بنویسیم در نمیاد، معادله رو غیر مشتق پذیر می کنه، از DNLP مدل می گه حل کنین که حل نمی شه، راهکاری داره ایا ؟

    1. محمودی

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

      1. ملیکا

        یک مثال ساده می زنین که، جواب که قرار تو این رابطه بدست بیاد، ۰ یا ۱ و یا عددی بین ۰و ۱ می تونه باشه یکم راهنمای بیشتری انجام بدین برام

        1. محمودی

          الان چیزی خاطرم نیست خب.
          مثلا فرض کنیم اگه متغیر s بین ۰ و ۴ باشه، y باید یک بشه و اگه بیشتر شد، y باید صفر بشه. (شما باید شرطا رو ریز کنین، پیاده کنین، و چک کنین که با هم تناقض نداشته باشن)

          ۴-s=l=y*M;
          s-4=l=(1-y)*M;

  66. سبحان

    سلام
    توی گمز یه کد نوشتم.این کد یک مقدار بهینه رو برای ۲۴ ساعت بهم میده.حالا من میخوام این مقدار در عدد ۳۶۵ ضرب بشه و مقدارش کنار گزاشته بشه.در ادامه یک پارامتر وروردی تغییر کنه (مثلا تمامی مقادیرش +۱ بشه) و یه بار دیگه کد اجرا بشه و مقدارش به دست بیاد .عدد به دست اومده مثل دفعه قبل در ۳۶۵ ضرب کنه و حاصل رو از عدد قبلی که کنار گزاشتیم کم کنه.
    قبول دارم که اینکار به صورت دستی و با دوبار ران گرفتن و تغییر دستی پارامتر میشه انجام داده اما میخوام ببینم این کار توسط گمز چجوری بیاده میشه؟
    با تشکر

    1. محمودی

      سلام
      یه loop بنویسین، به ازای تعداد دفعاتی که قراره انجام بشه. مثلا ده بار. یه مجموعه مث s تعریف کنین و لوپ رو به ازای اون بنویسین.
      دستور solve رو بذارین تو لوپ.
      این کد براتون میتونه مفید باشه.

      loop(s,
      p(i)=pp(s,i);
      solve .....z;
      value(s)=z.l+1;
      a=a*ord(s);
      ;);
      display value

      1. سبحان

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

  67. ملیکا

    یک مثال ساده می زنین که، جواب که قرار تو این رابطه بدست بیاد، ۰ یا ۱ و یا عددی بین ۰و ۱ می تونه باشه یکم راهنمای بیشتری انجام بدین برام

  68. سبحان

    سلام

    یک نوع متغیر میخوام که باینری باشه اما -۱ هم داشته باشه.آیا چاره ای هست؟
    ۱و-۱و ۰

    با تشکر

    1. محمودی

      سلام
      بسته به مدل شما، میتونین هر راه خلاقانه ای استفاده کنین.
      ساده ترینش که خیلی هم خلاقانه نیست اینه که یه متغیر integer تعریف کنین. و یه کران بالا و پایین (۱ و -۱) براش بذارین. اینجوری فقط این سه مقدار رو میگیره

  69. ehsan

    سلام متغیرهای زیر رو دارم و در قسمت معادلات این فرمول رو دارم

    CONST15_1(h0,bus) $(ord(h0)>1 )..Pes(h0,bus)=e=Pch(h0,Bus)+ Pdch(h0,Bus) ;

    میخوام طوری تعریف کنم که در صورت عدد دار بودن بکی از Pch یا Pdch دیگری صفر در نظر گرفته بشه ممنون میشم اگه راهنمایی کنید البته خودم اینطوری نوشتم ولی فایده نداشت:

    CONST15_1(h0,bus) $(ord(h0)>1 )..Pes(h0,bus)=e=Pch(h0,Bus) xor Pdch(h0,Bus) ;

    Pdch.lo(h0,BusPs)=0;
    Pdch.up(h0,BusPs)=0.0005;
    Pdch.fx(h0,busNoPs)=0;

    Pch.fx(h0,busNoPs)=0;
    Pch.lo(h0,BusPs)=-0.0005;
    Pch.up(h0,BusPs)=0;

    Pes.lo(h0,BusPs)=-0.0005;
    Pes.up(h0,BusPs)=0.0005;
    Pes.fx(h0,BusNoPs)=0;

    1. محمودی

      سلام
      مقداری ساده تر فکر کنین. مث عبارت زیر:

      pch(h0,bus)+pdch(h0,bus)=e=1;

      1. ehsan

        میبخشید مثل اینکه سوالم رو بد مطرح کردم Pdch و Pch متغییرباینری نیستن من یک باز ۲۴ ساعته دارم که در هر ساعت یکی از این دو پارامتر باید در حدود تعریف شده در صورت سوال، قرار بگیرد و متغیر دیگه تو اون ساعت صفر در نظر گرفته شود برای این از xor کردم که البته متوجه شدهم باینری و قابل ااجرا نیست چون میخوام از این پارامتر ها در فرمول زیر در هر ساعت استفاده کنم
        CONST15_7 (h0,bus)$(ord(h0)>1)..Ps(h0,bus)=e=Ps(h0-1,bus)+(Pch(h0,bus)*0.95+Pdch/0.95) ;

        1. محمودی

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

        2. ehsan

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

  70. نفیس

    سلام.
    من میخوام توی گمز یه تابع هدف نویسم که توش متغیر در ترانهاده اش ضرب میشه نمیدونم چجوری باید متغیر ترانهاده رو وارد کنم.
    اینجوریه:
    ‘wsw
    w متغیره و یه ماتریس ۱*n
    s پارامتره و یه ماتریس n*n
    ممنون میشم راهنمایی کنین چجوری باید بنویسمش

    1. محمودی

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

  71. محمدعلی

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

    /tt time periods /0,1*6
    /t(tt) /1*6
    من اینو واسه مجموعه ها تعریف کردم.

    اینو واسه متغیر
    ;positive variable I(tt) amount of inventory
    ;I.fx(“0”)=20
    معادله هم اینه
    ((Inventory(t).. I(t)=e=Q(t)+I(t-1)- sum((j),R(j,t

    1. محمودی

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

      1. خسروی

        سلام. ممنون از آموزش ها و پاسخ گویی خوبتون.
        یه سوال از خدمتتون داشتم در همین زمینه.
        اگر فرضا بخواهیم در همین معادله از شرط ord(t) استفاده کنیم، اندیس t را به همین صورت میتوان استفاده کرد؟ چون به صورت زیرمجموعه ی tt تعریفش کردیم.
        چون برای من خطای زیر را می دهد که فکر میکنم دستور اورد رو اشتباه نوشتم برای t
        کد:

        Sets
               ii         number of data(1:n)with initial value   /0, 1*8760 /
               i(ii)      number of data(1:n)   / 1*8760 /
               tt         number of minute with initial value /0,1*60/
               t(tt)      number of minute /1*60/
         calc_EStg1_ins2(i,t)$((ord(i) gt 1) and (ord(t) gt 1))..     EStg1_ins(i,t)=e= EStg1_ins(i,t-1)+PStg1_ins(i,t)*delta_t;
        

        خطا:

        error52:  endogenous $-control operations not allowed.
        
        1. خسروی

          درواقع چند خط محدودیت هام به این شکله:

          calc_EStg1_ins(i,t)$(ord(i) eq 1)..                  EStg1_ins(i,t)=e= EStg1_ins(i,t-1)+PStg1_ins(i,t)*delta_t;
                 calc_EStg1_ins1(i,t)$(ord(i) gt 1 and ord(t) eq 1)..     EStg1_ins(i,t)=e= EStg1_ins(i-1,'60')+PStg1_ins(i,t)*delta_t;
                 calc_EStg1_ins2(i,t)$(ord(i) gt 1 and ord(t) gt 1)..     EStg1_ins(i,t)=e= EStg1_ins(i,t-1)+PStg1_ins(i,t)*delta_t;
          

          و خطاهای ۵۲و۶۴و۲۵۶ رو دارم.
          هر کار هم انجام میدم، رفع نمیشه. خیلی ممنون میشم اگر راهنماییم کنید

        2. محمودی

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

        3. محمودی

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

  72. محمدعلی

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

    1. محمودی

      سلام
      خب من چه راهنمایی بکنم الان. این وضعیت به چند تا چیز ربط داره که شما همه رو باید چک کنین:
      ۱- ساختار مدل، آیا ساختار اجازه میده که صفر هم بشه؟
      ۲- داده ها، آیا داده ها مشکلی ندارند؟
      ۳- کد، آیا کدم درسته؟
      ۴- تابع هدف، ممکنه یه جوری باشه که به نفعش باشه که همیشه صفر بشه
      مهمترین دلیل ساختار مدل و داده ها هست

  73. سیده

    سلام با تشکر از مطالب خوبتون
    من داخل برنامه i را از ۱ تا ۳۰ تعریف کرده ام .. در توابع محدودیت نیاز دارم که در هر تابع از چنتد تا از i ها استفاده کنم اما نمیدونم چطور ممکنه
    برای مثال x(i ) که متغیر باینری هم هستن در یک تابه محدودیت فقط از i=1,2,3,4,5,6,7,8 میخوام استفاده کنم ممنون میشم بگید چجوری باید تعریف کنم

    1. محمودی

      سلام
      مرسی
      مثال زیر رو ببینید.

      c1(i)$(ord(i) < =8).. x(i)=e=1;

  74. سیپده

    برای توضیح سوالم
    تابع هدف من اینه

    OBJ .. Z=e=sum ((i) , as(i)*x(i));

    تابع محدودیت من سیگما ۱ تا ۸ x هاست ممنون میشم بگید چه جوری محدودیتمو بنویسم

      1. سیپده

        عذر میخوام از سوال مجددم بعد اگه برای مثال بین ۸ تا ۱۶ بخوام تعریف کنم به چه شکل میشه

  75. مجید

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

  76. مجید

    سلام
    در خصوص توابع توزیع در گمز سوالی داشتم
    نوشته بودید که با دستور normal میشه عددی رندم با توزیع نرمال داشت. می
    خواستم بدونم ایا تابعی در گمز هستش که تابع چگالی احتمال تابع توزیع
    نرمال رو هم بده؟
    البته دستور زیر تو راهنمای گمز دیدم اما گمز میگه نمیشناسمش
    pdfNormal(x,MEAN,STD DEV)
    ممنون میشم اگه راهنمایی بفرمایید

    1. محمودی

      سلام
      فرمول رو میخواین؟ برای چی میخواین استفاده کنین؟

      1. مجید

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

        1. محمودی

          سلام
          من تابع توزیعش رو کار نکردم متاسفانه. سر فرصت می‌گردم اگه پیدا کردم میذارم اینجا.
          فعلا که من تابعشو نمیدونم چجوریه. ولی میتونین یه کار بکنین. فرض کنیم میانگین m و انحراف معیار sigma و متغیر شما x باشه.
          میتونین اول x رو به صورت تصادفی با توزیع نرمال تولید کنین. بعدش اون مقداری که برا x به دست اومده رو بذارین تو فرمول تابع توزیع نرمال. فرمول رو دستی براش تعریف کنین. اینجوری هم x به دست اومده و هم احتمالش. احتمالا یکم دقت هم بخواد که مجموع احتمالا بالا یک نشه

  77. sobhan

    سلام

    من دوتا متغیر دارم(متغیر مثبت) که میخوام وقتی اون یکی مقدار می گیره یکی دیگه صفر بشه و بر عکس.و در کل هیچگاه با هم مقدار نگیرند.باید چکار کنم؟

    1. محمودی

      سلام
      از sos1 استفاده کنین. تو همین تاپیک توضیحاتش اومده.
      مهندس حداقل یه بار تایپک رو مطالعه کنین بعد سوال رو بپرسین. مرسی

  78. پیمان

    سلام. خسته نباشید.
    من یه تابع هدف به شکل Z=xy دارم که x و y هر دو متغیر باینری هستن. روش خطی سازیش چیه؟
    متشکرم.

    1. محمودی

      سلام
      حاصلضربشون رو برابر t بگیرین. بعد اینو در نظر داشته باشین که t همیشه صفر هست، بجز وقتی که هم x,y یک باشن.
      یعنی:

      t=l=x
      t=l=y
      x+y-1=l=t

  79. سایه

    سلام، وقت بخیر
    یه محدودیت دارم که به ازای i تعریف شده ولی تو این محدودیت دو تا sum دارم که یکی به ازای e عضو t(i) و بعدی به ازای e عضو t(j) تعریف شده، اینو چطور باید کد کنم؟
    با تشکر

    1. محمودی

      سلام
      کامل توضیح ندادین. ولی میتونین e,i رو آلیاس کنین. و j,ee رو.
      بعد به جای t(i)بزنین t(e) برای j هم همینطور

  80. نازی

    سلام خسته نباشید
    من چند تا وسیله خانگی دارم که هر کدوم تا یه بازه ای کار میدنن
    وسیله ها قبلا تو set معرفی شد به این صورت
    /A appliances /Vc,Tv,Pec,Cd,Wm,Dw,Cm
    حالا میخوام دوره عملکردشون بیارم مثلا وسیله Vc تو دوره t بین ۳۸ تا۴۲ و ۱۰۰تا۱۰۳ کار میکنه بازه t هم قبلا معرفی شد ./T periods /1*144
    به این صورت معرفی میکنم تو شناسایی vc ارور میده
    ;parameter withoutV2H(t) operation period without V2H ability
    withoutV2H(t)$(ord(t)>=38 and ord(t)=100 and ord(t)<=103)=vc
    از طرفی نمیتونم بنویسم (ord(a جای vc چون شامل چند تا وسیلس که من فقظ میخوام دوره عمکرد هر کدوم جدا بگم چطور باید عمل کنم

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

      set t/1*44/
      vc(t)/38*42,100*103/

      بقیه هم به این نحو زیر مجموعه دوره تعریف می کردم.

  81. نازی

    ; parameter withoutV2H(t) operation period without V2H
    withoutV2H(t)$(ord(t)>=38 and ord(t)=42 )=vc
    withoutV2H(t)$(ord(t)>=100 and ord(t)=103 )=vc
    ببخشد جا به جا میشه نوشته ها

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

  82. جهان

    سلام از وبسایت خوبتون
    ممنون می شم اگه این مشکل بنده رو حل کنید
    من می خوام یه متغیر f(i)
    تعریف کنم که برابر min
    یه پارامتر x(i)
    و متغیر y(i)
    هست. یعنی اینطوریه:
    f(i)=min{x(i),y(i)}
    از هر دستوری استفاده کردم نتیجه نگرفتم. دستورات min علامت دلار یا
    ifthen
    هم استفاده کردم. ولی همیشه متغیر رو کوچکتر در نظر می گیره. حتی وقتی متغیره بزرگتره
    دستور ifthen رو اینطوری نوشتم:
    F(i)=e=ifthen(x(i) < y(i),x(i), y(i))
    و این خطا رو داد:
    cannot function 'ifthen'
    دستور ifthen وقتی خطا نمی ده که به جای حالت true ,false
    عدد قرار بدم مثلا اینطوری:
    F(i)=e=ifthen(x(i) < y(i),1, 2)
    همیشه مقدار عدد مربوط به false یعنی ۲ را برمیگرداند. یعنی همیشه مقدار متغیر را کوچکتر در نظر می گیرد. حتی وقتی بزرگتر است. دستور دلار هم نتیجه ای مشابه ifthen می ده.
    لطفا بنده رو راهنمایی بفرمایید دستور مناسب برای min چیه.
    خیلی ممنون

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

      1. جهان

        اینطوری ممکنه متغیر مقدار نادرستی بگیره که صحیح نیست. چون متغیرها از قبل حد پایین مناسبی دارن
        و پارامترها مربوط به مجموعه است و از قبل مشخص است و هر i پارامتر خودش را دارد ولی اختلاف مقدار متغیر و پارامتر قبل از حل مشخص نیست. و برای هر اندیس ممکنه متغیرش بزرگتر یا کوچکتر از پارامترش باشه. یعنی هر پارامتر x(i) متغیر y(i) خودش رو داره و ممکنه بعد از به دست اومدن متغیر ها از پارامتر متناظرش کوچکتر یا بزرگتر باشه. که بین x(i) و y(i) اونی که کوچکتره برابر f(i) می شه.
        مشکل من با f(i) هست که نمی دونم تو عبارت زیر چه طوری تعیینش کنم.
        f(i)=min{x(i),y(i)}

  83. جهان

    ممنون از اینکه جواب دادین
    خیلی ساده شده مدل من این می شه ولی مدل اصلی غیر خطی و محدویت های زیادی داره:

    sets
    i /1*3/;
    parameters
    x(i) /1 5,2 3,3 6/
    d(i)/1 6,2 2,3 7/
    ;
    positive variables
    y(i)
    f(i)
    ;
    free variables
    z;
    equations
    obj
    A(i)
    B(i);
    obj.. sum(i,y(i)+f(i))=e=z;
    A(i).. y(i)=g=d(i) ;
    B(i).. f(i)=e=min(y(i),x(i));

    الان محدودیت آخری رو چه طوری باید بنویسم؟
    به این صورت که می نویسم خطا می ده:.
    B(i).. f(i)=e=min(y(i),x(i))
    ولی هر چیزی غیر از
    y(i)
    تو این محدودیت می نویسم کار می کنه. فقط با متغیر مشکل داره.
    به صورت زیر هم نوشتم ولی باز خطا میده
    F(i)=e=ifthen(x(i) < y(i),x(i), y(i))
    لطفا کمکم کنید چه طوری بنویسمش

    1. سلام برنامه ات درست کار می کنه وقتی پارامتر کوچک تره اونو برمی داره و وقتی متغیر کوچکتره اونو برمی داره. همیشه مقدار متغیر را کوچکتر در نظر نمی گیره .

      ---- ۲۲ VARIABLE z.L = 28.000

      ---- 22 PARAMETER x

      1 5.000, 2 3.000, 3 6.000

      ---- 22 VARIABLE y.L

      1 6.000, 2 2.000, 3 7.000

      ---- 22 VARIABLE f.L

      1 5.000, 2 2.000, 3 6.000

      در برنامه ای که ران شد ۲ بار پارامتر و ۱ بار متغیر و برمی داره.

  84. جهان

    سلام ممنون از اینکه بررسی کردید و جواب دادید
    فکر کنم تو قسمت solve مدل مشکل دارم چون من قبلش نوع برنامه رو nlp نوشته بودم خطا میداد می گفت dnlp بنویس. این کار رو به صورت زیر نوشتم
    model IRP /all/;
    solve IRP using DNLP minimizing z ;
    display x,y.l,f.l;

    همه متغیرها رو صفر میده و این دو پیغام زیر رو هم می ده:
    can not handle function ‘min’
    can not handle function ‘rel_lt’

    1. can not handle function ‘min این پیام یعنی سالوور نمی تونه تابع min را استفاده کنه. در انتخاب روش حل و سالوور دقت کنین

  85. moghbeli

    سلام.خسته نباشین.
    من توی برنامم یه شرطی دارم این هست که برای یکی از متغیرهام در یک بازه ای باید مقدارش به صورت تابع یکنواخت تعریف بشه.آیا نوشتن این شرط امکان پذیر هست؟

  86. نازی

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

    (I.(t
    (.) binary indoctor of appliance
    status at period t , where1 mean on and 0 mean off

    t و . که زمان و وسیله باشن قبلا معرفی شدن . بازه عمکرد وسیله های . هم تعریف شده
    الان من (I.(t باینری تعریف کنم کافیه یا باید با روشنی خاموشیم واسش بیان کنم باز امکانش هست بنویسید برام. ممنوم

    1. محمودی

      سلام
      چیزی که من متوجه شدم اینه:
      ۱- t یک اندیس هست
      ۲- . یک اندیس هست
      ۳- بر حسب این دو اندیس میخواین i رو تعریف کنین.
      کافیه I(.,t) رو به صورت باینری تعریف کنین و استفاده کنین. فقط توجه کنین که گمز “.” قبول نمیکنه. براش یه اسم دیگه مث k بذارین

  87. احمدی

    سلام. خیلی ممنون از مطالب مفیدتون. یه سوال دارم که اگه جواب بدین ممنون میشم. تابع هدف مساله من یه جمله داره که برابر با حاصلضرب دو متغیر پیوسته مثبت هست (مثلا a*b که a و b مثبت و پیوسته هستند). میخواستم بدونم توی گمز چطوری باید این جمله رو خطی سازی کنم.

    1. محمودی

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

      1. احمدی

        سلام. اگه توی تابع هدف یه عبارت مثل a2-b2 (توان دوم a منهای توان دوم b)باشه و a و b متغیرهای مثبت پیوسته باشند خطی سازی به چه شکل انجام میشه؟

        1. محمودی

          فکر نمیکنم بتونین خطیش کنین. مگه اینکه شرایط دیگه ای هم داشته باشین. شما میتونین به جای اینکه خطی کنین، بیاین حالتای مختلف غیر خطی معادل این حالت رو امتحان کنین.
          مثلا از a2-b2 رو مساوی x بگیرین. بعد تو تابع هدف بذارین x، اینا رو ببرین تو محدودیت. یا اینکه ازشون لگاریتم بگیرین. (پس این شد دو حالت غیر خطی دیگه!)
          یه حالت غیر خطی دیگه هم داریم:
          تجزیه کنیم:

          (a-b)*(a+b);

          خب حالا a-b رو اسمشو بذاریم x و a+b رو بذاریم y :

          xy=3;

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

  88. reza.sh

    سلام خسته نباشید.
    ببخشید من یک متغییر بنام Z(Vmax) یعنی اخرین ماشینی که به مسیر k تخصیص داده شده است ، اینو چطور میتونم کد کنم .
    باتشکر

    1. محمودی

      سلام
      مرسی
      بیشتر توضیح بدین. این آخرین ماشین با چه متغیرها و اندیس ها و پارامترهایی در ارتباطه. اساسا اولی یا اخرین ماشین با چی تو مدل نشون داده شده؟

  89. شبنم

    hp(j,’1′)=0;
    میخوام برای هر j این متغیر در نقطه ۱ صفر باشه. اینو تو حدود متغیرا وارد کردم ولی eror143 میده
    با تشکر

  90. جهان

    سلام
    مدل یه مسئله ان پی هارد تو سایز خیلی کوچیک رو تو گمز نوشتم. ولی حل نمی کنه و مقادیر متغیرها رو نمی ده و خطایی هم نمی ده. یعنی تو قسمت خروجی فقط بخش های زیر رو داره:
    compilation
    equation listing
    equation
    column listing
    column
    model statistics
    و بقیه بخش ها مخصوصا بخش display رو نشون نمی ده.
    لطفا کمکم کنید. ممنون می شم.

    1. جهان

      یه سوال دیگه
      متغیر x(i) با توجه به مقادیر متغیرهای y(i) و a تا f به صورت زیر مقدار می گیره:
      x(i)=a(i) if y(i)=d(i)
      x(i)=b(i) if y(i)=e(i)
      x(i)=c(i) if y(i)=f(i)
      لطفا راهنمایی کنید چه طور باید تو گمز وارد بشه. البته معادلات اصلیش پیچیده تر از این هست و اینجا ساده کردم.

      1. محمودی

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

      1. جهان

        سلام. ممنون که پاسخ دادید.
        بله از لینکی که گذاشتید برا لایسنس، قبلا استفاده کرده ام و همه سالور ها full هستند.
        ولی همچنان مشکل خروجی رو دارم. بدون خطای قرمز.
        ولی تو خلاصه ی خروجی این توضیحات هست ولی نمی فهمم اشکال از کجاست:
        ***model structure has 16 data errors
        ***solve aborted
        ***status:execution error(s)

        1. جهان

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

        2. محمودی

          سلام
          خواهش میکنم.
          نه مشکل از سالور نیست. چند خط بالاتر از این رو هم بذارین.
          اصن کل فایل log رو اینجا بذارین که ببینم.

  91. حسین

    سلام مهندس محمدی امیدوارم خوب باشین ببخشین ی سوال دارم؟

    در متلب با ساختار cell میشه یه آرایه که هر کدوم از عناصر خودش ی آرایه دیگه باشه تعریف کرد آیا چنین ساختاری در گمز وجود داره؟ اگه نیست ودر صورت لزوم به چنین ساختاری چطور باید این کار رو انجام بدیم یعنی فرض کنید یک ارایه داریم مثلا ۳۰ در ۳۰ و درهر کدوم از سلولای ارایه می خواهیم ی آرایه ۳۵ در ۳۵ ذخیره کنیم ودر عملیات بعدی ازش استفاده کنیم. ممنونم

    1. محمودی

      سلام
      برای اینکار کافیه فقط اندیس اضافه کنین. مثلا یه پارامتر تعریف کنین که چهار اندیس داشته باشه. a(i,j,k,m)
      اون cell تو متلب دقیقا همین کار رو انجام میده. یعنی چهار بعدی میکنه پارامتر رو.

  92. جهان

    سلام جناب مهندس محمودی
    ممنون از پاسختون
    این فایل log که فرمودید بزارم ببینید:

    — Job IRP.gms Start 01/19/03 18:13:23 24.1.2 r40979 WEX-WEI x86_64/MS Windows
    GAMS 24.1.2 Copyright (C) 1987-2013 GAMS Development. All rights reserved
    Licensee: GAMS / MPSGE Workshop G050310:1251AJ-WIN
    Ann Arbor, MI 2005 DC5176
    License for teaching and research at degree granting institutions
    — Starting compilation
    — IRP.gms(146) 3 Mb
    — Starting execution: elapsed 0:00:00.018
    — IRP.gms(53) 4 Mb
    — Generating MINLP model IRP
    — IRP.gms(143) 6 Mb 16 Errors
    — 69 rows 65 columns 277 non-zeroes
    — 408 nl-code 75 nl-non-zeroes
    — 16 discrete-columns
    *** Model structure has 16 data errors
    — IRP.gms(143) 4 Mb
    *** SOLVE aborted
    — Executing BARON: elapsed 0:00:00.079
    — IRP.gms(143) 4 Mb 16 Errors
    *** Status: Execution error(s)
    — Job IRP.gms Stop 01/19/03 18:13:23 elapsed 0:00:00.093
    Exit code = 3

    1. محمودی

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

  93. اس

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

    1. محمودی

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

      1. اس

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

        1. محمودی

          تلاشتونو بکنین، مشکلی پیش اومد در خدمتیم.

  94. من

    سلام ممنون مبشم بگید اینو چطوری تو گمز کد کنم؟
    x2 – x1 < 0

    1. محمودی

      سلام
      میتونین بنویسین:

      x2=L=x1-eps;

      که eps یه عدد کوچیک هست.

  95. مهران

    سلام، میخواستم بپرسم من یه متغیر دارم (c(t)) که به ازای زمان های مختلف(t)، تغیر میکنه مثلا:
    c(t)=[4+m 4 4-m] مثلا در ساعت اول(t=1) c برابر درایه اول، در ساعت دوم c برابر درایه دوم و..
    m تو این ماتریس یه متغیره
    اینو چطور تو گمز بنویسم؟

    1. محمودی

      سلام
      منظورتون از متغیر پارامتر هست یا متغیر؟ مثلا t اندیسه، m چی؟ m متغیره یا میدونیم مقدارش چنده؟

  96. علی

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

    1. محمودی

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

      @BIN( variable_name);

  97. m.h

    سلام
    امکان ضرب ۳ متغیر تصمیم در گمز وجود دارد؟
    مدلم در گمز ران میشه اما جوابی که میده منطقی نیست
    هم چنین در قسمت equation هم متغیرهای تصمیم دو به دو در هم ضرب شدند
    یعنی متغیر u*h و h*x در حالی که در تابع هدف هر ۳ متغیر در هم ضرب شده بودند
    u*x*h

    1. محمودی

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

      1. m.h

        اگر متغیر تصمیم h مقدار ۱ بگیرد باعث کاهش هزینه میشه، اما مقدار h را برابر صفر در نظر میگیره
        به طور کلی بود یا نبود این متغیرتصمیم تاثیری بر جواب ندارد

        1. محمودی

          سلام
          محدودیت هایی که روی h لحاظ شدن هم مهمن. شاید محدودیت ها یه جورین که باعث میشن که h همیشه صفر بشه

  98. دانشجو

    با سلام اگر بخواهیم di=(0,…,0,1,0,…0)که اندیس iدر طول مسیله تغییر میکند را وارد مدل کنیم در کدام بخش باید نوشته شود؟

    1. محمودی

      سلام
      نقش این b چطوریه تو مدلتون؟ داره چیکار میکنه؟
      اگه متغیره که میتونین به شکل باینری تعریف کنین و مجموع sum(i,d(i)) رو برابر با یک بگیرین و به عنوان یه محدودیت در نظر بگیرین. یا اینکه به عنوان SOS تعریفش کنین و براش حد بالای ۱ در نظر بگیرین. اگه اشنایی با SOS ندارین پست زیر رو بخونین.
      تعریف متغیر SOS در گمز
      اگه پارامتره که باید ببینیم نقشش چی هست.

  99. m.h

    سلام
    من یک مدل مکان یابی تخصیص را در گمز نوشتم
    مدل غیرخطی است و با بارون حل کردم
    زمانی که تعداد گره ها حداکثر ۶ می باشد در زمان کم تر از ۱ دقیقه حل می شود
    ولی وقتی تعداد گره ها را بیش تر می کنم،جوابی برای مسئله بدست نمیاد
    نشدنی میشه
    این به این معنیه که مدلی که نوشتم غلطه؟

    1. محمودی

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

      1. m.h

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

        1. محمودی

          ۷ گره رو چند دقیقه؟ مثلا اگه یه ساعت طول میکشه بعد میگه نشدنی، امیدی هست که به جواب برسه.
          ولی اگه زود بگه نشدنیه که باید تحلیل کنین که چرا اینجوری شده.
          روش خاصی برای فهمیدن این مشکل نیست. معمولا این کارا برای تحلیل این معضل انجام میشه:
          بررسی مجدد کد، بررسی مدل، تطبیق مدل با مقالات پایه (خیلی مهم)، بررسی داده ها و در صورت امکان استفاده از داده های استاندارد منتشر شده توسط مقالات پایه. حل دستی
          برای بررسی ریز مدل، معمولا باید اول یه چندتا محدودیت رو تو مدل در نظر بگیرین و حل کنین مدل رو. مدل که جواب داد، یه محدودیت دیگه هم اضافه میکنین. این کارو تا جایی ادامه میدین که دیگه گمز بگه نشدنیه مدل. اونجاست که باید تحلیل کنین که این محدودیتی که الان اضافه کردین با چه محدودیت یا محدودیتهایی تناقض داره. دیگه خلاصه باید تحلیل بشه. خیلی شیک و دقیق.
          البته این قصه سر دراز داره که تقریبا ۹۵ درصد مدلها اول این مشکلات رو دارن و کم کم رفع میشن.

  100. m.h

    بعد از ۱ ساعت ران میگه نشدنیه
    تمام سطور تابع هدف رو غیرفعال کردم و فقط سطر هزینه اولیه احداث دپو ،فعال کردم
    مسئله در کم تر از ۱۰ دقیقه حل شد
    پس با محدودیت ها مشکل نداره…
    به نظرتون دلیل اینکه با تابع هدف مشکل داره چی میتونه باشه؟
    درضمن مدلم رو خطی هم کردم، بعد از خطی سازی هم جواب نشدنی بدست میاره….
    در حالی بقیه مثال ها رو جواب یکسان با مدل غیرخطی میدهد(در تعداد گره های کم)

    1. محمودی

      سلام
      الان بدون توان بعد یه ساعت میگه نشدنیه؟ اگه آره که زمان حل رو بیشتر کنین شاید جواب داد. از آپشن reslim استفاده کنین. تو سایت و کامنتا زیاد بحث شده در موردش.
      ممکن هم هست مدل این جواب رو داده باشه: infeasible or unbounded و این یعنی مدل شما احتمالا جواب بیکران داشته باشه. رو علامت های مثبت و منفی بخش های مختلف تابع هدف هم فکر کنین.

      1. m.h

        سلام
        از reslim استفاده کردم مشکلم حل شد
        خیلی خیلی ممنون

  101. علی

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

    1. محمودی

      سلام
      فرض کنیم متغیر شما x هست. اگه با همون نام قراره تو مرحله بعدی هم استفاده بشه، کافیه بعد از دستور solve اول این کد رو بنویسین:
      x.fx=x.l;
      اینجوری مقدار بهینه رو میگیره و فیکس میکنه و از این لحظه به بعد مقدارش همینقدره.

  102. هادی

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

    با تشکر

    1. محمودی

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

      1. هادی

        سلام
        ممنون از پاسخگوییتون. فقط صحیحند ولی حد بالا و پایینشون مشخصه. یکیشون ۰ تا ۱۰۰۰ و بعدی ۰ تا ۱۰٫

        1. محمودی

          سلام
          ببینید تو این حالت خطی سازی مقداری دردسره. تو بهترین حالت باید یه راه خلاقانه به خرج بدین و یا اینکه مثلا شرایط دیگه ای اگه تو مسئله هست رو لحاظ کنین.
          راه حل کلی و نسبتاً مناسب برای اینکار به شکل زیر هست: (این راه حل رو بنده به کار بردم قبلا و روش مناسبی هست- البته بستگی به ساختار مدل داره که چقد جواب بده)
          اولا شما باید خطی سازی ضرب دو متغیر صفر و یک رو یاد بگیرین.
          تو مرحله ی بعد این دو متغیر صحیحی که دارین رو باید به مجموع چند متغیر عدد صحیح تبدیل کنین. برای تبدیل متغیر عدد صحیح به متغیر صفر و یک دو راه دارین. که راه دومی که عرض میکنم چون تعداد متغیرهای کمتری رو تولید میکنه از لحاظ زمانی به صرفه تر هست. جفتشون هم تو کتاب لیبرمن کامل توضیح داده شدن. تو لینک زیر کتاب لیبرمن هست (اگه اشتباهی لینک رو گذاشتم بگین که اصلاح بشه) تو این کتاب تو بخش عدد صحیح انواع خطی سازی ها و تبدیلات رو نوشته. یکی از اون قسمت ها به این شکله که هر متغیر رو به صورت sum(2^t*y(t) میکنین. همونو پیدا کنین و عملی کنین.
          دانلود کتاب لیبرمن
          حالا متغیرهای شما تبدیل شدن به مجموع اعداد صفر و یک. حالا کافیه که ضرب این ها رو بیاین خطی کنین و تمام میشه کار

  103. سما

    با سلام وادب
    جناب محمودی من تو مدلم یه متغیر پیوسته دارم ، که حد بالای یه سامیشن هم قرار میگیره ! ممکنه راهنمایی کنید که چجوری میتونم خطیش کنم؟

    1. محمودی

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

  104. Bahar.Sh

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

  105. samin

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

    1. محمودی

      سلام
      حضور ذهن ندارم.
      من این کار رو نکردم. ممکنه بشه (که احتمالش کمه). ولی من چیزی به ذهنم نمیرسه. ببخشید.

  106. سارا

    سلام. وقت شما بخیر.
    من چند سوال در رابطه با کد نویسی داشتم :
    ۱٫ پارامتری به شکل Pmin j که min به عنوان اندیس در بالای p و j اندیس در پایین p نوشته میشه، چطور در گمز تعریف می شود و همچنین برای علامت max آن چطور؟ در این مساله P با اندیس ijدر پایین p نیز به عنوان پارامتر و Pj به عنوان متغیر تعریف می شود.

    ۲٫ برای تعریف متغیری که به شکل زیر نوشته شده، دستور آن در گمز چگونه است و زمانی که شرطی نیز در توضیحاتش ذکر شود چگونه نوشته می شود؟

    j,i   :     1    if machine j works at its i th speed level(for 1 ≤ i ≤ pmaxj− pminj− ۱)           ۰ else∆
    

    آیا این شرط باید در محدودیت تعریف شود؟

    ۳٫ زمانی که در محدودیت در قسمت نوشتن سور عمومی ذکر شود که j عضو sk باشد و این عضویت در چندین محدودیت تفاوت داشته باشد و یا اینکه j عضوی از اشتراک دو مجموعه هست و موارد مشابه این چنینی، چطور نوشته می شود؟

    با تشکر فراوان

    1. محمودی

      سلام
      ۱- اون Min, max اندیس نیستن. فقط تعریف کنین Pmin(j و Pmax(j
      2- برای تعریفش که عادی تعریف میشه و شرطی روش نمیشه گذاشت تو قسمت تعریف. برای شرط هاش باید تو هر محدودیتی که دلتا استفاده میشه شرط هم گذاشته بشه.
      ۳- این تفاوتی که فرمودین تعیین کننده ست و بهش دقت کنین. من فکر میکنم این دو تا تاپیک زیر رو بخونین روش کار دستتون بیاد.
      اجتماع مجموعه ها
      مجموعه های چند بعدی

      1. سارا

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

        delta(j,i) when 1 ≤ i ≤ pmaxj− pminj− ۱
        
        co2 (k,j,t,i)   ..   w(j,k,t) =l= (y(k,t)*p(j,i) + m* (1- delta (j,i)); 
        

        برای دلتا از شرط if باید استفاده کرد؟

        1. محمودی

          سلام
          خیر. از دلار باید استفاده کنید. مشروط به اینکه pmax, pmin جفتشون پارامتر باشن.

          co2 (k,j,t,i)$(ord(i) >= 1 and ord(i) <= pmaxj-pminj-1)   ..   w(j,k,t) =l= (y(k,t)*p(j,i) + m* (1- delta (j,i));
          
  107. با سلام.
    در حل مسائل عدد صحیح در صورتی که مقدار متغیر عدد صحیح از ۱۰۰ بیشتر شود، نرم افزار به طور خودکار حد بالای آن را ۱۰۰ در نظر میگیرد.حال سوال اینجاست:
    ۱٫ چرا با وجود اینکه باید مقدار متغیر آزادانه و بهینه تعیین شود نرم افزار چنین کاری را میکند؟
    ۲٫ مقدار مناسب برای حد بالا چگونه تعیین شود؟
    با تشکر

    1. محمودی

      سلام
      سوال اول: این یه تکنیک نرم افزاریه که سریعتر به جواب برسه. بیشتر مسائلی که مورد بررسی قرار میگیرن معمولا تو اسکیل کوچیک شده اعداد مورد ارزیابی قرار میگیرن. بابت همین بیشتر اعداد کوچیکتر از ۱۰۰ میشن. قطعا منطقی نیست وقتی مقدار بهینه یه متغیر حول و حوش ۲۰ هست، نرم افزار بیاد اعداد بالاتر از ۵۰۰ رو هم براش تست کنه ببینه جواب چجوریه.
      سوال دوم: x.up=1000;

  108. zohre

    سلام ببخشید من تابع هدفم به صورت حاصلضرب چهار تا معادله درجه دو هست من به این صورت نوشتم
    (objective..z=e=Prod(i,a(i)*x(i)*x(i)+ b(i)*x(i)+c(i
    با استفاده از تابع prod ولی گمز متوجه نشده جواب اشتباه میده میشه راهنمایی ام کنید چطور وارد کنم a b c مقادیر معلوم هستن و x متغیر تصمیم
    ممنون

    1. محمودی

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

  109. s

    اگر در قسمت معادلات بخواهیم معادله ای روی همه اندیس ها به غیر از یک اعمال شود چطور باید عمل کنیم؟ مثلا در برنامه زیر:
    eq(busno).. qp(busno)-loaddata(busno,’pd’)=v(busno)…
    به جای همه موارد اندیس busno، می خواهم یک مورد را جدا کرده و در معادله ای دیگر (با اعمال تغییرات لازم) اجرا کنم.

    1. محمودی

      سلام
      مثلا اینجوری:
      eq(busno)$(ord(busno) =1)
      دلار یعنی به شرطی که و ord هم یعنی شمارنده Busno، اینجا اولین باس که تعریف شده رو مد نظر قرار داده، شما میتونین به جای ۱ عدد مورد نظرتون رو بذارین. بقیه محدودیت تغییری نمیکنه

  110. s

    ببخشید منظورم این بود:
    اگر در قسمت معادلات بخواهیم معادله ای روی همه موارد یک اندیس به غیر از یک مورد از آن اندیس اعمال شود چطور باید عمل کنیم؟ مثلا در برنامه زیر:
    eq(busno).. qp(busno)-loaddata(busno,’pd’)=v(busno)…
    به جای همه مقادیر در اندیس busno، می خواهم مقدار شماره ۸ از این اندیس را از معادله فوق جدا کنم. در اینصورت اصلاح شده این معادله چطور باید نوشته شود؟
    با تشکر از پاسخگویی شما

  111. zohre

    سلام ببخشید من در قسمتی از مدلم این عبارت را دارم
    objective..z=e=prod(i,u(i));
    اگر بخواهم اینها به صورت توانی در هم ضرب بشن باید چیکار کنم؟
    یعنی هر u(i) با یک توان متفاوت در هم ضرب بشن
    ممنون

    1. محمودی

      سلام
      یه پارامتر a(i) هم تعریف کنین که توان رو نشون بده. و به جای u بنویسین u(i)**a(i)

  112. sanaz

    با سلام و خسته نباشید
    من مدلمو نوشتم و خطاهاش رو هم رفع کردم اما الان بعد از حل میبینم که بعضی از شروطی رو که گذاشتم و یا محدودیت هایی که تعریف کردم توی جوابا اعمال نشده، میخواستم ببینم کدی که به صورت زیر برای متغیرها وارد کردم و زیرش شرطش رو نوشتم درسته؟
    مثلا xو y رو که باینری گذاشتم جوابای بین صفر و یک می دهد و یا جاهایی که d(i,j) از ۳۰ بزرگتره x رو صفر نمیده در حالی که من این شرط رو تعریف کردم که بزرگتر از ۳۰ باشه صفر بشه.

    variables
    x(i,j,m) portion of customers residing at demand node i is assigned to facility j at assignment level m
    y(j)     open or close facility at node j
    z        total costs;
    binary variable x(i,j,m);
    x.l(i,j,m) $(d(i,j)&gt; 30)=0;
    binary variable y(j);
    y.l(j)$(ord(j) 30 
    

    هستش x برابر با صفر نشده
    با تشکر از سایت خوبتون

    1. محمودی

      سلام
      مچکرم.
      برای شرطی که برای x نوشتین، باید به جای .L بنویسین .fx
      برای y هم شرط مشخص نیست چی نوشتین

  113. مهراب

    سلام ببخشید چطور می توان تعداد کل متغیرها و پارامتر ها را به دست آورد

    1. محمودی

      سلام
      برای متغیرها میتونین از دو ویژگی numvar و numDvar استفاده کنین. که اولی تعداد کل متغیرها و دومی تعداد کل متغیرهای گسسته هست.
      کافیه بعد از دستور solve کد زیر رو قرار بدین. mymodelname اسم مدل شما هست که تو دستور model نام گذاری کردین.

      display mymodelname.numvar
      

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

  114. علی

    سلام
    تشکر از مطالبتون
    در قسمت ۴٫ مقدار کنونی یک متغیر دستور داده شده اشتباه است.لطفا اصلاح فرمایید.
    دستور از ۳٫ ثابت کردن یک متغیر

    * How to assign a attribute to the variables
    variable x ;
    x.fx=5 ;
    variable y(j) ;
    y.fx(j)=10; کپی شده

    هم چنین عملکرد display y.scale چه چیزی میباشد

    1. محمودی

      با سلام و تشکر از دقت نظر شما. اصلاح شد.
      ما میتونیم به گمز دستور بدیم که یه متغیر پیوسته رو scale بکنه. یعنی مقیاسش رو برای ما تغییر بده. مثلا یه جا تو مدل میتونیم ۱۰*x داسته باشیم، حالا اگه x.scale رو بذاریم ۰٫۵ اون وقت مقایس x رو اومدیم دو برابرش کردیم، و وقتی scale رو نمایش بدیم با دستور display میاد همون ۰٫۵ رو به ما نشون میده. این کار یه سری کاربرد داره که مقداری باید در مورد model attributes مطالعه کنین. چون علاوه برا متغیرها، برای محدودیت ها و مدل ها هم میشه این عبارت رو با مفاهیم مختلف مورد استفاده قرار داد.
      این کلمات رو تو گوگل سرچ کنین.
      gams+model attributes+scale

      1. علی

        هم چنان همان حالت است چیزی تصحیح نشده یکبار دیگر باز بینی کنید ممنون میشم

  115. مهرداد

    سلام مممنون از سایت عااااااااااااااالی — من یه سوال داشتم — وقتی دو متغیر پیوسته رو در یک معادله در هم ضرب میکنم مسئله غیر خطی میشه (همچنین شامل باینری هم هست) و لذا از MINLP استفاده میکنم. اما باز هم ارور exit code3 رو میده. نمیدونم چرا؟ مگر وقتی مسئله غیر خطی داریم MINLP جواب نمیده؟ البته مطمعن هستم که مشکل ضرب ددو متغیر پیوسته هست. چون با حذف اون معادله مسدله جواب داره.
    ممنون

    1. محمودی

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

  116. علی

    سلام و عرض ادب
    من یک سوال فوری داشتم، اگر متغیر باینری(BC(c,si تعریف بشه و متغیر مثبت (C(c,si تعریف بشه، لازمه برای صفر نشدن BC رابطه ای بین متغیرا برقرار باشه؟
    سوالم اینه که اگر C مقدار داشته باشه، BC حتما مقدار ۱ میشه درسته؟
    متشکرم

    1. محمودی

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

  117. علی علیزاده

    سلام
    من اولین باره دارم با گمز کار میکنم لطفا اساتید راهنمایی کنین
    من سه تا متغیر دارم که در ۴ ساعت مختلف ، در هر ساعت باید مجموعشون یک عدد ثابت باشه و هر کدوم از این متغیرها یه تابع درجه دوم براش وجود داره که باید مجموع این توابع حداقل بشه
    خواهشا راهنماییم کنین
    در حقیقت من میخوام یه مساله unit commitment رو با استفاده از روش lagrange relaxsation در گمز حل کنم که مربوط به درس بهره برداری ارشد برق قدرت است
    ممنون

    1. محمودی

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

  118. میلاد

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

    1. محمودی

      سلام
      خروجی رو به اکسل فرستادین؟ اونجا صفر نشون داده نمیشه؟

  119. sina

    با سلام و عرض ادب
    میخواستم بدانم چطور می توانم دو متغیر را در یک رابطه ی شرطی قرار دهم؟

    1. محمودی

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

      1. sina

        یعنی این محدودیت شرطی را به صورت معادلات خطی بیان کنم؟

        1. محمودی

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

  120. z.p

    با سلام
    ببخشید یه سوال داشتم تعریف توابعی مثل exp در گمز چطوریه؟
    همینطوری بنوسیسم؟

  121. مسلم

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

    1. محمودی

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

  122. ناهید

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

    1. محمودی

      سلام
      فرض کنیم یه متغیر دارین به اسم x(t که اعداد مثبت رو می تونه به خودش بگیره. حالا شما میخواین بیشترین مقداری که پس از حل مدل برای این ۲۴ تا x تولید شده به دست بیارین.
      یه راهش اینه که برین تو خروجی نگاه کنین و هر جا بیشتر بود همون رو ملاک قرار میدین. یه راهش اینه که یه متغیر به اسم y تعریف کنین و محدودیت y>=x(t رو به مدل اضافه کنین و y رو display کنین.
      اگه سوالتون این بود اوکی. اگه نه که توضیح بیشتری بدین. تشکر

  123. علی

    سلام خسته نباشید
    من وقتی معادله رو به این شکل می نویسم ارور ۵۵ رو میده و میگه مدل با مدل خطی قابل حل نیست و غیر خطیش کن . من می خوام مدلم خطی بمونه. چه کاری می تونم بکنم .البته میتونم اعداد بدست آمده از یک متغییر رو خارج گمز با هم تقسم کنم ولی اگه راه حل داشته باشه ممنون می شم .
    مشکل :
    ۳ تا متغییر دارم . در یک طرف مساوی یک متغییر و در طرف دیگر مساوی دو تا متغییر دیگه رو بهم تقسم کردم و ضرب در ۱۰۰ کردم .فکر کنم ضرب در ۱۰۰ چون عدد مشکلی نداره و ارور فقط برا تقسم دوتا متغییر هستش .اگه دو تا متغییر بود می شد باز یکی رو تبدیل به ضرب در طرف دیگه مساوی کرد و مساله رو با حالت خطی حل کرد چون سه تا متغییره نمی دونم چه کاری می شه کرد .
    مثلا نمونه معادله ۱۰۰*x(t)=e=(y(t)/d(t))

    1. محمودی

      سلام
      نوع متغیر ها چی هست؟ صفر و یک؟ پیوسته؟ برای هر سه مورد نوع متغیر رو توضیح بدین ببینم چاره داره یا نه.

      1. علی

        سلام خسته نباشید.
        هیچ کودوم متغییر باینری نیستند و همشون متغییر مثبت هستند.d(t)ها عدد بدون اعشار (مثلا ۱۰و۲۰و۲۵و۱۵۰و۲۰۰و…..)و دو تای دیگه دارای رقم اعشار هستند(مثلا ۵۰٫۳و۴۰و۱۰۲و۱۰٫۲و۱۰و۹و۱۰۰۰٫۵و۱۵۰۰و…..) .

        1. محمودی

          مدل شما ظاهرا خطی نمیشه و باید به صورت غیر خطی حلش کنین. البته اگه تونستین خلاقانه این معادله رو به شکل دیگه ای بنویسین (یا حذفش کنین اگه به صورت محاسباتی هست صرفا). در غیر اینصورت باید غیرخطی حلش کنین و راهی ندارین احتمالا

  124. علی

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

    1. محمودی

      سلام
      تو تحقیق در عملیات و جبر خطی و غیر خطی، ما وقتی میگیم یه مدل غیر خطی هست، منظورمون اینه که خطوطی که با اون معادلات رسم میشن شامل خط مستقیم هستن و همواره فضایی که تشکیل میدن محب هست.
      تو غیر خطی این فرض نقض میشه. برای اینکه بدونین مدل غیر خطی چی هست. یه سری نشونه داره که هر کدوم رو اگه مدلتون داشته باشه، میشه اسمش رو گذاشت غیر خطی. این نشونه ها شامل اینا هست: ۱- ضرب و تقسیم دو متغیر تصمیم در هم ۲- وجود متغیر تصمیم در مخرج، زیر توان، در توان، زیر رادیکال، در توابع غیر خطی مانند سینوس، توابع نرمال و نمایی، ۳- تعدادی از مدلها هم به ظاهر خطی هستن. ولی شرایطی توشون ممکنه تعریف شده باشه و مدل رو غیر خطی کنه.
      برای منبع، میتونین کتابای تحقیق در عملیات (عادل آذر، زاهدی سرشت، مهرگان، آرایانژاد، مرتضی قمی) رو بخونین.
      انگلیسی هم به وفور یافت میشه. لیبرمن منبع قدیمی و البته خوبی هست.

  125. علی

    سلام .خسته نباشید .من تو این معادلات هم ارور ۵۶ رو دارم و نمی خوام مدل رو غیر خطی کنم .

    Equation01(y,t)..                (t_on(y,t-1)-MU(y))*(U(y,t-1)-U(y,t))=g=0;
    Equation02(y,t)..                (t_off(y,t-1)-MD(y))*(U(y,t)-U(y,t-1))=g=0;
    

    U(y,t)متغییر باینری – t_on(y,t) متغییر مثبت(۱و۲و۳و۴و۵و۶و….)و t_off(y,t) متغییر مثبت (۱و۲و۳و۴و….)و MU(y) و MD(y) پارامتر هستند و مقدارشون مشخص .
    آیا راهی داره که مدل رو خطی نگه دارم .ممنون می شم اگه راهنمایی کنین.تشکر

    1. محمودی

      سلام
      خطای ۵۶ یا ۲۵۶؟ اگه ۵۶ هست متن ارور رو بنویسین لطفا.
      مدل به این شکلی که نوشتین غیر خطی هست. برای خطی کردن ضرب یک متغیر صفر و یک و یک متغیر عدد صحیح به شکل زیر عمل کنین. فرض کنیم x صفر و یک باشه، و y هم عدد صحیح.

      wt=xtyt
      yLOxt≤wt≤yUPxtyt−yUP(1−xt)≤wt≤yt−yLO(1−xt)
      

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

      1. علی

        سلام خسته نباشید .
        من کامل متوجه نشدم . من الان رو این دو تا equation مشکل دارم . اینها رو به چه شکل بنویسم . اگه براتون امکانش باشه . دوتا مشابه هستن یکی شون رو اگه برام تو محیط خود نرم افزار بزارین ممنون می شم .
        الان wt=xtyt نوشتین t رو منظورتون همون اندیس (set) هستش . بین xt و yt علامت * داره .
        wt من اینجا ۰ هستش . و = رو باید =g= قرار بدم .
        یا خیر اول اینه رو که نوشتین بنویسم و بعد کد خودم رو .
        تو شماره ۲ که گذاشتین بین y و LO علامت ضرب هست یا LO خودش دستوره . بینxt و yt علامت * هستش بزرگتر کوچکتر ها که نوشتین به زبان گمز بنویسم =g= و =l=
        یک خط کدم رو برام از خود محیط گمز بزارین خیلی شفاف میشه برام.
        ممنون.

        1. محمودی

          بله دیگه به زبان گمزه. من مفهوم فرمولیش رو نوشتم. مقادیر LO و UP یعنی حداقل و حداکثر مقداری که برای متغیر y ممکن هست. شما به عنون یه زیر وند بشناسینش. t هم اندیس هست. اون بینا هم که گفتین ضرب هست. YLO یه عدده

      2. علی

        با سلام . ممنون از راهنمایی های مفیدتون.
        خطا ۵۶ هستش . Endogenous operands for * not allowed in linear models همون خطای مدل خطی .

  126. مهران

    با سلام و عرض ادب
    من مساله ای دارم که با rmiqcb حل میشه منتها متغییر باینری من عدد اعشاری میشه
    آیا راه حلش فقط اینه که مساله رو خطی کنم و با mip حل کنم که متغیرهای باینری اعشاری نشن؟

    1. محمودی

      سلام
      اون r که قبل از نوع مدل نوشتین باعث میشه که مدل به صورت آزاد شده حل بشه و فرض mip بودن رو زیر پا بذاریه. نوع مدل رو بذارین miqcp یا minlp و مدل رو حل کنین و مجددا ران کنین و نتیجه رو بگین که در موردش صحبت کنیم.

        1. محمودی

          اوکی. حالا مقادیری که solver status و model status به خودشون گرفتن رو اینجا بذارین. ممکنه جواب نشدنی باشه،

  127. علی

    با سلام و خسته نباشید.
    من یک equation دارم و می خوام این معادله رو حذف کنم ، چون متغییری که برام تولید میکنه می خوام در معادلات دیگه استفاده کنم و در نتیجه چون ضرب و تقسیم متغییر تصمیم مدلم رو غیرخطی میکنه لذا کارم ناتموم می مونه.
    هدف من اینکه این متغییر رو از لیست متغییرها حذف کنم و در لیست پارامترها قرار بدم، و با دستور loop وif …. و یا دستورات دیگه تولید کنم.و در بقیه جاها استفاده کنم. و میدونم قابل انجامه ولی بلد نیستم .
    این متغییر که می خوام پارامتر بشه اعداد -(D) -1و ۲ و ۳و ۱۰و ۲۴ و …کلا اعداد مثبت وصحیح هستن.و از طریقSUM یک پارامتر که صفر و یک (۰و۱) هستش – (X) و خودش با دستور loop وif وelse تولید شده بدست میاد . معادله اینه:وبه این صورت عمل میکنه تعداد متغییرهای X ی که برای i ها مقدار ۱ به خودشون گرفتن رو در هر t مثلا از t01 تا t14 جمع میزنه .و میگه مثلا تو t01 مثلا D=10 و تو t02 مثلا D=22 و …t14 مثلا D=30 :

    Equation01(t)..                     sum(i,X(i,t))=e=D
    
    1. محمودی

      سلام
      اگه درست متوجه منظورتون شده باشم. (فرض کنیم اندیس نداریم. برای اندیس دار میتونین از روش گفته شده در زیر ایده بگیرین).
      فرض کنیم یه متغیر به نام D داریم که مقادیری که گفتین رو باید تولید کنه. یه متغیر به نام y(i که باینری هست تعریف میکنیم که i به صورت ۱*۵ تعریف شده. حالا میخوایم D رو به گمز بفهمونیم. اول میایم D رو به عنوان integer variable تعریف میکنیم. و پارامتر Q(i) رو به صورت

      /۱ ۱,۲ ۲,۳ ۳,۴ ۱۰,۵ ۲۴/
      

      و دو محدودیت زیر رو به بخش equaion اضافه میکنیم.

      con.. sum(i,Q(i)*y(i))=e=D;
      con2.. sum(i,y(i))=e=1;
      
  128. علی

    سلام .
    ببخشید خواسته من این نیست .
    من می خوام D متغییر نباشه و به صورت پارامتر باشه و با دستورات IF و LOOP و ELSE تولید بشه.
    من که با معادله راحت می تونم D رو تولید کنم.

    1. محمودی

      ببینید این فرمایش شما ظاهرا شدنی نیست. چون یک قسمت مساوی باز شامل متغیر x هست.
      ولی اگه خواسته شما این باشه که فرضا یه بار D=1 بگیریم و مسئله رو حل کنیم و جواب رو ثبت کنیم و یک بار مثلا با D=22 و مسئله حل بشه و جوابا ثبت بشه، میتونین از loop استفاده کنین. به این شکل:

      [css]
      set s/1*5;
      parameter D1(s)/۱ ۱,۲ ۲,۳ ۳,۴ ۱۰,۵ ۲۴/
      objective(s)
      loop(s,
      D=D1(s);
      solve my model using…..obj;
      Objective(s)=Obj.l;
      );
      display Objective

  129. احمد

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

  130. احمد

    چطور میشه فایلو براتون بفرستم ببینید مشکلش چیه؟

  131. سهیل سلطان زاده

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

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

    با تشکر

  132. گرامی

    سلام خسته نباشید..
    ببخشید من تو کدم یک متغیر یک اندیسه رو برابر یک متغیر دو اندیسه قرار دادم ولی برنامه خطای infeasible میده چجور می تونم این خطا رو بر طرف کنم؟؟؟
    ممنون می شم اگر کمک کنید
    (ptfff (ha,n) $ (ord (n) eq 3) .. pc(ha,n)=e=ptf(ha

    1. محمودی

      سلام
      ربطی به تعداد اندیس نداره. ساختار مدل رو بررسی کنین و ببینین کدوم محدودیت ها با هم تضاد دارن. داده ها و کد هم چک کنین.

  133. احمد

    چطور می شود یک پارامتر را به عنوان کران یک summation تعریف کرد؟ در بسیاری از مدل های زمانبندی پروژه به این مورد نیاز هست.
    مثلا مجموعه p داریم که بصورت غیر مرتب ۲,۴,۶,۲۰,۱۱ است
    و summation قرار است ((f(p(i را بشمارد

    1. محمودی

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

  134. صدیقی

    با عرض سلام و خسته نباشید
    من یه مدل غیر خطی دارم که توش متغیر باینری داره و وقتی با سالور بارون حلش میکنم که متغیر ها رو صفر میده همچنین از عبارت
    Optimal optcr=0
    نیز در مدلم استفاده کرده ام
    ولی وقتی سالوری انتخاب نمیکنم براش به متغیرهای باینری عدد اعشاری میده.
    ممنون میشم منو راهنمایی کنید.

    1. محمودی

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

      option intvarup=0;
      
  135. صدیقی

    ببخشید من گمزمو که اپدیت کردم با توجه به لایسنسی که قبلا داشتم الان رو این نسخه همه سالورها دمو شده اند و هنگام ران به من
    Exit code=7
    میده. لایسنس رو هم سومین لایسنسی که شما تو سایتتون گذاشته بودین برداشتم.
    به نظرتون الان باید چیکار کنم؟

    1. محمودی

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

  136. صدیقی

    با سلام مجدد
    در مورد نظر قبلی یادم رفته بود که تاریخ رو به قبل از ۲۰۱۴ بازگرداندم
    این خطی رو که گفتین اضافه کردم ولی باز اعشاری داد متغیر های باینری رو
    اگر مشکل این است که مدل نشدنی است باید چیکار کنم؟
    با تشکر از وقتی که می گذارید

    1. محمودی

      سلام
      کد زیر رو قبل از دستور solveبذارین. و سالور رو هم بذارین رو baron یا lindo ببینین جواب میده یا نه. اگه نداد احتمالا نشدنیه. برا بررسی نشدنی بودن باید مدل، ساختار مدل، تعاریف، کد نویسی، داده ها همه و همه چک بشن.

      option optcr=0,optca=0,intvarup=0;
      
  137. اهرابی

    باسلام
    من در برنامم متغیر (RBC(t,n رو تعریف کردم. حالا نیاز دارم بدونم در هر t مقدار ماکزیمم RBC چقدر هست و از اون در معادلات دیگه استفاده کنم.از طرف دیگه در مدلم متغیر باینری هم دارم. به همین دلیل نمیتونم از فانکشن smax که به مدل dnlp نیاز داره استفاده کنم. میشه لطفا راهنماییم کنید چیکار کنم؟
    متشکرم

    1. محمودی

      سلام
      میتونین متغیری به نام RBCmax رو تعریف کنین که اندیس فقط n داره و مثبت هست. و معادله زیر رو که قراره بزرگترین مقدار RBC رو برای هر t حساب کنه رو به مدل اضافه کنین.

      c1(t)..  RBCmaxx(n)=g=RBC(t,n);
      
  138. مهدی رضائی

    با عرض سلام و خسته نباشید.
    مسئله ای است که از جمع چند عبارت غیرخطی تشکیل شده است.
    Landa(b,t)=e=sum(m$(ord(m)<ord(t)),x(b,m));
    Cost=e=sum((b,t),landa(b,t)*x(b,t));
    x متغیر و m زیرمجموعه t است. چطوری این قید را خطی کنم؟
    ممنون

  139. مهدی رضائی

    x میزان بار قطع شده(خاموش شده در اثر کمبود تولید) و landa مجموع بار قطع شده تا قبل از زمان t است. متشکر

    1. محمودی

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

  140. سیامک

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

    1. محمودی

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

  141. محدثه نادرشاهی

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

  142. mtm

    سلام اول اینکه تشکر از سایت خوبتون
    من قبل از اینکه بخوام سوال بپرسم سایت گشتم ولی ندودنستم برای حل مشکلم چکار کنم . .
    در گمزی که نوشتم نیاز دارم یه فایلو از اکسل بخونه و اگر مقدار متناسب با هر اندیس مقدار مشخصی بود . متغیر متناسب با همان اندیس مقدار ثابت بگیره . فکر کنم شبه کدش اینطوری بشه.
    فایل A از اکسل فراخوان شود.
    برای پارامتر A با اندیس ۱ تا N:
    اگر مقدار پارامتر i برابر با مقدار a بود :
    آنگاه مقدار متغیر iام را برابر با مقدار ثابت b قرار بده
    ممنون از راهنمایتون

    1. محمودی

      سلام
      یه حلقه بنویسین، بعد داخل حلقه یه شرط بنویسین (که شرط میتونه به صورت دلار باشه، و یا از دستور If استفاهد کنین.
      حلقه ها رو اینجا میتونین مطالعه کنین. حلقه رو به صورت loop بنویسین.

  143. آرش

    با سلام من یه مدل دارم که اندیس m آن از ۱تا ۱۰ هستش اندیس n آن از ۱ تا۸ هستش حالا یه متغیر داریم به اسم Y(m,n)
    این به شرط ۱ تا ۶ m و ۱ تا ۳ n این متغیر اینتجر و در بقیه موارد این متغیر باینری هستش ما اینرو چطور باید در گمز کد بنویسیم؟ ممنون می شم راهنماییم کنید.
    با تشکر

    1. محمودی

      سلام
      شما میتونین کل متغیر رو به صورت Integer تعریف کنین. حالا جاهایی که میخواین باینری محسوب بشهف تو یه محدودیت شرط بذارین که به ازای این m,n مقدار y کمتر مساوی است با یک.

  144. آرش

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

    1. محمودی

      لطفا به همون گفتگویی که باز میکنین جواب بدین که قاطی نشه کامنتا.
      مشکلی نیست. شما تو محدودیت اینا رو استفاده بکنین.
      فرضا متغیر شما x(m,n هست.
      [css]
      integer variable x(m,n);
      equations
      c1;
      c1(m,n)$(ord(m) <=۲ and ord(n) <=۳).. x(m,n)=l=1; [css]

  145. sahar

    سلام وقت بخیر
    متشکر از توضیحات و راهنمایی ها
    مجموعه من سال هست برای دوره زمانی ده ساله مثلا ۱۳۹۷ تا ۱۴۰۶٫متغییری که برای اون تعریف میشه در هر سال به مقدار سال قبل وابسته هست و باید مقادیر سال قبل در اون لحاظ بشه.(متغییر به صورت عدد صحیح تعریف کرده ام)بیان ریاضی اون به شکل زیر هست:
    مجموعه/ t/1:10
    متغییر m(t)

     m(1(= d1
    m(2)=d1+d2
    m(3)=d1+d2+d3
    ...
    m(10)=d1+d2+d3.....d10
    

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

    1. محمودی

      سلام
      برای اینکار شما باید یه اندیس دیگه به اسم مثلا tp هم تعریف بکنین و همچین معادله ای رو به مدل اضافه کنین.

      eq(t).. m(t)=e=sum(tp$(ord(tp) <= ord(t)), m(tp));
      
  146. sahar

    ممنون از پاسخگوییتون
    من مجموعه جدید رو به صورت
    tp/1*10/ تعریف کردم و همین معادله ای رو که گفتید به عنوان محدویت استفاده کردم.ولی خطاهای ۱۵۴(در قسمت (ord(t ، خطای ۱۷۱ (در قسمت m(tp) و خطای ۱۴۹ در قسمت m(t)رو نشون میده.اگر مقدور هست بازهم راهنمایی کنید ایراد کارم از کجاس ؟
    آیا به نظرتون نیاز هست در تابع هدفم تغییراتی ایجاد بشه؟

  147. خسروی

    سلام. وقتتون بخیر. یه سوال داشتم از خدمتتون. ببخشید من یک متغیر پیوسته به نام LT دارم که از رابطه ی زیر به دست میاد.
    LT=sum(i,c(i))/Cl
    که c(i) متغیر صفر و یک و Cl پارامتر هست.
    حالا یه متغیر دیگه میخوام تعریف کنم به نام TR که برابر ۱/LT (عکس LT) هست و مساله رو غیرخطی میکنه. راهی برای خطی کردن عبارت ۱/LT وجود داره؟

    1. محمودی

      سلام
      دقت بکنین که TR=1/LT در نتیجه TR*LT=1. حالا این رو روش فک کنین که چطور میشه خطی کرد.

  148. BABAN

    با سلام
    چطور میشه از جواب یک متغییر در بخش شرط if , while استفاده نمود.
    فرض کنید vn که یک متغییر است و از مجموع دو پارمتر در طول حل مسئله بدست می آید بخواهیم در بخش شرط دستورات while ,if ,… استفاده کنیم
    if Vnt (h)>0 ,
    pag=psb + pdb;
    );

    اگر شرط فوق برقرار بود عبارت pag را بدست بیاورد.
    vnt=dn+ft
    dn , ft دو پارامتر هستند که در هر ساعت از بازه ۲۴ ساعته متفاوت هستند.و پس از اجرای گمز مقدار dn بدست می آید.حال می خواهیم رابطه ای بنویسیم که برای مقادیر مثب متغییر vnt اجرا گردد.
    با تشکر

    1. محمودی

      سلام
      اگه این شرط رو بعد از دستور solve میخواین بدست بیارین، کافیه به نام متغیر فقط یک ویزگی .L اضافه کنی. یعنی مثلا به نام x.l به کار ببرین. در غیر این صورت بایدهمین شرطها رو به صورت یک یا دومعادله از نوع equation بنویسین. مقداری مدلسازی میخواد.

  149. Karim

    آقا سلام من یه مدلی نوشتم که دوتا متغیر تصمیم در هم ضرب میشن ولی نمیدونم این میشه چه مدلی؟خطیه ؟غیر خطیه ؟چی میشه مدلش
    هر کاری میکنم تو solve خطا میده

  150. نادعلی

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

    1. محمودی

      سلام
      به support یک ایمیلبزنین که براتون بفرستیم آموزشش رو.

  151. سحر

    با سلام
    من یه مدل دارم با هدف حداقل کردن هزینه که بعد از کامل شدن جواب نشدنی بدست اومد. سوالم اینه که در صورتی که قرار باشه از بین دو انبار یکی با توجه به هزینه حمل و نقل انتخاب بشه چطور این مورد رو میشه کدنویسی کرد
    من برای انبار متغیر باینری تعریف کردم و در هزینه های مربوط به اون ضرب کردم و با محدودیت برابر یک بودن مجموع حق انتخاب یکی از انبارها رو دادم.( sum (Is ,wIs(Is,t))=e=1) . اما در قسمت compilation گمز که نگاه کردم تابع هدف هر دو مکان رو مجزا ضرب در هزینه کرده و در واقع هر دو مکان را در تابع هدف لحاظ کرده لطف میکنید راهنمایی بفرمائید.
    تشکر بابت سایت و پاسخگویی خوبتون

    1. محمودی

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

  152. مرتضی

    با سلام
    من به دنبال خذف یکسری متغیر در یک مسئله milp هستم. مجموعه اندیس هایی که قرار متغییرهای متناظرشون حذف بشن رو پیدا کردم. شایط مجموعه های شامل ۱۰۰۰ تا ۱۰۰۰۰ اندیس باشه. لطفا راهنمایی بفرمایید چگونه میشه در واقع variable reduction رو در محیط گمز انجام داد. ممنون

  153. آرشام

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

    1. محمودی

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

  154. علی

    سلام و وقت بخیر
    موقع ران کردن کد مدل از نوع mimlp ارور زیر نشان داده می شود. مشکل از کجاست؟
    [–]
    — Reading solution for model mod_payoff
    — Executing after solve: elapsed 0:00:03.965
    — Ali_Heydari.gms(338) 4 Mb
    — Generating MINLP model mod_epsmethod
    — Ali_Heydari.gms(247) 6 Mb
    *** Error at line 247: division by zero (0)
    — Ali_Heydari.gms(340) 6 Mb 1 Error
    — Reset Solvelink = 2
    — Ali_Heydari.gms(340) 4 Mb
    *** SOLVE aborted
    — Putfile fx C:\Users\heydari\Desktop\PARAMETR\2kp50_augmecon2_results.txt
    — Ali_Heydari.gms(340) 4 Mb 1 Error
    *** Status: Execution error(s)
    — Job Ali_Heydari.gms Stop 09/22/13 02:09:59 elapsed 0:00:04.007
    Exit code = 3
    [/-]
    و خط ۲۴۷ عبارت زیر هست.
    [–]
    ۲۴۷ augm_obj..
    248 a_objval =e= sum(k1,dir(k1)*ZO(k1))
    249 + 1e-3*sum(km1,power(10,-(numk(km1) – 1))*sl(km1)/(maxobj(km1) –
    minobj(km1)));
    [/-]

    1. محمودی

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

  155. محمد

    سلام.میخواستم ببینم عدد مختلط در گمز به چه صورت نوشته میشه.مثلا عدد (exp(j 2π/۳

دادن پاسخ به elham × لغو پاسخ