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

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

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

 

این مقاله برای شما مفید بود؟

مطالب مشابه

29 دیدگاه

  1. رضا

    با سلام …
    ببخشید من دو سوال راجع به اندیس ها و تعریف summation دارم که به هم وابسته هستند:
    سوال ۱:
    اگر اندیس m به این شکل تعریف بشه ( m /1*2/ ) اندیس n با شروط زیر چه طوری تعریف میشه:
    اگر m=1 باشه n میشود n /1*6/
    اگر m=2 باشه n میشود n /1*7/
    سوال ۲:
    فرض کنید علاوه بر دو اندیس n و m که در بالا توضیخ داده شد سه اندیس دیگر با نام های زیر داریم:
    j / 1*3/ ، l / 1*5/ و t /1*4/
    همچنین x(m,j,l,t,n) یک متغیر تصمیم است . در این صورت sum(n, x(m,j,l,t-n,n) ) رو چه طوری تعریف کنم.
    دقت کنید که متغیر summation همون اندیس n هست که به طورت شرطی تعریف شده و یکی از اندیس های متغیر x ازt به t-n تغییر پیدا کرده.
    ممنون .

    1. محمودی

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

      sum(m$(ord(n)<=ord(m)+5),somehing)
      

      فقط دقت کنین که n اینجا باید اندیسی تعریف بشه که از ۱ تا ۷ المنت بگیره.
      سوال دوم:
      با این حساب فرمولی که براتون تصور میشه به شکل زیر می تونه باشه (دقت کنین که ممکنه من مرتکب اشتباه شده باشم، بازم چک کنین):

      eq1(m,j,l,tp)..   sum(n$(ord(n)<=ord(m)+5 and ord(tp) = ord(t)-ord(n)), x(m,j,l,tp,n))
      

      در اینجا مقداری روی t-n دقت کنین. و اگه شرطی دارین که t نباید صفر بشه یا منفی یا هر مورد دیگه ای مد نظر قرار بدین.
      tp هم به نظر میاد باید با T آلیاس بشه.

  2. س

    با سلام و خسته نباشید
    ممنون می شوم چنانچه به این سوال پاسخ دهید. در مدل ریاضی زیر
    obj ..zz=e=sum(s,v(s)*prod(a,power(1-prod(d,1-power(1-k(d,s,a),x(d,s,a)/n(s,a))*g(s,a)),n(s,a))));
    co1(d) ..sum((s,a),x(d,s,a))=l=b(d);
    co2(s) ..sum((d,a),t(d)*x(d,s,a))=l=gb(s);
    co3 . ..sum((d,s,a),c(d)*x(d,s,a))=l=cmax;
    co4(d) ..sum((s,a),m(d)*x(d,s,a))=l=mmax(d);
    model MZ2018 /all/;
    option minlp=dicopt;
    solve MZ2018 using rminlp min zz;

    هنگام اجرای مدل در خط آخر پیغام خطای
    function called with non constant argument

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

    از راهنمایی تان و وقتی که می گذارید سپاسگزارم

  3. س

    استفاده از power و prod مشکلی ندارد. مشکل به خاطر در توان بودن متغیر است. تابع را به
    obj ..zz=e=sum((s,d,a),power(2,x(d,s,a)));
    تغییر دادم باز هم همان خطا دریافت می شود. با لگاریتم گرفتن از بخش داخلی تابع، تابع زیر به دست می آید
    obj ..zz=e=sum(s,v(s)*prod(a,power(1-sum(d,x(d,s,a)/n(s,a)*log(1-k(d,s,a)))*g(s,a),n(s,a))));
    در این صورت مقداری برای تابع هدف اعلام می شود بدون آنکه برای متغیرها مقداری اعلام شود. دلیل چیه؟ آیا غیر از لگاریتم گرفتن راه حل بهتری برای مواقعی که متغیر در توان وجود داره سراغ دارید؟

    1. محمودی

      سلام
      توان توی گمز توابع زیادی داره. اون توابع رو چک کنین. جستجو کنید gams power functions

  4. فرزاد

    باسلام و خسته نباشید
    اقا بخشی از کدی که نوشتم رو ارور ۱۴۹ میگیره و نمیدونم چیکارش کنم ، لظفا راهنمایی کنید

    ۲۳۴ cost.. z=e=sum(h,Pgrid(h)*Pricegrid(h)+(a1*sqr(P1(h))+b1*P1(h)+c1)+(a2*sqr
    (P2(h))+b2*P2(h)+c2)+(a3*sqr(P3(h))+b3*P3(h)+c3)+(a4*sqr(P4(h))+b4*P4(h)+c
    4)+
    235 0.001*(Pgrid(h)*(CO2grid-CAPCO2)*0.04+P1(h)*(CO2DG1-CAPCO
    2)*0.04+P2(h)*(CO2DG2-CAPCO2)*0.04+P3(h)*(CO2DG3-CAPCO2)*0.04))+
    236 (Qgrid(h)*COSTQgrid)+(Q1(h)*COSTQ1)+(Q2(h)*COSTQ2)+(Q3(h)
    **** $149 $149 $149 $
    *COSTQ3)+(Q4(h)*COSTQ4);
    149 $149

    1. محمودی

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

  5. فرزاد

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

    1. محمودی

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

  6. فرزاد

    با سلام و خسته نباشید
    مهندس من میخوام ی متغیر رو براش کران تعریف کنم با up و lo ، حالا مسئله اینجاس ک یکی از کران هام نیاز به مقایسه داره و انتخاب از بین دو مقدار ، مثلا بیاد دوتا فرمول رو مقایسه کنه بعد مقدار کمتره رو بذاره بجای کران بالا ، کران پایین هم ثابته .
    اینو چجوری بفهمونم بهش مهندس

    1. محمودی

      سلام
      فرض کنیم متغیری که داریم در موردش صحبت می کنیم x باشه. اگه اون فرمولی که می فرمایید، شامل هیچ متغیری نمیشه، کافیه از دستوراتی نظیر smax یا smin استفاده کنین.
      اگه این فرمول شامل حداقل یک متغیر هم میشه، باید دو تا محدودیت ایجاد کنیم به شرح زیر:

      eq1.. x=l=TheFirstPart;
      eq2.. x=l=TheSecondPart;
      
  7. مهناز

    سلام خسته نباشید
    برای خطی کردن محدودیت زیر پیشنهادی دارید؟
    co(j,n,t)..sum((i,m),ship(i,j,m,n,t))=g= ipd (j,n)*sum(i,x(i)) که ipd متغیر عدد صحیح و (i)x باینری هست

    1. محمودی

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

  8. مهدی

    سلام
    چگونه می توان محدودیت زیر را مدل کرد؟
    sum(i,sum(t,x(i,t))) به ازای i={1..5} و t1,t2={1..3} به شرطی که t1<t2
    سپاس

    1. محمودی

      سلام
      قسمت t1,t2 رو واضح تر بنویسین لطفا. در خدمتتون هستم.

  9. مهدی

    سلام
    مدل را واضح تر بیان می کنم:
    چگونه می توان محدودیت زیر را مدل کرد؟
    sum(i,sum(t,x(i,t))) به ازای i={1..5} و t به ازای هر زوج t1 و t2 که t از t1 تا t2 است و t1<t2 و t1 و t2 عضو مجموعه T={1..3}
    با سپاس

    1. محمودی

      مچکرم.

      alias (t,t1,t2);
      eq1(t1,t2)$(ord(t2)<=3 and ord(t1)<ord(t2)).. sum(i$(ord(i)<=5),sum(t$(ord(t)<= ord(t1) and ord((t)<=ord(t2)),x(i,t))
      

      شما میتونین برا اینکه مقداری کد مرتب تر بشه به جای دو تا sum فقط یه sumبنویسین. و شرط ها رو یه نه دونه کنین و بینشون and بذارین.

      sum((i,t)$.....,
      
  10. مهدی

    سپاس از پاسخ شما
    طبق گفته شما عمل کردم ولی خطای زیر ظاهر می شود:

    ۱۴۸  Dimension different - The symbol is referenced with more/less
            indices as declared
    
    1. محمودی

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

  11. هادی

    با سلام
    سوالی داشتم
    برای نوشتن معادلات دو طرفه چه کار باید کرد
    در واقع منظورم معادلات به این فرمی است
    x-1<y+2<z
    به ازای مقادیر مختلف x، y و z
    باتشکر

  12. M.k

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

  13. سعیدی

    سلام،من دو محدودیت در مدلم دارم اولی برای دوره ی اول و دومی برای دوره های زمانی بعدی

    Co1(i, j,t)$(ord(t)=e=1)
    co2(i,j,t)$(ord(t)&gt;1)
    
  14. سعیدی

    تو کامنت قبلی براتون نوشتم که ارور میده…ممنون میشم راهنمایی کنین

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