۱,۱۳۹

معادلات، تابع هدف و محدودیت ها

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

معرفی و اعمال این معادلات در دو بخش Equation Declaration و Equation Specification انجام می شود. مثال زیر را در نظر بگیرید:

Equation-Dec

همانطور که ملاحظه می شود، در بخش اول دستور یا Equation Declaration، به تعریف و اعلام اسامی تابع هدف و محدودیت ها به همراه وابستگی اشان به اندیس های متناظر می پردازیم. co6 را در نظر بگیرید؛ این گذاره صرفا اسمی است که توسط کاربر برای محدودیت ششم انتخاب شده است و هیچ ارزش دیگری ندارد. در حالی که co1(i,j) وابستگی محدودیت اول به اندیس های i و jرا نیز نشان می دهد. و این معادل همان علامت ∀ در جبر خواهد بود. پس در واقع co1(i,j) یعنی قید اول به ازای هر i و j باید برقرار باشد. محدودیت جبری معادل:

Equation-sample

در بخش دوم یا Equation Specification، در هر سطر، اسم هر معادله یا نامعادله که در بخش اول به تعریف آن پرداختیم، آورده خواهد شد و سپس دو نقطه (..) مطابق شکل بالا جلویش خواهیم گذاشت. دقت شود که اگر در قید، شرطی مانند i≠j نیز داشته باشیم باید این شرط را قبل از دو نقطه ای که گذاشته ایم اعمال نماییم. اگر مبتدی هستید، هیچگاه تایپ دو نقطه را فراموش نکنید! چون برطرف کردن خطاهایی که به هنگام run کردن مدل خواهید دید، انصافاً شما را به شدت عصبی می کند!
مثال: کد محدودیت زیر را مشاهده می کنید:
محدودیت:
Equation-sample2
کد:

*Example
co1(i,j,l)$(ord(i) ne ord(j)).. z(i,j,l)=l=z(j,j,l);

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

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

در معادلات و نامعادلات، دیگر از علایم ≠یا=،≤،≥ استفاده نمی کنیم. نمادهایی که در معادلات و نامعادلات در GAMS به کار می روند به قرار جدول زیراند:
equation-syms

از سنبل هایی که در جدول بالا معرفی شد، به ندرت پیش می آید که از =n= و =c= استفاده شود. در واقع این نمادها کاربرد خاص وتخصصی دارند.

جهت روشن تر شدن موضوع مثال زیر را در نظر بگیرید:
Equation-Example1

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

*Example2
Equation
objective
Constraint1
constraint2
;
objective.. o=e=x1+x2 ;
constraint1.. x1*x2=l=10 ;
constraint2.. x1-x2=g=2 ;

دقت کنید که کد بالا کامل نیست و باید قبل از تعریف این معادلات متغیرهای x1 و x2 و همچنین متغیر مربوط به تابع هدف یا o قبلاً تعریف شده باشند.

بپردازیم به ادامه ی مثال کاربردی ۱:

مدل تنها دو محدودیت دارد. آن ها را به ترتیب cont1 و cont2 و تابع هدف را obj می نامیم. نتیجتاً کد مربوطه به صورت زیر خواهد بود:

Example1-Equation definition

بحث در باب تعریف معادلات در GAMS به اتمام رسید. با اندکی تمرین و دقت می توانید به سادگی تعریف کردنِ معادلات و وارد کردن تابع هدف و محدودیت ها را فرا بگیرید. مباحث تکمیلی در همین برگه خدمت عزیزان ارائه خواهد شد.

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

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

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

 

1,139 دیدگاه در “معادلات، تابع هدف و محدودیت ها

  1. مرسی، ولی نه اینجوری نیست
    من میخام ترتیب i ها در بیارم
    مثلا اگه میگم روی i از ۱ تا i-1 جمع بزنم منظورم اینکه روی اولین i(سفر) تا یکی مونده به آخرین سفر جمع ببندم، نه اینکه عدد خود i ها برام مهم باشه!

    (یعنی ممکنه اولین i باشه ۳ دومین i عددش باشه ۱ , من عدد i ها برام مهم نیست. فقط میخام اولین i و دومین i باهم جمع بشن بدون توجه به اینکه عدد i چیه
    )

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

  2. خیلی خیلی ممنون .ولی نمیشه با ord(i) بنویسم ؟

    میخوام بدونم همچین چیزی شدنیه که بنویسم K=0rd(i) بعد روی k تا k-1 جمع ببندم؟
    یا نمیشه ؟

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

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

  4. سلام ببخشید من قبلا ی سوال پرسیدم و شمام جواب دادید ولی درک نکردم. یه بار دیگه میپرسم شاید بتونید بهترراهنمایی بکنید. یه سامیشن دارم که از k(i) شروع میشه و تا عدد ۶ ادامه داره. حالا خود k(i) یه پارامتره که بین یک تا سه هست. این میشه اینجوری نوشت؟
    scalar
    i number of subsystems/s1*s14/;
    parameter
    k(i)/ s1 2,s2 1,s3 3,s4 2,s5 1,…/;
    .
    .
    .
    obj..rly=e=sum((k(i)$(ord(k(i)),…);

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

  5. =سیگما از f برابر با ki تا ۶ سیگما از q تا ۴
    f یه شمارنده هست.
    ki یه پرامتره( چهارده تا عدد)
    q یه مجموعه هست از یک تا چهار.
    ممنونم.

  6. سلام اگه بخوایم حد بالای سامیشن و بذاریم چطوری میشه؟
    مثلا بگیم سامیشن از l ( ی اندیس از صفر تا شیش) تا q-ki
    q یه شمارنده از صفر تا شیش
    ki یه پارامتر (عدد تصادفی بین یک تا سه)
    i یه اندیس از یک تا چهرده.
    خیلی ممنون.

  7. sets
    i/1*14/
    e/a,c/;
    parameter
    U(i)/1 a,2 a,3 a,4 a,5 a,6 a,7 a,8 a,9 c,10 c,11 c,12 c,13 c,14 c/;
    توی تابع هدف یه سیگما دارم که حد پایینش گفته اگر i عضو a بود آنگاه ال ان بعدش یه سیگما دیگه… میشه اینطوری نوشت؟ اگه نه چطوری درست میشه؟
    sum(u(i) $(ord(u(i)=k(i)),l $(ord(l)=ord(k(i)))),fctrl(q)/(fcrtl(l)*fctrl(q-l))

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

    • من این جوری برداشت کردم که باید یک پارامتر اولیه تعریف کنی و بری سراغ حلقه فور بعد هر تغییری که می دی در نهایت د ر این پارامتر بریزی مثلا
      parameter A(i,j);
      A(i,j)=uniform(1,10);
      for i=1:end
      A(i,j)=A(i,'1')*10;
      end

  9. با سلام و خسته نباشید
    سوالم این بود که من یک محدودیت به فرم زیر دارم
    (CC(iii,j,k)-S(iii,j,k
    الان می خوام متغییر CC آخرین عضومجموعه iii را اختیار کنه ولی متغییر S اولین جمله همان مجموعه را.
    چه شرطی باید بزارم ؟

  10. سلام. وقت بخیر. ممنون از سایت خوبتون.
    من یه متغیر مثل (p(t,k,q دارم. حدود این متغیر به شکل جدول زیر است:
    (table Pmax(k,q
    q1 q2
    k1 150 200
    k2 25 75
    تا وقتی (p(t,k,q برای q1 به مقدار (Pmax(k,q1 نرسد، (p(t,k,q برای q2 مقدارش صفر است. یعنی (p(t,k,q برای q2 تنها زمانی میتواند مقدار غیر صفر داشته باشد که(p(t,k,q برای q1 به مقدار (Pmax(k,q1 رسیده باشد. به عبارتی میخوام یک تابع پله ای صعودی رو تعریف کنم. این محدودیت در گمز چطور بیان میشه؟

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

        • سلام توی محدودیت های گمز نمی تونین از حلقه ها و شروط استفاده کنین و گمز ارور می ده. فقط می تونین از دستور ifthen استفاده کنین.

          X=e=ifthen(condition,expressioniftrue,expressioniffalse);

  11. با عرض سلام و وقت بخیر خدمت جنابعالی . ببخشید مدل من شامل ۷ تابع هدف می بود که آنها را یکی یکی در گمز تعریف نموده ام و چون تابع هدف کلی از مجموع آن ۷ تابع می بود تابع کلی به صورت Min zA =∑_۱^۷▒max⁡z نوشته ام البته مدل دو هدفه می باشد و یک تابع دیگر نیز دارم که به صورت Min zB =Max Cikتعریف شده است. نمیدانم کد مربوط به توابعی که هم شامل مینیمم و هم ماکزیمم هست چگونه نوشته می شود.لطفا بهم کمک کنید. خیلی ممنون از شما و وب سایت خیلی خوبتان.

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

  12. با سلام و عرض خسته نباشید خدمت شما. و با تشکر از سایت خیلی خوبتان. ببخشید من مطالب آموزشیتان را مطالعه نمودم و از آنها استفاده نمودم ولی متاسفانه به مقصود خود نتوانستن برسم و سوالم برطرف نگشت. مدل ریاضی خودم را در گمز اجرا نموده ام و حال برای دو تابع هدف در مدلم از روش رباست استفاده نمودم و آنها را با روش رباست نوشته ام ولی نمی دانم که کد گمز مربوط به انجام توابع رباست چگونه است.دو تابع به صورت زیر می باشند. ممنون می شوم که کمک کنید.
    Zs1= ∑_(s∈)▒p_s z1s + ∑_(s∈)▒p_s )z1s – ∑_(s∈)▒p_s z1s )2
    Zs3= ∑_(s∈)▒p_s z3s + ∑_(s∈)▒p_s )z3s – ∑_(s∈)▒p_s z3s )2

  13. سلام ببخشید من زیاد متوجه توضیحتان نشدم متاسفانه.من یک تابع هدف minzb=maxcik اگر در اینجا b,i,k اندیس باشند با محدودیت zb بزرگتر مساوی است با ci,k را داشته باشم. ابتدا maxcik=u یک مقداری مثل u نمودم.حال در گمز به صورت زیر نوشته ام.که در ادامه توابع قبلی مدلم آورده ام. یعنی این تکه تازه به کارم اضافه شده است.
    obj6.. z4=e=u(i,k);
    obj7.. ZT2=e=we1*z4;
    cont13(i,k).. zt2=g=c(i,k);
    تکه قبلی مدلم در گمز بدونه هیچ errory ران گشته ولی این تکه کار که اضافه شده خیلی مشکل برخوردم.حالا آن قسمت مربوط به solve را می دانم حل می نمایم ولی قسمت مربوط به تابع هدف و محدودیت را نمی داانم چگونه اضافه نمایم.من بعد از اضافه شدن این قسمت به کارم یک مجموعه k به مدل اضافه نموده ام با یک متغیر u به قسمت متغیر ها. و پارامتری ندارم در تابع هدفم یعنی minzb=maxcik که i و k به صورت اندیس بوده و در set تعریف شه است.خیلی ممنون میشوم که کمکم نمایید تا بدانم چگونه باید کد گمز این قسمت را بنویسم و به ادامه مدلم اضافه نمایم.خیلی ممنون از وب سایت واقعا ضروری و خوبتان برای ما.

  14. با سلام خدمت شما. میشه در نوشتن کد زیر کمکم نمایید.اگر تابع هدف MinZ1=MaxQik باشد و محدودیت آن ■(Z1≥Qik &∀i,k)باشد. ابتدا من اماده ام مقدار MaxQik را برابر با عبارت E قرار داده و در ادامهMin Z1 = E با محدودیت E ≥ MaxQik نمیدانم تا اینجای کار درست است یا خیر؟؟؟کد آن در گمز به صورت زیر میزنم اررور میده. میشه کمک کنید. و اینکه ایا در اینجا باید پارامترم تعریف بشه؟؟؟ چون فقط تابع هدفم یک متغیر هست. نمیدانم پارامتر چی بزنم.


    set
    /i productions /i1*i10

    k machines /k1*k5
    positive variables
    E(i,k)
    Equations
    obj1.. Z1=e=E(i,k);
    cont1(i,k).. E=g=Q(i,k);

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

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

  15. وقت شما بخیر
    چه طور میشه در محدودیت ها از بین دو مقدار ماکزیمم رو بدست بیاره

    مثلاً میزان تاخیر برابر است با تفاضل زمان تکمیل و زمان سررسید است و چون بعضی مواقع منفی میشه میخوایم که صفر حساب کنه.
    (max(0,d-c

    • سلام
      شما به همین شکلی که نوشتین میتونه درست باشه. ولی همه ی سالورها این تابع رو پشتیبانی نمیکنن.
      همچنین این رویه تابع نویسی باعث میشه مدل غیر خطی بشه. بهتره با یه سری تکنیک و خلاقیت خطیش کنین. و محدودیت معادلش رو بذارین به جاش.
      مثلا فرض کنیم. هدف کمینه کردن x هست.
      شما برای عبارت x=max(0,d-c) میتونین بنویسین x=g=d-c
      دیگه بستگی به مدل و خواسته ها و ساختار مدل شما داره.

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

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

    مجموعه ها را به صورت ذیل تعریف نموده ام:

    SETS
    i/0*5/
    k/1*2/
    subi(i)/1*5/
    h/1*2/
    u/1*2/
    ;

    alias (i,j,p);
    alias (subi, subj);

    و می خواهم محدودیتی به صورت زیر بنویسم که در آن متغیرهای تصمیم باینری هستند:

    e14(i,j,k,h)..x(j,p,k-1,h)=L=2-x(i,j,k,h)-y(i,j,h);

    اما با ارور زیر مواجه می شوم:

    e14(i,j,k,h)..x(j,p,k-1,h)=L=2-x(i,j,k,h)-y(i,j,h);
    **** $149

    149 Uncontrolled set entered as constant

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

  19. سلام
    لطفا میشه راهنمایی کنید تابع زیر رو که مربوط به ازاد سازی لاگرانژ هست به چه شکل میشه کد کرد
    min∑∑▒〖 zij*√(〖(xi-xj)〗^۲+〖(yi-yj)〗^۲ )+u(i)*(bi-∑ (qj*zij)) 〗

    I=1 to 6
    J= 1to 30

      • سلام
        تابع هدف شما دو بخش داره. برای هر کدوم سامیشن جدا در نظر بگیرین بهتره.
        با این حال پس شما باید یک پرانتز (پرانتز بسته) دیگه به بخش اول اضافه کنین و یه سامیش روی i به بخش دوم (شامل u,b,…) اضافه کنین. این ارور نشون میده که شما یه بار روی j سام نوشتین و دوباره بدون اینکه سام قبلی رو ببندین دوباره دارین روی j سام میزنین.

        • **** The following MIP errors were detected in model allocation:
          **** 51 equation obj.. the function POWER is called with non-constant arguments
          **** 51 equation obj.. the function POWER is called with non-constant arguments
          **** 51 equation obj.. the function SQRT is called with non-constant arguments
          **** 56 equation obj.. VAR operands for *

          سلام
          مجددا برای زحمت مزاحمتون شدم
          من مدلم رو نوشتم . مدل مکانیابی تخصیص که با لاگرانژ باید حل کنم . برای ۳۰ مکان اعداد تصادفی تولید کردم . اما با توجه به اینکه ریشه دوم عدد ثابت میخواد و ارور گرفته شما فکر میکنید من باید به چه شکلی اعداد تصادفی رو در بیارم که ایراد نگیره

  20. با سلام و احترام

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

  21. سلام. binary زمانی استفاده میشه که میخوایم جوابو صفر یا یک کنیم. زمانیکه سه شرط دارم چکار کنم. مثلا:
    max v
    sum(j,x(i,j))-sum(k,x(k,i))={v if i=s(source) ,-v if i=t(sink) ,0 o.w.}
    یا مثلا:
    if -1 (i=0),1 if (i=d and s=S), 0 o.w

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

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

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

        sets m number of objective /1*2/
        I /i1,i2/ ;
        Positive Variables x[I];
        Variable f1,f2;
        Equation g1,g2,Obj(m1),Obj(m2);
        g1.. 2.5 - 0.5*power{(x['i1'] - 2),3} - x['i2'] =g= 0;
        g2.. 3.85 + 8*sqr(x['i2'] - x['i1'] + 0.65) - x['i2'] - x['i1'] =g= 0;
        * ... objective functions
        Obj(m1).. f1 =e= sqr(x['i1'] + x['i2'] - 7.5) + 0.25*sqr(x['i2'] - x['i1'] + 3);
        Obj(m2).. f2 =e= 0.25*sqr(x['i1'] - 1) + 0.5*sqr(x['i2'] - 4 );

        alias (m,j);
        parameter p(m) ’selection of objective’;
        equation objective ’select correct obj by assigning to p’;
        objective.. obj =e= sum(m,p(m)*Obj(m));
        model ap /all/;
        loop(j,
        * select correct objective function
        p(m) = 0;
        p(j) = 1;
        * solve problem
        solve ap using nlp maxiimizing obj;
        * add fixed objective
        obj.fx(j) = obj.l(j);
        );

        • سلام
          خیر. اینجوری p رو همیشه یک میگیره. قضیه رو خیلی ساده بگیرید.
          مدل یه بار با هدف اول حل میشه (دستور solve اول) و هدف اول fix میشه.
          تو مرحله بعد هدف دوم حل میشه (دستور solve دوم)
          همین کافیه برای شما.

  23. سلام و خسته نباشید
    من یک مسئله زمانبندی رو میخوام در گمز کد کنم با هدف min کردن سیگما wj در Uj
    و با استفاده از الگوریتم کوله پشتی
    سه تا کار دارم میخوام بگم همه ترتیب های ممکن از هر سه تا کار رو که میشه ۶ حالت حل کنه بعد کوچکترین مقدار حاصل رو نمایش بده.
    این رو چطوری میتونم کدشو بنویسم توی گمز؟؟

      • سلام
        اندیس i برای تعداد کارها هست که سه تا کار داریم.برای پارامترها هم (p(i زمان پردازش هر یک از کارها و (w(i مطلوبیت هر یک از کارها هست و یک پارامتر دیگه به نام maxw داریم که مقدارش ۱۰۰ هست. و (u(i هم متغیر باینریه. و تابع هدف هم سیگماu(i)*(w(i هست.میخوام بگم تمام ترتیب های ممکن از این سه تا کار رو در نظر بگیره و مقدار تابع هدف رو برای هر کدوم به دست بیاره. یعنی مثلا یک بار u کار یک رو برابر یک قرار بده تابع هدف رو محاسبه کنه یک بار u کار یک و دو رو برابر یک قرار بده و به همین ترتیب که کلا ۶ حالت میشه.بعد کوچکترین مقدار به دست اومده رو display کنه
        منظورم این بود که این دستورها رو چطوری بنویسم توی گمز

        • خب ظاهرا شما تابع هدفتون سیگما u*w هست. پس من در این مورد نظری نمیدم.
          ولی برای display کردن کمترین مقدار u*w بهتره شما یه پارامتر به اسم مثلا UW تعریف کنین. و بعد از دستور solve بیاین کد زیر رو قرار بدین:

          UW=smin(i,u(i)*w(i));
          display UW

        • خیلی ممنون از پاسخگوییتون
          میشه این رو هم راهنمایی کنید من تابع هدف و محدودیتم به این صورت هس
          (max z= ∑u(i)w(i
          100=<(∑u(i)p(i
          i=1,2,3
          11=(p(3)=90 ,p(2)=9 ,p(1
          1,0=(u(i
          میخوام با در نظر گرفتن محدودیت بالا تمام جوابهای ممکن برای z به دست بیاد.این رو چطور میتونم کد کنم؟

        • معادله رو خوب ننوشتین، البته چاره ای هم نیست، مقداری کامنت گذاری اصول خودش رو داره برا فرمول نویسی.
          یعنی چه مقادیر ممکن z؟

    • سلام
      برای فاکتوریل در گمز fact(n)
      و برای سوال دومتون فرض کنیم اینجوری تابعه minMax x+2 حالا معمولا میان x+2 رو مساوی یه چیزی قرار میدن. مثلا A بعد میبرنش تو محدودیت ها و میگن که x+2>=A و تابع هدف رو اینجوری مینویسن. Min A

  24. سلام
    ببخشید این بخشی از مدل من هستش
    L(k,d)=I(k,d) ∀K∋K│t(k)=1,∀D∋D
    k اندیس مسیر
    D اندیس انبار
    t(k) پارامتر : روزی که در ان مسیر k زمان بندی میشود
    L(k,d) متغییر باینری : اگر مسیر k از انبار d شروع شود
    I(k,d) متغییر باینری : اگروسیله نقلیه مربوط به k در ابتدا در انبار d باشد.
    این محدودیت رو چطور میتونم کد کنم ( مشکل من روی t(k) هستش )
    باتشکر از شما و سایت بسیار خوبتون

    • سلام
      مچکرم و خواهش میکنم.
      اگر اون t متغیر هست، پس میتونین از دستور ifthen استفاده کنین که مدل رو غیر خطی میکنه. در صورتی که میخواین غیر خطی نشه، باید با مقداری خلاقیت از M بزرگ یا متغیرهای صفر و یک کمکی یا ترکیب هر دوی اینها یا روشهای دیگه ی خلاقانه استفاده کنین که این مفهوم رو پیاده کنین.
      اگر طبق اون چیزی که شما گفتین t پارامتره، که t رو اول تعریف و عدد دهی کنین، تو مرحله بعد تو محدودیت با استفاده از دستور دلار $(t(k)=1) شرط رو اعمال کنین. مثالاش تو کامنتای بالا هست.

      • مرسی از کمکتون
        یعنی من میتونم یه متغیر پیوسته مثلا زمان رو در اندیس یه متغیر بیارم
        مثلا T زمان اتمام مسیر که متغیر پیوسته هستش و S(T,c) موجودی در زمان T (که متغیر بود) در انبار c (اندیس)

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

        Y(i,k)≤ E(i,V(k)) ∀i∋I , ∀K∋K
        Y(i,k) متغیر : اگر مشتری i توسط مسیر k خدمت ببیند .
        E(i,k) متغیر : اگر مشتری i توسط وسیله نقلیه v خدمت ببیند .
        V(k) پارامتر : وسیله نقلیه مربوط به k
        چطور میتونم اینو کدکنم

        • خواهش میکنم.
          این محدودیت بحث خواصی روش نیست. فقط قضیه روی E هست. درسته که باید توی فرمول ریاضی نوشت v(k) ولی باید سه تا اندیس براش گذاشت، به این اینصورت: E(i,v,k)
          بسته به مدل شما ممکنه همین که هرجای مدل v(k) دیدین، باید دو اندیسه کنین و همین براش کافی باشه.
          ببینید یه بحثی هست تو تعریف اندیس ها بهش میگن multi-dimensional sets که تو یه تاپیک جدا توضیحش دادیم. اونو بخونین ایده اینکه v(k) رو چجوری بیارین تو مدل رو یاد میگیرین. توصیه من اینه که یه متغیر چندبعدی به نام vk(v,k تعریف کنین و تو اون محدودیت (که E رو سه اندیسه کردین) یا محدودیت های مشابه که v(k استفاده شده توشون به عنوان شرط به کار ببرین.
          این تاپیک رو بخونین

  25. با سلام و خسته نباشید
    مرسی از کمکتون RUN شد .
    ببخشید من یه متغیر Boolean به نام Z(k) دارم که به معنی این است که Z(k) برابر ۱ است اگر مسیر k جز راه حل باشد
    v اندیس : مجموعه وسیله نقلیه V=(1,……,Vmax)
    میخواستم بدونم Z(k-Vmax) یعنی اخرین ماشینی که به مسیر تخصیص داده شده است هستش یا نه و اینو چطور میتونم کد کنم
    باتشکر

  26. با سلام
    در تعریف متغیرها اگر بخواهیم روی اندیس متغیر شرط گذاشت به چه شکل باید نوشت؟
    به طور مثال(X(i,n که /i/0*5 و i برای متغیر X حتما صفر باشد.

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

      $(ord(i)=1)

      این مساوی یک منظور همون صفر شماست (شماره نده ش یک باشه یعنی اولین عضوش)

      • ممنونم
        ببخشید مسأله من دو هدفه و مدل به صورت MIP است وقتی به قسمت آخر میرسم و دستور SOLVE به ازای تابع هدف اول و محدودیت ها میدم خطای زیر را پیغام میده مفهومش چیه؟

        ۵۱ Endogenous function argument(s) not allowed in linear models
        256 Error(s) in analyzing solve statement. More detail appears
        Below the solve statement above

        • سلام
          مدل شما خطی نیست. و بخشی غیر خطی توی مدل شما هست. از عباراتی مانند minlp و nlp و dnlp استفاده کنین.

  27. با عرض سلام و خسته نباشید
    من یک متغیری دارم که در دو محدودیت دو اندیس متفاوت گرفت و نمی دونم اینو چطور کد کنم
    متغیر پیوسته x(r,k,p) :مقدار محصول تحویل داده شده به مشتری r توسط مسیر k در دوره p
    متغیر پیوسته y(c,k,p) :مقدار محصولی که توسط مسیر k در دوره p به انبار c وارد می شود.
    پارامتر I(c,p) : مقدار محصول ذخیره شده در مرکز توزیع c در دوره p
    اندیس p : مجموعه ای از دوره ها
    پارامتر fmax : حداکثر مدت متوالی که محصول می تواند ذخیره شود
    محدودیت ۱
    I(c,p-1)+sum(k,y(c,k,p)) =sum((r,k), x(r,k,p))+I(c,p) ∀ p∈P,c∈C
    محدودیت ۲
    I(c,p) ≤ (∑ p-fmax-1 <f< p -1 ∑k x(r,k,f)) ∀ p∈P,c∈C,r∈R
    p-fmax-1 <f< p -1 و k اندیس های زیر سیگما هستن
    مشکل بنده روی اندیس متغیر x هستش .
    با تشکر و مرسی از سایت بسیار خوبتون

    • سلام
      تشکر و خواهش میکنم.
      برای f از دستور alias استفاده کنین. بخش مجموعه ها رو ببینید.
      برای اون شرطی هم که گفته شده، از دستورات شرطی نظیر دلار $ و ord استفاده کنین. مثالاش رو تو کامنتای بالا می بینید.

    • سلام
      میتونین اینو دو تا محدودتش کنین.
      یا اینکه میتونین بعد از تعریف متغیرتون شرط کران بالا و پایین براش بذارین. مثلا اینجوری بنویسین.
      Qk.lo=Qkmin
      Qk.up=Qkmax

  28. سلام خیلی ممنون بابات سایت خوبتان. من یک محدودیتی به شکل زیر تعریف کردم ولی ارور ۹۶ رو گمز میده. مشکل چیه؟ ممنون میشم اگ جواب بدین
    co2(drp,t)$(ord(t)>1)

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

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

    متغیر پیوسته I(r,k-1) : میزان موجودی مشتری r در دوره منهای ۱ که وسیله نقلیه k زمانبندی می شود
    متغیر پیوسته sp(r,k) : میزان تقاضای مشتری r که توسط وسیله نقلیه k در همان دوره تحویل داده می شود .
    متغیر پیوسته I(r,k) : میزان موجودی مشتری r در همان دوره ای که وسیله نقلیه k زمانبندی می شود.
    پارامتر t(k) : روزی که وسیله نقلیه k زمانبندی میشود
    محدودیت
    I(r,k-1) + ∑ w∈k ,sp(r,w) = q(r) + I(r,k) ∀K∈K│t(k)≥۱,∀r∈R

    فکر کنم با دستور ord , alias باید بنویسم ولی دقیق نمیدونم چجوری هستش یا اصلا منطق محدودیت درست هستش یا نه .
    باتشکر از سایت بسیار خوبتون

    • سلام
      دوست عزیز شما به سه تا اندیس احتیاج دارین! k,r,t
      مدلهای موجودی رو حتما ببینید شما. حسی مدل ندین. اینجوری بیشتر وقتتونو میگیره. یه مدل پایه برای کارتون انتخاب کنین و همون رو توسعه بدین خیلی صرفه جویی میشه و سردرگمی هم از بین میره.

      • سلام خسته نباشید
        ببخشید من اینو داخل یه مقاله دیدم فقط با این تفاوت که I(r,k) بجای متغیر پارامتر بود یعنی با حالت پارامتر هم این مدل بی معنی هستش
        باتشکر

        • معمولا پارامتر نیست. ببینید اونجا احتمالا گفتن که پارامتر وابسته هست که از نظر ما باز هم متغیر میشه.
          شما فقط باید برای I0 عدد و پارامتر در نظر بگیرین. بقیه ش باید متغیر باشه.

  30. با سلام محدودیت زیر را چطور میشه کد بندی کرد ممنون میشم اگه راهنمایی کنید
    j ∑_q(QIJ)_ijp =∑_v ∑_e (QVI)_vie + ∑_k ∑_p (QKI)_kip ∀i ∈I_∑
    من به صورت زیرکد بندی کردم ولی ارور میده
    ;((constrict4 .. sum((j,p),QIJ(i,j,p))=e= sum((v,e),QVI(v,i,e))+ sum((k,p),QKI(k,i,p

    Uncontrolled set entered as constant

  31. سلام خسته نباشید
    مرسی از کمکهای همیشگی شما
    ببخشید من از داده های یه مقاله استفاده کردم اما یجا نوشته بود مقادر
    پارامتر d(r)∈u[1,400] و df(r) =d(r)-q(r)∈ u[1,400] و w(r)-d(r)∈u[1,400]
    مشکل من روی دوم وسومی هستش که چطور این مقدار رو وارد کنم چون وقتی df(r) =d(r)-q(r)= uniform[1,400] و w(r)-d(r)=uniform[1,400]
    کد میکنم خطا میده .
    باتشکر از سایت بسیار خوبتون

  32. سلام خسته نباشید
    یه سوال داشتم : محدودیت به صورت زیر رو چه جوری باید کد نویسی کرد که اشتباه نباشه،گمز به p+1 که در اندیس u نوشتم ایراد میگیره

    co14(o,oo,p,g) ..u(o,p,g)*u(oo,p+1,g)=e=eu(o,oo,p,g)

    ممنون میشم کمکم کنید

  33. با سلام و احترام و ضمن سپاس از راهنمایی موثر شما
    من در مدلسازی مساله ای با نرم افزار GAMS با مشکلی مواجه شده ام. توضیحات و کد را به ایمیلتان ارسال نموده ام. خواهشمندم در صورت امکان راهنمایی فرمایید.

  34. با سلام
    قصد دارم یک محدودیت برای کنترل رعایت پیشنیازی در مساله زمانبندی پروژه بنویسم که در آن اندیس j محدودیت روی تمام مقادری j هستش و اندیس jj آن روی اعضایی از j که در عنصر j ام از مجموعه p عضو باشد(عنصر j ام p پیشتیازهای فعالیت j را نشان میدهد) در واقع اعضای p میتوانند هر یک خودشان یک مجموعه باشند
    این مورد چه طور باید انجام شود
    co5(j,jj) ..sum((t,m),x(j,m,t))=l=sum((t.m),x(jj,m,t))

  35. ممنون تو همون قسمتی که گفتید روش کار رو پیدا کردم

    ولی الان برای محدودیت زیر خطای کمبود پرانتز (۸) برای بعد از $ میده
    co6(e) ..sum((j$(eq6(e,j)),t,m),x(j,m,t))=e=sum((j$(eq66(e,j)),t,m),x(j,m,t))

  36. سلام و عرض ادب
    درمقاله ای که من کد آن را نوشتم یک محدودیتی دارد که دو مجموعه روی یک سیگما نوشته شده است . در اینجا روی یک سیگما مجموعه i و j که مجموعه گره ها میباشند نوشته شده است. i, j هردو عضو مجموعه کمانها هستند. چطور این را وارد گمز کنم.ممنون از راهنماییتون

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

  37. سلام خسته نباشید
    اگر قیدی به صورت زیر داشته باشیم
    ۱<a<b<3
    a کوچکتر از b و بزرگتر از یک و b بزرگتر از a و کوچکتر از ۳٫
    اگر در معادلات سیگما روی a تا b تعریف شود در گمز به چه ثورت باید نوشت؟
    با تشکر

  38. سلام
    خسته نباشین
    یه سئال از خدمتتون داشتم ممنون میشم راهنمایی بفرمایید
    من در معادلاتم میخوام یه شرطی رو وارد کنم که اون شرط تابع یک متغیره
    cost=e=sum( NDG,DGData(NDG,’replacement-cost’)*sum( i $ (ord(i) le NrepDG(NDG)),1/((1+realrate)
    NrepDG(NDG) خودش یک متغیره و اجازه نمیده همچین شرطی رو وارد کنم
    ممنون میشم راهنمایی بفرمایید چیکار باید بکنم

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

  39. سلام
    من میخواستم کدی بنویسم که عدد تصادفی ۱ یا -۱ را برای من تولید کند، یعنی فقط همین دو عدد و نه عددی در بین آنها، برای اینکار از دستور if به شکل زیر استفاده کردم، ولی خطا داد. ممنون میشم راهنمایی کنید.

    sets i /1*600/
    sets j /1*3/
    ;

    parameter R1(i,j);
    execseed = 20000*(frac(jnow));
    R1(i,j)=uniform(-1,1);
    if (R1(i,j)>=0 ,
    R1(i,j)=1;
    else
    R1(i,j)=-1;
    );

    • سلام
      اینشکلی بنویسین.

      sets i /1*10/
      sets j /1*3/
      ;

      parameter R1(i,j);
      execseed = 20000*(frac(jnow));
      R1(i,j)=uniform(-1,1);
      loop((i,j),
      if (R1(i,j)>=0 ,
      R1(i,j)=1;
      else
      R1(i,j)=-1;
      );
      );
      display r1

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

  41. با سلام
    دو محدودیت زیر
    ①A(i,k)+(∑(B(i,j,k).C(i,j,k)))–D(i,k)=A(i,k+1) for each i and K
    ② A(i,1)=0 for each i and k=1
    رو در گمز بصورت زیر کد کردم:
    Positive Variable
    A(i,k)
    A(i,k).fx(i,”1″)=0
    Binary Variables
    C(i,j,k)
    Integer Variable
    B(i,j,k)
    equations
    C(i,k)..loop(k, A(i,k+1)=e= A(i,k)+sum( B(i,j,k))* C(i,j,k)- D(i,k)));
    ولی متوجه شدم هم اینکه گمز اجازه استفاده از دستور های loop و for رو در قسمت معادلات نمیده و اینکه حتی اگر هم این اجازه رو میداد معادله مذکور به درستی کار نمیکنه و با خطا مواجه میشه
    ممنون میشم راهنمایی بفرمایید که این محدودیت رو چطوری کد کنم و اینکه از حلقه ها در کجا میتونم استفاده کنم
    با تشکر از بذل توجه شما

    • سلام
      متن بالا رو حداقل یه بار بخونین. شیوه معادله نویسی در گمز این شکلی نیست. لوپ نباید بیاد. همینکه بگین c(i,k) خودش به این معنی هست که محدودیت به ازای هر i,k باید صادق باشد و عمل خود لوپ رو هم انجام میده یه جورایی. پس بیخیال لوپ بشین

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

  42. با سلام و وقت بخیر…می‌خوام یک معادله شرطی بنویسم اما با اررور روبه‌رو می‌شم…ممنون می‌شم راهنمایی کنید
    J مجموعه از ۱ تا ۱۳
    A پارامتر دوبعدی تعریف شده
    X متغیر باینری

    در واقع می خوام دو تابع رو با هم جمع کنم به طوری که جملات تکراری اون ها فقط یک بار نوشته بشه‏ مثلا:
    f2=x2+x3+x5+x7+x9
    f7=x2+x7
    می خوام جمعشون به این شکل بشه:
    f=x2+x3+x5+x7+x9

    F $ (A (‘2’,j) ne A (‘7’,j)) .. sum (j,A (‘2’,j)*x (j)+sum (j,A (‘7’,j)*x (j)=g=1

    • مساله رو به این شکل با ifthen هم بازنویسی کردم ام مجددا اررور دارم:

      f2..(sum(j,A(‘2’,j)*x(j))+sum(j,A(‘7’,j)*x(j)))=g=ifthen((A(‘2’,j)*x(j)eq 1) and (A(‘7’,j)*x(j)eq 1),(1+x(j)),1);
      ارور هم اینه: Uncontrolled set entered as constant

    • سلام
      مقداری سوال شما گنگ هست. ولی به عنوان یه جواب اولیه اینو داشته باشین که یه اندیس کافی نیست برای کد نویسیش احتمالا. شما اندیس i هم که آلیاس j هست رو هم باید تعریف کنین.

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

    f2 .. (sum(j,A(‘2’,j)*x(j))+sum(j,A(‘7’,j)*x(j)))=g=1+sum(j,((A(‘2’,j)*A(‘7’,j))*x(j)));
    این طور جملات تکراری رو سمت راست نامعادله هم تولید می کنه در نتیجه جملات تکراری حذف خواهند شد. ولی دوست داشتم با ifthen حلش کنم.

    • به نظرم بهترین کار اینه که:
      A1(i) رو که یه پارامتره به عنوان ضریب x(i در تابع هدف اول تعریف کنین. یه برداره قاعدتاً
      A2(i رو که یه پارامتره به عنوان ضریب x(i در تابع هدف دوم تعریف کنین. یه برداره قاعدتاً
      این دو تا A1,A2 یه بردار هستن که یا صفر و یا یک هستن.
      برای نوشتن تابع هدف سوم کافیه بنویسین:
      f3=Sum(A1*A2*xi

  44. با سلام و تشکر از سایت بسیار کاربردی و مفیدتون‏ من یک سوال دیگه داشتم قصد دارم یک معادله در گمز تعریف کنم که یک sum رو محاسبه کنه به صورتی که اگر یکی از جملات ۱ شد بقیه صفر بشن یعنی از مجموع جملات تنها یکی از اون ها اجازه ۱ شدن داشته باشه ممکنه همه صفر بشن اما اگر یکی از اونا ۱ شد باید بقیه صفر بشن: تمام set ها و پارامترهای برنامه به درستی تعریف و مشخص شدن

    h(i) .. sum(j,y(i,j))

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

      • با سلام…در این سوالی که از خدمتتون پرسیدم متغیر من که y هست باید حتما باینری باشه و نمی‌تونه از نوع sos1 باشه…ممنون می‌شم اگه با فرض باینری بودن متغیر پیشنهادی برای حل سوالم بیان کنید

        • سلام
          طبق چیزی که فرمودین، شما باید یه متغیر بایندری y تعریف کنین و یه محدودیت به مدل اضافه کنین، به این شکل که:

          sum(i,y(i))=1

        • درست میفرمایید‏ اما لزوما نباید مجموع y ها یک بشه….ممکنه مجموعشون صفر بشه…من میخوام اگه یکی از y ها برابر با یک شد اون وقت حتما بقیه صفر بشن…حالا ممکنه اصلا هیچ کدوم از y ها برابر یک نشن و مشکلی نیست

        • سلام
          خب مجموعشون رو بزنین کوچکتر مساوی ۱
          اینجوری چیزی که شما فرمودین رو پوشش میده

  45. با سلام و احترام
    ممنون میشم درمورد سوالم راهنماییم کنید.
    در مساله طراحی خانواده محصول در زنجیره تامین دوتا از متغیرام که بهم مربوطند مقدار نمیگیرن
    Located
    Quantity
    سه تا محدودیت ارتباط این دوتارو بیان میکنه،یک میگه اگه خرده فروش k فعال بشه در این صورت میتونه به مشتری نوع ان محصول بده ، که quantity مقداره
    محدودیت دوم داره میگه حجم محصولی که خرده فروش k به مشتری n عرضه میکنه باید کمتر از میزان تقاضای پیش بینی شده است
    که سمت راست مربوط به تقاضاست
    محدودیت ۷ میگه حجم محصول بیشتر از دلتاست. دلتا حداقل سفارش پیش بینی شده مشتری هست

    limit1(k,n)..quantity(k,n)=l= located(k)*bm;

    limit2(k,n)..quantity(k,n)=l= b(k,n)*demand(k)+gamma(k,n)*(sum((i,j)$bx(i,j),qx(i,j)*o(i,j,n))
    +sum((ii,jj)$by(ii,jj),qy(ii,jj)*v(ii,jj,n)))
    -eta(k,n)*(sum((i,j)$bx(i,j),cx(i,j)*o(i,j,n)) +sum((ii,jj)$by(ii,jj),cy(ii,jj)*v(ii,jj,n))+scost(k,n)+mp(n))+bm*(1-located(k));

    limit7(k,n) ..quantity(k,n)=g= delta(n)*located(k);

    iماژول
    J
    آپشن که زیر مجموعه ماژول هست
    K
    خرده فروش
    N
    نوع مشتری
    ii
    همون تعریف i رو داره ولی ماژول اختیاری است
    jj
    هم اختیاری است با تعریف مشابه j

    نمیدونم ایراد کار از کجاست.چکار کنم که متغیرا مقدار بگیرند

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

  46. با عرض سلام و خسته نباشید خدمت شما عزیزان
    یه محدودیت دارم، که اگه متغیر عدد صحیح(Y) برابر صفر باشد محدودیت دوم(x) می تواند هر مقداری بگیر(متغیر دوم هم عدد صحیح است).
    و اگه متغیر y مخالف صفر باشد متغیر x حتما صفر خواهد بود
    در گمز به غیر از دستور IFThen (که مدل رو غیر خطی میکنه)از چه محدودیت و روش دیگه ای می تونم استفاده کنم؟
    پیشاپیش از راهنمائی تون سپاسگذارم

        • با این اوصافی که فرمودین، فک میکنم این محدودیت رو اگه اضافه کنین کافیه برای لحاظ کردن مفاهیم:
          Y<=MX که M یه عدد بزرگه

        • از راهنمائیتون واقعا سپاسگزارم آقای محمودی عزیز
          محدودیتی که اشاره فرمودین(Y=0 (که این شرط در محدودیت مذکور برقراره )
          و اگه y > 0 بود، x=0 (که این شرط برقرار نیست)

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

        • خیلی بزرگوارید آقای عزیزی
          همیشه از راهنمائیهاتون استفاده کردم …
          تشکر …

        • با سلام مجددا خدمت دوستان گرامی
          جهت استفاده نکردن از دستور Ifthen به منظور بیان محدودیتهای شرطی از جمله محدودیت ،
          (اگر y>0 باشد، x=0 است
          و اگر Y=0 باشد، x>=0 خواهد بود.
          که دو متغیر عدد صحیح مثبت هستند)
          می توانداز ۶ محدودیت ذیل استفاده نمود.(B متغیر کمکی باینری- M عدد بزرگ)
          y>= x*M*B
          B*M>=Y
          Y>=B
          تذکر:
          عبارت x*B در معادله اول مدل را غیر خطی می کند. می توان با افزودن سه محدودیت دیگر به مدل این عامل غیر خطی را به خطی مبدل نمود.
          فرض: x*B=XB و XB متغیر کمکی عدد صحیح مثبت
          (محدودیت اول به y>= XB*M تبدیل می شود) و سه محدودیت دیگر نیز به مدل اضافه می شود.
          XB<=X
          XB=x+M*(B-1)
          به احتمال زیاد درسته!
          (احتمال دادم برای برخی دوستان مفید باشه، لذا پاسخش رو فرستادم)

        • سلام
          مچکرم بابت بازخورد و شیر اطلاعات.
          این غلطه مهندس. تو فرمولا به جای y صفر بذارین. نتیجه ش اینه که x=0 میشه حتما.

        • خلاصه ۶ محدودیت:
          y>= XB*M
          B*M>=Y
          Y>=B
          XB<=x
          XB=x+M*(B-1)

          x,y,XB عدد صحیح مثبت
          B باینری
          M عدد بزرگ

        • خواهش میکنم
          من این طور استنباط کردم
          اگه y صفر باشه در محدودیت اول حتما باید یکی از متغیرهای B,X صفر باشه
          اما این که کدوم حتما باید صفر باشه در دو محدودیت بعد مشخص میشه
          در محدودیت سوم حتما متغیر باینری B برابر صفر خواهد بود
          محدودیت دوم با صفر بودن B برقرار است
          بنابراین در محدودیت اول با صفر بودن Yو B ، برقرار میشه و
          X میتونه هر مقداری رو بگیره.
          امیدوارم درست 😊

  47. با سلام
    مدل من احتمالی هست و از روش سناریو استفاده کردم ولی تو تابع هدف بعد هر sumارور میگیرم. باتوجه به اینکه پارامترp1(p) کهpتعداد سناریوها هست هم تعریف کردم. ارور بخاطر درست جمع نزدن این سناریو هست.ممنون میشم راهتمایی کنید.
    +((sum(p,p1(p)*(sum((d,c1,t),Q1(d,c1,t,p)*A1(c1,t,p
    -(( sum((d1,c2,t),Q2(d1,c2,t,p)*A2(c2,t,p
    +( sum((s,f,t),Q3(s,f,t,p)*MC
    +(sum((f,d,t),Q4(f,d,t,p)*FC)+sum((f1,d,t),Q5(f1,d,t,p)*FC
    …. ))sum

    • سلام
      وقتی دارین سامیشن میزنین، تو کد نویسی خیلی باید حواستون به باز و بسته کردن پرانتزا باشه. مشکل ظاهرا از همین پرانتزاست. چون کامل نذاشتین نمیشه بهتر نظر داد. متن ارور رو میذاشتین بهتر بود.

  48. با سلام، یک جدول دارم که از اکسل ،فراخوانی کردم تو گمز و به شکل یک ماتریس ۱۰ در ۱۰ هست، الان می خوام بگم که اگر درایه ایی از این جدول مثبت باشد، محدودیت اول را بگیر و اگر درایه ایی منفی باشد محدودیت دوم را بگیر. این شروط را چه جور باید نوشت؟ ممنون از راهنماییتون

    • سلام
      فرض کنیم میخوایم بگیم که اگه درایه ی ۱۱ مثبت باشه محدودیت اول باید برقرار باشه، ولی اگه منفی باشه محدودیت دوم:

      c1$(c('1','1' >0).. equation1Formula
      c2$(c('1','1' <0).. equation2Formula

        • نه دیگه.
          برا ماتریس شما باید صورت اندیسی به شرطی که گذاشتم بدین. مثل این:

          c1$(c(i,j)>0).. firstEqu
          c1$(c(i,j)< =0).. secondEqu

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

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

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

    • سلام
      تابع هدف شما شامل چه اجزایی میشه منفی و مثبت توش هست؟ ماکسیمایز میکنین؟ امتحان کردین که براش با .LO حد پایین صفر بذارین؟
      در مورد quantity خوب توضیح ندادین. منظورتون اینه که به جای integer variable با positive variable تعریفش کردین؟

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

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

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

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

    • سلام
      یعنی به ازای هر سناریو، و به ازای هر زمان باید یه جواب برای هدف به دست آورد؟
      اگه آره که باید loop بنویسین و دستور solve رو بذارین تو اون لوپ و هر بار که جواب هدف به دست میاد تو یه پارامتر ذخیره ش کنین.

  52. سلام می خواستم یک فرمول برگشتی تو GAMs بنویسم به شکل زیر :

    (CS(s,n)=e=CS(s,n-1)+30*n1(s,n
    

    که (CS(s,0 رو هم دارم. میشه راهنمایی کنید چطور باید بنویسم؟

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

      CS(s,n)=e=CS(s,n-1)+30*n1(s,n)+CS0(s)$(ord(n)=1)
      
  53. با سلام
    یک متغییر گسسته رو میشه بصورت جدول تعریف کرد؟
    اگر نه میشه راهنمایی کنید چطور متغییر گسسته تعریف کنم
    مثلا
    u متغییر منه که می تو نه اعداد ۱، ۶،۶۶، ۷۷، ۸۶۵ رو داشته باشه
    با تشکر

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

      set i/1*5/
      integer variable u;
      binary variable y;
      parameter a(i)/1 1,2 6,3 66,4 77,5 865/
      equation
      c1
      c2
      ;
      c1.. u=e=sum(i,a(i)*y(i);
      c2.. sum(i,y(i)=e=1;
      
  54. با سلام و خسته نباشد از سایت بسیار خوب شماا
    اگر بخواهم در گمز یک تابع هدف به صورت (min max f(x,y تعریف کنم به چه صورتی بنویسم؟
    ممنون می شم اگر جواب بدید

    • سلام
      مرسی
      بستگی به کار شما داره.
      برای بعضی از مسائل میشه max f رو یه اسم براش گذاشت مثلا q.
      تو مرحله بعد گفت که q از همه f ها بزرگتره.
      بعد تو دستور solve گفت که q رو مینیمم کن.
      اگه متوجه نشدین بگین که بیشتر توضیح بدم.

    • خیلی ممنون از پاسخگوییتون
      راستش یک تابع دارم که هم بر حسب x هست و هم بر حسب y. تابع در مرحله اول بایستی ماکزیمم شود و مقدار بهینه x محاسبه شود. در مرحله دوم همان تابع با توجه به مقدار بدست آمده x ماکزیمم شده تا مقدار بهینه x بدست آید…راستش تابع بسیار پیچیده و بزرگ و مساله بهینه سازی MINLP هست…اگر ممکن است بیشتر توضیح دهید
      بسیار بسیار متشکرم

      • سلام
        یعنی چی؟
        تو مرحله اول تابع بر حسب چی ماکس میشه و تو مرحله دوم بر حسب چی مینیمم میشه؟
        یعنی اول کمینه میشه و مقدار x فیکس و ثابت میشه، و تو مرحله دوم مینیمم میشه و مقدار y نشون داده میشه؟

        • بله…یعنی اول تابع ماکزیمم می شود و مقدار x فیکس می شود…در مرحله دوم تابع با مقدار x بدست آمده مینیمم می شود تا مقدار y فیکس شود.

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

  56. سلام ، خسته نباشید جناب محمودی؛
    محدودیتی دارم
    Si<=X*t
    X متغیر باینری هست
    T پارامتر مربوط به همون متغیر
    چون مساله مینیمم سازی هست همش xهارو صفر میده و کلا si صفر میشه ، میخوام یه کاری کنم یا یه شرطی بزارم که si به ازای مواقعی که x یک میشه مقدار بگیره. چطوری میتونم این محدودیت رو تعریف کنم که مدل رو اینفیزیبل نکنه ؟

    • سلام
      با این شرایطی که فرمودین فک نکنم مشکل حل بشه!
      چون مدل دوس داره x یا s صفر شه. ما اگه بهش بگیم اگه x یک شد s هم باید مقدار بگیره احتمالا باز هم شرایطش عوض نمیشه. چون میتونه باز همون صفر ها رو بهشون تخصیص بده و مشکلی هم پیش نیاد. مشکل از جای دیگه س چک کنین حتما. البته این حدس اولیه من هست.
      برای این شرط جدیدی که فرمودین، قبلش نیاز داریم به اینکه چرا شما محدودیت s<=xt رو تعریف کردین. لطفا اینو بفرمایین چشم عرض میکنم.

      • imt)X )وقتی یک هست که فردm در زمان t روی فعالیت i مشغول به کار باشه . من با اون محدودیت خواستم زمان شروع فعالیت رو تعریف کنم، اولین زمانی که فردی به اون فعالیت تخصیص پیدا کرده .

        • اوکی.
          این به نظرم مفید باشه برا کار شما. اگه مشکل داره ویرایشش کنین.

          sj<=ximt*t+M(1-ximt);
          
  57. سلام مهندس ممنونت میشم بگی کد که این دوتارو چطور میشه نوشت، من هرکاری میکنم گمز ارور میده.
    مورد اول:
    If (ord j>ord i) and bj bi-ui, then Vkij = 0
    b، u و V هر سه متغیر هستند. K وسیله نقلیه و i,j مشتری هایی هستند که باید توسط وسایل نقلیه سرویس دهی شوند.
    درواقع میخوام وقتی که دو تا شرط بطور همزمان برقرار شد Vkijبرابر صفر شود. و فقط و فقط در صورتی که bj مساوی bi-ui بود، مدل ارائه شده،Vkij را محاسبه و اعلام کند.

    مورد دوم:
    من توی تابع هدفم متغیر Vkij رو دارم که ممکنه صفر باشه، از طرفی این متغیر در مخرج کسر قرار گرفته. وقتی مخرج یه کسری هم صفر هستش گمز کلا ران نمیکنه.
    چطور میتونم یه شرطی بگذارم که فقط زمانی تقسیم انجام بشود کهVkij صفر نیست. اصلا میشه جایی از تابع هدف هم شرط گذاشت؟

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

  58. سلام
    ببخشید یک سوال داشتم از خدمتتون .
    من یک برنامه نوشتم برای انتخاب پروژه، تا زمانیکه همه پارامترها (عدد های داده شده) محدودیت ها رو ارضا کنه جواب میده ولی به محض اینکه پارامتر مربوط به یک پروژه رو عوض میکنم که خارج از محدودیته به جای اینکه اون پروژه رو خارج کنه و (محاسبات با سایر پروژه ها انجام بده)، کل مسئله نشدنی میشه (Problem is integer infeasible.) دلیلش چی میتئنه باشه؟

    با تشکر از لطف شما

    • سلام
      کلا نشدنی بودن مسئله یعنی تضاد در محدودیت ها، که اون هم ریشه ش داده ها یا مدلسازی یا کد نویسی هست. اینا رو باید چک کنید.

  59. بسیار متشکر از پاسختون.

    یک سوال دیگه داشتم از خدمتتون که در قسمتی از کد به مشکل خوردم.
    فرض بفرمایید چندتا پروژه داریم که در هر واحد زمانی(t) نیاز به منبع دارند و در هر واحد زمانی(t) هم مقدار محدودی از هر منبع موجود است و فرض بر این است اگر در واحد زمانی قبل (t-1) منبعی اضافه باقی ماند با منبع موجود در واحد زمانی فعلی جمع گردد(به واحد زمانی بعدی منتقل گردد) ، من اون قسمت دوم که از زمان قبلی منتقل میشود متاسفانه نتونستم کد کنم به علت محدود کردن کران بالای سامیشن(t-1)

    (i=project,t=time,r=resource)
    constraint(t,r)  ..  sum(i,m(i,t,r)*x(i,t))=l= mm(r,t)+((mm(r,t-1)+sum(i,m(i,t-1,r)*x(i,t-1))) 
    

    البته میدونم قسمت مربوط به دوره قبل اشتباه نوشته شده ولی به صورت نمادین با (t-1) نوشتم که متوجه شید.

    خیلی ممنون میشم اگر راهنمایی بفرمایید.

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

      • خیلی ممنون.

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

        • بله لطف فرمودید دیدم.

          البته به نظرم ایراداتی داره و مضافا اینکه کمی مدل من با اینکه شما فرمودید متفاوته، اینجا شما اون قسمت مربوط به دوره قبل(t-1)، جدا کردین. ولی به نظر میرسه شما در این چیزی که من نوشتم ایراد پیدا کردین درسته؟ (اینو من از خودم ننوشتم روتینی که در مقالات وجود داره
          ((مقدار منبعی که پروژه ها در واحد زمانی قبل استفاده کردند-مقدار منبع در دسترس دوره قبل)+مقدار منبع در دسترس>مقدار منبعی که پروژه ها در یک واحد زمانی لازم دارند)

          constraint(t,r) .. sum(i,m(i,t,r)*x(i,t))=l= mm(r,t)+((mm(r,t-1)-sum(i,m(i,t-1,r)*x(i,t-1)))
          
        • خواهش میکنم.
          فک کنم این فرمول مشکلی نداره. حداقل نظر من اینه. تنها مشکلی که داره اینه که مقدار منابعی که از دو دوره قبل میمونه رو در نظر نمیگیره و اینکه باید شرط گذاشت که t>=2 باید باشه. پس باید به شکل زیر در بیاد.

          alias (t,tp)
          constraint(t,r) .. sum(i,m(i,t,r)*x(i,t))=l= sum(tp$(ord(tp) < ord(t)),mm(r,tp))-sum((i,tp)$(ord(tp) < ord(t)),m(i,tp,r)*x(i,tp)))
          
        • ببخشید من یک مدت دسترسی به اینترنت نداشتم الان جواب دیدم.بسیار لطف کردید.
          حالا تست میکنم امیدوارم جواب بده. بازم مممنونم.

  60. بله…یعنی اول تابع ماکزیمم می شود و مقدار x فیکس می شود…در مرحله دوم تابع با مقدار x بدست آمده مینیمم می شود تا مقدار y فیکس شود.

    • لطفا به همون گفتگویی که داشتیم ریپلای کنین. اینجوری بحث بالا ناتموم می مونه و کاربرای دیگه نمیتونن استفاده کنن. مرسی
      رویه کلی به این شکل هست:

      solve mymodel using mip minimizing z;
      x.fx(j)=x.l(j);
      solve mymodel using mip maximizing z;
      y.fx(i)=y.l(i);
      display x.l,y.l;
      
  61. سلام..خسته نباشید…ممنون از سایت خوبتون
    من را ستش objective function بر حسب زمان دارم و با تغییرات زمان تغییر می کند…اما گمز ارور می دهد وقتی متغیر OF را بر حسب پارامتر می نویسم…همچین وقتی برای آن loop تعریف می کنم باز هم ارور می دهد…ازتون خواهش می کنم مرا راهنمایی کنید..ممنون

  62. C00(n,s) $ (D(s,j,n) < 5000).. sum(j,Alpha(s,j,n)*S2(j,n))=l=Kmax*CS(s,n);

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

  63. سلام
    یک سطر از مدلی که نوشتم دستورord(m)ord(k) دارد
    براساس این دستور باید مقدار سطر برابر با صفر بشه
    اما این طور نمیشه
    دلیلیش چی میتونه باشه؟

      • G*(sum((i,k,m,j,n,RR)$(ord(m)ord(k)and ord(j)ord(i) and ord(i)8 and ord(j)8 ),
        q(m)*(1-q(k))*A4.l(i,k,m,j,n,RR)* w(i,j)*(c(i,k)+c(k,n)*alpha+c(n,j))))  
        

        این سطر از تابع هدف باید زمانی که m و k مخالف هستند، مقدار بگیره
        بعد از ران برای مسیر از ۷ به ۲ مقدار m=k شد. پس این برای این مسیر نباید سطر بالا مقدار بگیره

        parameter z130;
        
        z130=      (sum((k,m,n,RR)$(ord(k) ne ord(m)),
        q(m)*(1-q(k))*A4.l('2',k,m,'7',n,RR)* w('2','7')*(c('2',k)+
        c(k,n)*alpha+c(n,'7'))))
        display z130;
        

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

        • سلام
          الان عبارت ord(m)ord(k) یعنی چی؟ همونجوری که تو دستور ذوم هم نوشتین، دقیق باید بنویسین ord(k) ne ord(m) و… چیزی که الان تو هدف نوشتین معنی مورد نظر شما رو به گمز نمی رسونه.

  64. با سلام
    جناب اقای مهندس محمودی بنده در نوشتن کد برنامه ام دچار مشکلی شدم که ممنون میشم در صورت امکان راهنماییم بفرمایید.
    هدف بنده نوشتن بیلان مخزن به عنوان یکی از قیود مساله هست، در معادله اول همه پارامترها به استثنا ad(t) که با متغیر اصلی مساله قابل تغییره معلوم هستن و t معرف ماه های سال هست که از ۱ تا ۱۲ تعریف شده برنامه به این صورت هست باید به صورت لوپ عمل بشه و v از ماه قبل به این ماه منتقل بشه که با ران هایی که گرفتم درست عمل میشه مشکل اینجاست که چون معادله اول حجم مخزن در ابتدای ماه رو محاسبه میکنه لذا برای ماه آخر(۱۲) از قیود مساله (min volume, max volume, end of year , last month)پیروی نمی کنه و عملا با تخصیص مقدار بالا به ad حجم مخزن رو در انتهای سال صفر می کنه. بنده برای حل مشکل معادلات دوم و سوم رو بطور مجزا اعمال کردم ولی متاسفانه حل با یک مقدار infeasile انجام میشه(لازم به ذکره که بین معادلات end_of_year و last month تفاوتی نیست و هر کدوم که محقق بشن از نظر بنده درسته
    reservoir_bilan(t)..V(t+1)=e=V(t)+id(t)-sum(c,Dr(c,t))-sum(c,Ind(c,t))-sum(c,Od(c,t))-L(t)-E(t)-O(t)-ad(t);
    *unit:MCM *V(t):volume of the reservoir at the begenning of the month
    end_of_year..sum(t,id(t)-sum(c,Dr(c,t))-sum(c,Ind(c,t))-sum(c,Od(c,t))-L(t)-E(t)-O(t)-ad(t))=g=0;
    last_month..(V(’12’)+id(’12’)-sum(c,Dr(c,’12’))-sum(c,Ind(c,’12’))-sum(c,Od(c,’12’))-L(’12’)-E(’12’)-O(’12’)-ad(’12’))=g=V(‘1’);

    min_volume(t)..V(t)=g=100;
    *minimum volume of the reservoir

    max_volume(t)..V(t)=l=420;
    *maximum volume of the reservoir

    • سلام
      ببخشید من خیلی نتونستم مطالعه کنم و دقت کنم. ولی به عنوان پاسخ اولیه به شما:
      شما برای v(t) مقداری باید حساسیت به خرج بدین. معمولا میان براش یه مقدار اولیه در نظر میگیرن. یعنی وقتی t=1 هست، چه بلایی سر معادله میاد؟
      برای قید آخر سال شما میخواین که مثلا محدودیت minVolume برای اخر سال باشه یا برای فقط t=12?

      • سلام
        بله درست می فرمایید کل برنامه رو خدمت تون ایمیل کردم. مقدار اولیه v(1) در برنامه مشخصه و min ,maxvolume باید هر ماه اعمال بشه برای پایان سال هم قیدی برای حجم مخزن دارم منتها مشکل اینجاست که قید پایان سال رو ظاهرا نمی تونم درست برای برنامه تعریف کنم یعنی ظاهرا معادلات با هم تداخل مفهومی پیدا می کنن چون عملا قید پایان سال v(13) میشه ولی چونt تا ۱۲ تعریف شده ظاهرا به مشکل میخوره(من به جای v(13) دو معادله end of year , last month رو بطور مجزا اعمال کردم ولی مشکل اون مقدار infeasible هست) میخوام بدونم چطور می تونم این قید پایان سال رو تعریف کنم چون اگر این قید تامین بشه عملا قید max , min هم تامین میشن

  65. با سلام
    من میخوام که یک مدل مکانیابی چندهدفه رو با گمز حل کنم
    مدل من دارای محدودیتهایی در حالت احتمالی هستش
    میخواستم بپرسم که برای مثال رابطه ی P(0<x<1) رو که به معنای (احتمال اینکه x بین ۰ و ۱ باشه) هستش رو در بخش معادلات گمز چطور باید بنویسم؟
    پیشاپیش بابت پاسخگویی ازتون ممنونم

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

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

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

      • این کار برای پایان نامه ام هستش
        مدل رو با استفاده از یک مقاله نوشتم
        ولی در مقاله و رفرنس هاش هم که نگاه کردم توضیح نداده بود که به چه صورت کدنویسی گمز رو نوشته بود
        و فقط گفته بود که از نرم افزار گمز برای حل این مدل استفاده کرده بود

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

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

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

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

  69. سلام
    ممنون میشم اگه در خصوص موضوع ذیل راهنماییم کنید:
    چجوری میشه در معادلات، دو معاده رو در Time step های مختلف به هم مرتبط نمود.
    به عنوان مثال من یه معادله تولید از مخزن دارم که تابع فشاره و فشار اولیه هم مشخصه. در این حالت تولید t0 بدست میاد.
    حالا برای تخمین تولید t1 باید از یه معادله فشار p1 رو تخمین بزنم و این p1 بشینه تو معادله تولید q1 که مقدارش بدست بیاد و الی آخر.
    با توجه به اینکه نمیشه حلقه های loop و for رو در خصوص متغییرها اعمال کرد، چجوری میتونم این مدل رو بنویسم.
    با سپاس

    • سلام
      تو اینجور مواقع باید معدله ش رو به عنوان محدودیت بنویسین. مثلا (این یه مثاله ها و اون چیزی نیس که شما دقیقش رو میخواین. ازش ایده بگیرین):

      p(t)=e=q(t-1)+p(t-1)
      
  70. سلام …ممنون از سایت عالیتون که واقعا بهترین مرجع برای یادگیری گمز هست
    فرض کنید یک تابع هدف دارم به صورت: . c= f(x)g(y)
    حال می خواهم کل تابع هدف ماکزیمم شود اما f(x) مینیمم شود.خوشحال می شوم اگر منو راهنمایی کنید
    آیا می شود در قسمت constraintها قیدی لحاظ کرد که f(x) برابر مقدار مینیمم خود باشد؟

      • ممنون از شما…امیدوارم همیشه موفق باشید
        راستش تابع f(x) تابع قیمت بازار هست که بایستی با درنظر گرفتن یک سری قیدها مینیمم قیمت بازار انتخاب شود، پس در حالت کلی f(x) مینیمم می شود. تابع g(y) تابع تولید ژنراتور هست…پس به طور کلی بایستی سود ژنراتور یعنی f(x)*g(y) ماکزیمم شود، اما قیمتی انتخاب شود که مینیمم قیمت انتخاب شده توسط اپراتور بازار باشد…نمیدونم تونستم مفهوم و برسونم یا خیر

        • مچکرم شمام همینطور.
          به طور همزمان این کار ممکن نیست تو یک هدف نشون داده بشه.
          برای اینکار میان مدل رو دو هدفه میکنن. یه هدف ماکس سود و یک هدف مین قیمت. بعد که این کار رو کردین باید با روش های مخصوصی مدل رو حل کنین. این روش ها خیلی زیاد و متنوع هستن. اگه دارین دقیق حلش میکنین، مثلا دارین با گمز حل میکنین، وقتی دو هدفه میشه با روش وزنی، لکسیکو گرافیک و محدودیت اپسیلون eps-constraint میتونین حلش کنین. که لازمه ش اینه که اول این روش ها رو یاد بگیرین، بعد نوبت به کد میرسه. پیشنهادم اینه که مطالب با کلمه ی کلیدی multi-objective optimization methods رو بخونین و روش مناسب رو انتخاب کنین برای کارتون. اگرم با الگوریتم فرا ابتکاری قصد دارین مدل رو حل کنین، میتونین با nsga2, mopso و … این کار رو انجام بدین. پس شد: دو هدفه کردن مدل، مطالعه در مورد روش ها و انتخاب روش بهتر، حل با سالور یا الگوریتم مناسب. انتخاب که کردین رو همین مطلب باز کامنت بزنین که مشورت کنیم با هم. موفق باشید

  71. سلام ، با سپاس از سایت مفیدتون ببخشید من میخاستم محدودیت زیر که به دلیل داشتن “قدر مطلق” غیر خطی هست رو خطی کنم اما بلد نیستم میشه کمک کنید :
    T (i,j,k) + |St(i,k) – St(i,j)| ≥ ۱
    متغییر T یک متغیر باینری یا صفر و یک هستش و متغیر St هم عدد صحیح، نمادهای داخل پارانتز هم اندیسها هستند.
    البته تفاضل داخل قدر مطلق کار رو سخت کرده در واقع مهم خطی کردن خود قدر مطلق هستش یعنی این : | (St(i,k) – St(i,j) |
    با سپاس

  72. سلام..ممنون از سایت خوبتون
    من یک متغیر دارم به عنوان مثال x که اگر y مثبت بود مقدار آن صفر می شود و اگر y منفی باشد هر مقداری می تواند داشته باشد…حالا میخواهم طبق آنچه در کامنتا راهنمایی کرده بودید از دستور ifthen در قیدها استفاده کنم…
    x=e=ifthen(y>0,0,..) اما قسمت سوم دستور را (که با نقطه چین مشخص کردم) نمیدانم چگونه بنویسم…ممنون میشم اگر منو راهنمایی کنید.

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

    sets
    i/1*5/
    m/1*7/
    j/1*10/
    /1.1,1.2,2.3,2.4,3.5/(T(i,m
    (alias(i,h 
    ; (alias(m,n
    table
    ;(c(i,h
    

    مجموع رو چه جوری بنویسم که i وh بسته به mو n از ماتریس انتخاب شوند مثلا اگر m=5 و n=4
    (c(3,2 در y )متغیر باینری (ضرب بشه؟

    ,y(m,n,j)*c(i.h),(sum((m,n.j.h
    
  74. عبارات داخل پرانتز هم متغیر هستن و نه پارامتر
    فکر کنم ۲ راه برای کد کردن داره :
    ۱- خطیش کنم۲- عین همون عبارت رو بنویسم چون چنین دستوری در گمز داریم :
    max(x,y,..) =Largest value among all arguments.
    درسته؟

  75. با سلام و خسته نباشید
    در مدل من دو عدد متغیر هست که متغیر x(i,j,m) باینری است و اگر تقاضای i به تسهیل j در مرحله ی m تخصیص یابد مقدارش برابر یک بوده و در غیر اینصورت برابر صفر است. یک متغیر دیگر هم y(j) است که باینری بوده و در صورت باز بودن تسهیل j برابر با ۱ و در غیر اینصورت برابر با صفر می باشد. محدودیت هایی در مدل به صورت زیر تعریف کردم:

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

    محدودیت ۱ : هر تقاضا در هر مرحله از تخصیص تنها توسط یک تسهیل برآورده می شود
    محدودیت۲: هیچ تقاضایی نمی تواند به همان تسهیل طی دو مرحله و یا بیشتر تخصیص یابد.
    محدودیت۳: تسهیل j باید باز باشد تا تقاضا به ان تخصیص یابد ( این محدودیت برای j های بزرگتر مساوی ۴ هستش)
    محدودیت۴: برای j های بزرگتر از ۴، حداکثر سه تا از تسهیلات میتوانند باز باشند
    محدودیت ۵: حداقل سهم بازاری که j های بزرگتر از ۴ باید کسب کنند.
    محدودیت ها رو که یکی یکی اضافه کردم متوجه شدم که محدودیت ۱ همه x ها رو در همه مراحل تخصیص۱ میکنه و وقتی که حذفش می کنم همه x ها صفر می شوند. محدودیت ۲ هم باعث میشه که هزینه کل صفر بشه. میخواستم ببینم این کدهایی که نوشتم درسته؟ چون محدودیت ها کاری که باید اعمال کنند رو نمی کنند.
    خیلی ممنون از سایت خوبتون

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

  76. سلام
    چجوری میشه مقدار ی متغییر را در گمز بررسی کرد؟؟ ینی بعد از حل یک سری از معادلات و بدست آوردن جوابهای متغییر مثلا y ک به مجموعه مثلا i وابسته هستند، حالا بصورت اتوماتیک مثلا در یک loop تمام جوابهای y بررسی شود و متناسب با پاسخهای y اعمال جدید را انجام دهیم. ب عنوان یک مثال ساده:
    loop(i,
    دستور مورد نیاز برای بررسی پاسخهای y؛
    اگر پاسخ y برابر با یک نبود؛
    یکی به مقدار اسکالر l اضافه شود.

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

    • سلام
      مچکرم موفق باشید.
      مشخص نیست چیکار میخواین بکنین با این کاردینالیتی. هم توضیح بدین، هم اون قسمت کد رو بذارین لطفا.

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

  79. با سلام
    چرا وقتی در مدل معادله ای به شکل
    constraint(i.j.t) .. U(i.j.”period6″) = 0
    می نویسم با تعیین متغیر بعد از دستور model و پیش از دستور solve به شکل
    U.fx(i.j.”period6′)=0
    جواب مساله با هم فرق می کند؟؟؟
    مگر هر دو حالت یک معنی ندارد؟

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

  80. جتاب محمودی
    سلام
    ضمن تشکر و آرزوی توفیق در راهی که در پیش دارید.
    سوالی دارم که ممکن است برای سایر دوستان پیش آمده باشد. چنانچه مقدورباشد و پاسخ بفرمائید سپاسگذار خواهم بود.
    سوال:
    من یک سری داده دارم که تحت عنوان جدول
    SAM
    شناخته می شود. این جدول را با توابعی شناسایی کرده و با کالیبره کردن پارامترها، اقدام به باز تولید این جدول می کنیم که با جدول اولیه با تقریب دلخواه برابر می شود. حال با تغییر در برخی پارامترها می توان برخی اثرات در داده ها را بررسی کرد

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

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

پاسخ دهید

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