۱۰۵

مجموعه های چند بعدی – نحوه تعریف و کاربرد آنها

بارها و بارها تأکید کرده ایم که شما می توانید با تعریف مجموعه های چند بعدی هم سرعت حل مدل، هم نظم کد نویسی و هم دقت آن را بالا ببرید. به یاد داشته باشید، در مدل هایی که نیاز به تعریف set دارند، مهم ترین بخش همین تعریف set خواهد بود.
در تعریف مجموعه ها(set یا اندیس) شما به چند مهارت نیاز دارد.
این مهارت ها شامل تعریف مجموعه، اجتماع و اشتراک مجموعه ها، مجموعه های چند بعدی، مجموعه ی تهی، مجموعه های بدون بعد و… هستند.
در این تاپیک به تعریف مجموعه های چند بعدی پرداخته و جهت کاربرد آنها چند مثال را بیان می کنیم.
فرض کنید شما دو مجموعه ی زیر را دارید:

set i/a,b/
j/c,d,e/

حال قصد دارید یک متغیر تعریف کنید به نام x(i,j) که تنها زمانی بتواند عدد بگیرد که i برابر a و j برابر e باشد. به یاد داشته باشید، که تعریف این متغیر در دستور variable با شرط گفته شده غیر ممکن است! از طرفی یک متغیر تنها و تنها زمانی در کد شما دارای معنی است که در حداقل یک Equation مورد استفاده قرار گرفته باشد. پس باید متغیر را یکبار تعریف کرده و هر جا که مورد استفاده قرار می گیرد با یک شرط به گمز بفهمانید که تنها وقتی i برابر a و j برابر e باشد این محدودیت اجرا شود.
عملی که در اینجا مورد نیاز است تعریف یک مجموعه چند بعدی است. به مثال زیر توجه کنید:

set i/a,b/
j/c,d,e/
E(i,j)/a.e/

اگر کد بالا را ران کنید و مجموعه E را display کنید نتیجه به شکل زیر خواهد بود:

---- ۴ SET E 
-- e

a YES

به عبارتی وقتی I برابر a و j برابر e باشد مجموعه ی E عبارت yes را به خود می گیرد و این بدین معنی است که در سایر مواقع این مجموعه عبارت No را به خود میگیرد. این مجموعه را مجموعه ی چند بعدی می گویند.
حال برگردیم به تعریف متغیر. مثال زیر را مشاهده کنید:

set i /a, b/
j /c, d, e/
E(i,j) /a.e/;
variable x(i,j);
.
.
.
Eq6$(E(i,j)).. y(i,j)-sqrt(something)=e=x(i,j)+...;

کد بالا نشان دهنده ی این است که محدودیت ۶ فقط زمانی صادق است که حاصل E برابر با yes باشد. این امر دقیقا معادل این است که متغیر x را با شروط گفته شده تعریف کرده باشیم. دقت کنید که هر جا x داشتید باید شرط را هم به کار ببرید.
شما در گمز می توانید مجموعه هایی را تعریف کنید که بیش از ۲۰ بعد داشته باشند! مثالها دیگری که در گمز می توانند تعریف شوند در کد زیر مشاهده می شوند:

<code>set i /a, b/
j /c, d, e/
ij1(i,j) /a.#j/
ij2(i,j) /a.c, a.d, a.e/
ij3(i,j) /#i.#j/
ij4(i,j) /a.c, a.d, a.e, b.c, b.d, b.e/
ij5(i,j) /#i:#j/
ij6(i,j) /a.c, b.d/
ij7(i,j) /#i:(d*e)/
ij8(i,j) /#i:(d,e)/
ij9(i,j) /a.(c,d)/;
display i,j,ij1,ij2,ij3,ij4,ij5,ij6,ij7,ij8,ij9

به نحوه ی به کار بردن علامت های پرانتز، شارپ و “.” و “:” دقت کنید. احتمالا سریع مفهوم پرانتز و “.” را دریافت می کنید. عبارت شارپ به معنی تمامی مجموعه و علامت “:” نیز به معنی نظیر به نظیر بودن مولفه های به کار برده شده طبق دستور ord می باشد.
دستور بالا را ران کنید و مقداری در آن تأمل کنید. احتمالا مطالب مفید و کاربردی فراوانی را درخواهید یافت.

جهت آشنایی بیشتر با تعریف مجموعه ها و دستور Set به نوار دسته بندی، تعریف مجموعه ها مراجعه فرمایید.

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

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

 

105 دیدگاه در “مجموعه های چند بعدی – نحوه تعریف و کاربرد آنها

  1. با سلام و خسته نباشید.
    یه سوال دررابطه با همین تعریف مجموعه ها داشتم. من یک مجموعه دارم مثلا ۵ عضوی:/
    s ‘station’ /s1,s2,s3,s4,s5، حالا میخوام چن تا subset با توالی های مختلف تعریف کنم مثل: /s2,s3,s4 / و /s1,s4,s5,s2 /. منتها اولی مشکلی نیست ولی واسه دومی ایراد میگیره چون ترتیب رعایت نشده! الان من نمیدونم چه جوری این مشکل و حل کنم. گره مجازی تعریف کردوم ولی تو شرط هایی که میخوام واسه محدودیت ها بزارم ایراد میگیره.
    ممنون میشم اگه راهنماییم کنین. و ممنون به خاطر سایت خوبتون.

    • سلام
      ممونم.
      تعریف مجموعه شما خیلی اشکال نداره. شما شرط هایی رو که دارین میذارین به جای دستور ord از دستور uel استفاده کنین. ساده ست. یه مقدار این دستور رو تست کنین یاد میگیرین. ولی اگه با ord بگیرین، چون ترتیب رو رعایت نکردین احتمالا ارور میده. و اینکه مجموعه بزرگتر یا s رو اول تعریف کنید، بعد s1,s2 رو به عنوان زیر مجموعه ش تعریف کنین

      • سلام و مرسی بابت پاسختون.
        خیلی از این دستور uel ک فرمودین سردر نیاوردم!:( به صورت همون گره های مجازی تعریفش کردم دیگه ارور شرطش برطرف شد. مثلا مجموعه کل رو به صورت
        /s1,s2,s3,s4,s5,s55,s44,s33,s22,s11/ تعریف کردم که چهارتای آخر گره مجازین و سابست دومیه تو پست قبلیم به صورت /s1,s4,s5,22/ تعریف کردم. منتها باید به گمز بفهمونم که مثلا s2 همون s22 هستش یا s5 همون s55 هستش، ولی نیدونم چ جوری بهش بفهمونم!
        مرسی.

        • خب اینم براش شرط بذارین که برابر در نظر بگیره. مثلا ord هاشون طبق یه رابطه ای به هم ربط داده بشن. مثلا ords2 مساوی ords22 منهای ۸

        • اونوقت چ جوری باید بنویسمش؟ چون من هرجور مینویسم ارور میده:

          مثلا: cons(s)$(ord(s2) eq (ord(s22)-7))

        • ارور ۳۱۱ ! یه جورایی میگه ord و اینجوری نمینویسن!
          اروررش اینه:
          the function ord(‘string’,expr) needs the second argument…

        • الان که دقت کردم شما Ord رو اشتباه زدین که، ord(s2) درست نیست. باید یه اندیس آزاد مث s بهش بدین. چون s2 خودش یه element تو مجموعه s هست این ارور رو میده.
          شما چرا همون s2 رو به جای s تو متغیرتون نمیزنین؟ اینجوری مثلا x(“s2”)

        • یه چیزی:
          این اروری ک گفتم واسه وقتیه ک s2 و s22 رو تو کوتیشن قرار میدم. وقتی که همینجوری مثه بالا مینویسم ارور ۲ رو میده:
          indentifier expected

        • جناب مهندس مرسی با توضیحات شما اوکی شد این قسمت:)
          یه سوال دیگه بی زحمت. واسه جزء صحیح یه متغیر و گرفتن از floor استفاده میکنیم درسته؟
          آخه من استفاده کردم ارور سینتکسی نمیده منتها میگه:
          cannot handle function ‘floor’
          مرسی و ببخشید سوال زیاد می پرسم.

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

          parameter a;
          a=floor(1.1);
          display a

    • پارامتر نیستا متغیره! ک این متغیر از حاصلضرب یه متفیر ضربدر پارامتر بدست میاد:
      n=t*a که n , t متغیرن و a پارامتر. حالا من میخوام جزء صحیح n و بگیرم. نوع نوشتنی ک فرمودین واسه پارامتر نوشتم اوکیه ولی واسه متغیر نه!


  2. sets
    i Set of product/a,b/
    j Set of month /dey, bahman, esfand/
    Parameters
    C(i) production Cost per month

    CC(i) overtime production Cost per month

    H(i) Holding Cost of product i per month

    MPN(j) capicity of normal production at month j

    MPO(j) capicity of overtime production at month j

    D(i,j) Demand of product i at month j

    با سلام
    نمیدونم این ارور برای چیه؟

  3. ۳۵ dey bahman esfand
    **** $170 $1$148 $334
    36 a 60 110 70
    37 b 50 120 130/
    38 ;
    هنگامی که برای پارامتر D(i,j) مقدار دهی اولیه میکنم این ارور ها رو میده.
    ؟

      • بله دقیقا همینو میزنه. امکانش هست من پروژم رو براتون ایمیل کنم ؟ شاید مشکلش تو نوشتن برنامه هاست و مشکل اساسی داره..
        ممنون میشم راهنماییم کنید… از لحاظ هزینه هم مشکلی نیست… تقدیم میکنم

  4. سلام وقتتون بخیر
    یه سوال داشتم ازتون: تابع floor رو میشه واسه متغیر هم به کاربرد؟؟؟ مثلا: n=t*a که n , t متغیر و a پارامتره. من اینجوری می نویسمش:
    n=floor(t*a)
    بعد مدل و ران میکنم سریع رانش انجام میشه و یه best solution هم میده منتها یه جا می نویسه:problem solving fixed problem. dual variables for nlp subproblem not
    available.
    این ینی این ک ب جوابش هیچ اعتباری نیست؟؟؟ ممکنه ایرادش از floor باشه؟
    با minlp هم رانش میکنم.
    مرسی.

  5. سلام
    ممنون میشم به سوالم جواب دهید.
    فرض کنیم d(i) و n(j) به عنوان متغییر و x(i) پارامتر باشد و دربخش معادلات بخواهیم به صورت زیر تعریف کنیم:
    d(i)=min(abs(x(i)-n(‘۱’)) , abs(x(i)-n(‘۲’)) , abs(x(i)-n(‘۳’)))
    یعنی هر کدام از این سه تا { abs(x(i)-n(‘۱’)) و abs(x(i)-n(‘۲’)) و abs(x(i)-n(‘۳’)) } کوچکتر بود، در d(i) قرار بگیره از چه روشی میتوانم استفاده کنم.
    باز هم ممنون

  6. سلام
    لطفا نحوه تولید اعداد تصادفی یکنواخت برای پارامتری مثل( p(j,i,t را به طوری که j , i, t هرکدام در بازه خاصی باشند را توضیح دهید.
    ممنون

  7. سلام و خسته نباشید
    من یک سوال داشتم در مورد اینکه چطور یک عبارت غیر خطی رو به عبارت خطی تبدیل میشه کرد.به طور مثال تو کد پایین از smax استفاده کردم که مدلم رو غیر خطی کرده . آیا روشی برای خطی کردن این عبارت وجود داره؟

    = sum(t$(ord(t)<=card(t)),(ord(t)*s(j,l,t)))=g
    ((( smax(i$prec1(i,j),(sum(t,ord(t)*s(i,l,t))+p(i,l

    ممنون میشم اگر راهنماییم کنین

    • سلام
      راهش اینه قبل از نوشتن تابع هدف و محدودیت ها با استفاده از لوپ ها مثلا با for مقدار smax رو پیدا کنین و برابر یک متغیری قرار بردین و برای محدودیت ای که گفتین برای smax نوشتن متغیر رو بنویسین

      • سلام
        ممنون از پاسختون. ولی چطور میتونم قبل از نوشتن تابع هدف مقدار smax اون عبارت رو پیدا کنم؟ توی عبارت( s(j,l,t متغیر هست!

        • سلام
          شما میتونین یه عبارت معادل smax رو بنویسین. مث مثال زیر:

          c1(i).. x(i)=e=smax(j,y(i,j);
          * this constraint make your model non-linear
          * try this dear fallah
          x(i)=g=y(i,j);

          این محدودیت یعنی x از همه y ها بزرگتره (تو حالت بهینه برابر بزرگترینشون میشه)

  8. سلام وقت بخیر
    من یه مدل زمان بندی پروژه دارم که توی کد کردن محدودیت پیش نیاری مشکل دارم یعنی وقتی مدلم را ران میکنم همه محدودیت های پیش نیازی رو رعایت نمیکنه.من ابتدا توی مجموعه prec1 فعالیت هایی که پیش نیاز هم هستند رو مشخص کردم و بعد با کد پایین زمان شروع فعالیت ها رو بدست اوردم که در جواب زمان شروع فعالیت ها بر اساس رعایت رابطه پیش نیازی بدست نمیاد.
    /activity /a0*a5
    ; ( alias(activity,i,j

    / prec1(i,j) precedence relations of project /a0.a1,a0.a2,a1.a3,a2.a4,a3.a5,a4.a5
    ..sum(t$(ord(t)<=card(t)),(ord(t)*s(j,l,t)))=g=smax(i$prec1(i,j),(((sum(t,ord(t)*s(i,l,t))+p(i,l
    ممنون میشم اگه منو راهنمایی کنین.

  9. سلام
    خسته نباشید
    سوالی داشتم در خصوص اینکه چطور میتونم یک محدودیت به شکل زیر رو به تابع هدف اضافه کنم؟
    (co2(i,j) .. y(i,j)=l=x(j
    ممنون میشم راهنمایی کنید.

  10. salam man y masale daram k tabe hadafam minz=x1^2+2×1+x3 hast va mahdoodiatam x1+x2<=2 maznooram ine mahdoodiatam khatiye va mahdoodiye sos noe 2 ham daram man nemidoonam vaqti mikham c yani zarybae tabe hadafao tarif konam vase x1 b tavan 2 zaribe 1 va ase x1 zaribe 2 daram nemidoanm chetor bayd in ghesmat moshakhas she tavan 2 motaghyri k y ja faqat to tabe hadaf hast va dar mahdoodiata va baghiye ghesmata tabe hadafam ba tavan 1 hast to kodom ghesmat bayd benivisam?
    va ink man sos2 variable tarif mikonam aya bayd z ra ham variable tarif konam ya dg niazi nist? va mahdodiate x ha bozorgtr mosavi sefr ham lazem ast ya na?

  11. سلام
    فرض کنید یک مجموعه کلی داریم شامل مجموعه های a برابر {a1,a2,a3 } و b برابر {b1,b2,b3,b4 } و cبرابر {c1,c2,c3,c4 } و d برابر {d1,d2,d3,d4 } که همگی در یک مجموعه به نام j قرار دارند. j برابر:
    {{a1,a2,a3 } و {b1,b2,b3,b4 } و {c1,c2,c3,c4 } و {d1,d2,d3,d4} }

    اگر در مدل محدودیت هایی وجود داشته باشه که j به ازای اجتماع a و b باشد و محدودیت دیگر j به ازای اجتماع cو d و همین طور محدودیت های دیگر j به ازای مجموعه های a و b و c و همین طور دیگر محدودیت ها …

    مثلا محدودیتی که به ازای اجتماع a و b باشد را می توان یک بار محدودیت را به ازای a و یکبار به ازای b در گمز نوشت.و راه بعد اینکه اندیس جدیدی اضافه کنیم که شامل اجتماع a و b باشد محدودیت را به ازای اندیس جدید حل کنیم.ولی چون تعداد حالات زیاد هست خیلی تعریف اندیس جدید منطقی نیست.ولی راهی هست که در هر محدودیت شرط اجتماع در خودش نوشت؟مثلا محدودیت به ازای اجتماع a و b .
    نمونه محدودیت به صورت زیر:
    Uj≤۱-Yj
    که j اندیس است و به صورت j∈a∪b است.

      • خیلی خیلی ممنون.
        بعد در ادامش یک سوال دیگه دارم.
        فرض کنید می خواهیم دو متغیر تعریف کنیم که هر دو باینری هستن.مثلا Yj به ازای مجموعه های a و b و Xj به ازای مجموعه های c و d.
        تعریف این متغیر ها چه جوری میشه؟

        • سلام
          شما باید اجتماع دو مجموعه a و b رو بگیرین، مثلا اسمش رو میذارین ab بعد y رو به صورت y(ab) تعریف میکنین و همونجوری هم بکارش ببرین، برای x هم کار مشابهی انجام بدین.
          فقط توجه کنین که اگه y باز هم ممکنه به ازای اندیسای دیگه هم برقرار باشه، باید اجتماع همه رو به جای ab بنویسین و تو محدودیت ها ریزترش کنین
          سربلند باشین

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

    • سلام با استفاده از table ! اول i و j را توسط set تعریف کنید و تعداد نقاط را در آن بگویید.
      برای مثال :
      set i/1*2/
      j/1*2/
      parameters
      .....
      table esm (i,j)
      2 1
      1 1 1
      ;0 1 1
      VA ...

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

  13. با سلام
    من یک مسئله طراحی شبکه دارم که یک مجومه راه داریم که می خواهم از بین این مجموعه راه چند زیر مجموعه بگیریم که مثلا این سه تا راه هزینه اش مثلا ۵ باشه و این ۸ تا راه هزینه اش مثلا ۱۰ باشه و الی آخر.
    برای این کار اومدم یک مجموعه I تعریف کردم که شامل مجموعه شهرهای من است و یک مجموعه j تعریف کردم که با I یکی است (alias(I,j)) . بعد اومدم مجموعه G(I,j) تعریف کردم که شامل تمام راه های ارتباطی ممکن بین شهر ها است (در حقیقت G زیر مجموعه I و j است). حالا می خواهم یک مجموعه دیگر تعریف کنم که زیر مجموعه G باشد در حقیقت می خواهم از بین راههای ارتباطی چند راه معین را مشخص کنم ولی نرم افزار این اجازه را به من نمی دهد که برای G یک زیر مجموعه تعریف کنم. لطفا راهنمایی کنید
    با تشکر

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

      • کد من به صورت زیر است /sets I ‘set of nides in the network’ /a,b,c,d,e,f,g,h
        ;alias(I,j)
        sets
        ; G(I,j)
        ;G(i,j)= yes$(not sameas(i,j))
        حالا می خواهم یک مجموعه دیگر تعریف کنم که زیر مجوعه G باشد چه کار کنم؟

      • کد من به صورت زیر است
        sets
        i set of nodes in the network /a,b,c,d,e,f,g,h,I,j/
        alias(i,j);
        sets
        G(i,j) set of links in the network ;
        G(i,j)= yes$(not sameas(i,j));
        حالا می خواهم یک مجموعه دیگر تعریف کنم که زیر مجوعه G باشد چه کار کنم؟

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

        • خب نیازی نیست زیر مجموعه انتخاب کنید. تنها مجموعه ای رو که میخواین رو تایپ کنین. همین. مقلا:

          set g1(i,j)/1.4,2.7/
          g2(i,j)/2.6,3.9/
          ...

  14. با عرض سلام و خسته نباشید ببخشید بنده می خواستم توی یک محدودیت سه تا اندیس به کار ببرم . با کدام دستور باید این کاررو بکنم.لطفا کدشو برام بنویسین در واقع محدودیت من به شکل زیر می باشد و اندیس هام i و j و k می باشد:
    v(i,j)-q(i,k)=e=e(i,j)

  15. سلام ، خسته نباشید
    من داخل مدلم یک مجموعه p{1,…..n} و یک مجموعه D{n+1,…..2n} و که هر درخواست بصورت یک زوج مرتب ( i, i+n) نشان داده می شود که i گره برداشت محصول و گره i+n گره تحویل محصول متناظر با ان است .که این محصولات اول به انبار می روند بعد به مشتری تحویل داده می شود که با مجموعه O{o1,o2,o3,o4} نشان داده می شود که o1 و o2 گره شروع و پایان مسیر برداشت و o3 وo4 گره شروع و پایان مسیر تحویل است . کل گره موجود در شبکه شامل N=P+D+O هستش و کل کمانهای موجود شامل
    {(i,j): i,j,< P +{o1,o2} ,ij } و {i,j<D +{o3,o4},ij :(i,j) } هستش .
    + یعنی اجتماع ، > یعنی عضو و مخالف
    چجوری میتونم اینارو اندیس گذاری کنم
    باتشکر

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

  16. سلام.
    من یه ماتریس به صورت
    (A(i,j دارم که می خوام دقیقا درایه های سطر اولش رو در یک پارامتر یک بعدی ذخیره کنم. با چه دستوری این کار رو انجام بدم؟

  17. با سلام و تشکر از سایت خیلی خوبتان-یک سوال دارم من مدل مسیریابی کمان را در گمز نوشتم وگرافم ۲۴ گره دارد حال برای نوشتن کمان ها و یال هایم باید زوج مرتب این ۲۴ گره را بنویسم که خیلی زیاد می شود چگونه باید این را در بخش مجموعه ها وارد کنم؟

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

  18. با سلام و خسته نباشید
    من یک مسأله مسیریابی دوره ای دارم که در آن هر مشتری در طول هفته روزهای مختلفی ویزیت می شود. مثلا مشتری i روزهای شنبه و دوشنبه و مشتری j روزهای یکشنبه و سه شنبه. این پارامتر را باید به چه صورت به گمز بدهم؟ اگر در قالب table باشد باید به چه نحو تعریف شود؟

    • سلام
      اگه از table میخواین استفاده کنین که سطر ها رو مشتری، ستون ها رو روزای هفته بذارین (فرضا اسم جدول cm باشه. بعد هر جا که مشتری تو اون روز ویزیت میشه رو یک بزارین، بقیه ش هم خالی یا صفر.
      بعد اون شرطی که تو محدودیت ها در این مورد صحبت میکنه اینجوری بذارین:
      equation1(i,j)$(cm(i,j)..

  19. سلام من مجموعه های چندبعدی را مطالعه کردم ولی نتونستم مدل خود را کد کنم .ممکنه لطف کنید کد مدل زیر را بگید.تعرف مجموعه ها و نوشتن محدودیت مد نظرم هست. متشکرم
    i,j:شاخص گره ها {۰و۱و۲و…وn}
    N:مجموعه همه گره ها شامل فروشنده
    NP: مجموعه همه گره ها به جز فروشنده (گره صفر)
    A: مجموعه کمان های ساخته شده توسط گره ها{(i,j) عضوN و iمخالف j}
    i,j)∈A ∑ X ijh ≪ek-bk , ∀h)
    سیگما روی (i,j) بسته شده و علامت سیگما یکی است و h سور عمومی دارد.xijh: زمان پیمودن کمان ij با وسیله نقلیه h میباشد

    • سلام
      بهتره A رو به صورت table تعریف کنین. و ارایه هایی که کمان هست رو یک و بقیه رو صفر بذارین.

      set i/n1*n10,np1*np10/
      N(i)/n1*n10/
      np(i)/np1*np10/
      ;
      alias(i,j)
      ....
      eq(h).. sum((i,j)$A(i,j)

      مشکلی داشت خودتون ویرایشش کنین. این همه چیزیه که نیاز دارین.

  20. سلام و تشکر می کنم از راهنمایی های همیشگی تون.
    ممکنه سوال من رو بررسی کنید؟
    مجموعه هایی به این شرح دارم:
    m /1,2,3,4,5,6,7,8,9,10/
    k(m) /1,2,3,4,5/
    j(m) /6,7,8/
    w(m) /9,10/
    ولی حالا می خوام متغیری بسازم که ۱- فقط از دو اندیس w و k در ساختنش استفاده بشه (و j استفاده نشه) و ۲- اندیس های k و w استفاده شده هم تکراری نباشند (مشابه نباشند ). به نظرتون چه باید بکنم؟
    ممنون

    • سلام
      یه راه اولیه میتونه این باشه که یه اندیس به اسم kw(m) هم تعریف کنین.
      kw(m)/1*5,9*10/
      بعد k و w رو زیر مجموعه ی kw تعریف کنین و نه m

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

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

  21. باز هم سلام و عرض احترام.
    من در ندل ریاضیم نیاز دارم که در دوره های مختلف مقدار یک متغیر چک بشه و بیشترین مقدارش گزارش بشه. برای این کار از SMAX استفاده کردم. نکته جالب اینه که با اضافه کردن این محدودیت که مقدار SMAX در اون حساب میشه، مقدار تابع هدفم با قبل خیلی فرق داره. یعنی از ۴۰۰ به ۱۶۰۰ میرسه. مدلم غیرخطی هست و با سالور Bonmin حل میکنم.
    بسیار ممنون از شما

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

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

  22. سلام، فرض کنید ما یک مجموعه ی دو بعدی مانند jn داریم که بعد اولش رو از s که ۱ و ۲ و۳ هست و بعد دومش رو از v که ۱ و ۲ هست میگیره، اعضای مجموعه ی jn بصورت ۱٫۱ و ۱٫۲ و ۲٫۱ و ۳٫۲ هست، حالا تو محدودیت ها میخوام بگم هرگاه s=1 شد آنگاه بعد دوم رو به من بده یعنی ۱ و ۲، هرگاه s=2 شد عدد ۱ رو جایگذاری کنه و هرگاه s=3 شد، عدد ۲ رو جایگذاری کنه، این رو چجوری میشه نوشت؟

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

  23. سلام آقای محمودی
    سوالی در خصوص تعریف مجموعه های چند بعدی داشتم.
    در مسئله زمانبندی کار کارگاهی منعطف، اندیس هایی به فرم زیر دارم:
    اندیس J جهت کارها
    اندیس K جهت عملیات های کارها
    اندیس I جهت ماشین ها
    اندیش L جهت تعیین عملیات هر کار که زیر مجموعه ای از کار و عملیات هست.

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

    /L(j,k)    /1.1*3, 2.1*2
    

    که برای کار یک سه عملیات و برای کار ۲ دو عملیات وجود دارد.

    متغییر باینری دارم به نام (e(j,l,i که بیانگر توانایی ماشین i جهت انجام عملیات L کار j هست. (به فرم table تعریف کردم)

                                            (Table e(j,l,i
                        1       2
             1.1      1       0
             1.2      0       1
             1.3      1       0
             2.1      1       0
             2.2      0       1
    

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

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

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

    با تشکر

      • جناب محمودی
        سلام مجدد

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

        با تشکر

        • سلام
          دیدم فایل رو. شما یه اندیس دو بعدی به اسم L(j,k) تعریف کردین. بعد اومدین تو دستور table به اندیس L ریفرنس دادین، این عمل امکان پذیر نیست!
          شما باید جدول e(j,k,i رو که تعریف کردین، تبدیل بکنین به e(j,k,i

          Table e(j,k,i)
                            1       2
                   1.1      1       0
                   1.2      0       1
                   1.3      1       0
                   2.2      1       0
                   2.3      0       1
          ;
          
        • جناب محمودی
          لطفا اگر امکان داره در خصوص نحوه تعریف مجموعه بعد از پارامتر توضیح میدید.
          متاسفانه من نتونستم این روش را که شما گفتید تعریف کنم.

          ممنونم

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

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

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

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

      • ممنونم از پاسخگویی شما، مدلی که من تا حالا نوشتم فقط نشون میده که هر وسیله چه گره هایی رو میبینه.
        بذارید با مثال سوالم رو بپرسم: برای وسیله نقلیه نوع اول این گره ها وجود داره:
        d1-s6
        s1-t
        s5-s1
        s6-t1
        t1-d1
        t1-s5
        گمز متغیر باینری مسیر برای این گره ها رو برابر ۱ قرار میده. ای جوابی که گمز میده یه تور درست هست. درواقع معنیش میشه این تور:
        d1-s6-t1-s5-s1-t1-d1
        t ها ایستگاه تخلیه و s ها گره و dهم پارکینگ هست.
        من میخوام به گمز بگم تمام زیر تور های مربوط به ایستگاه ۱ رو جداگانه و تمام زیر تور های ایستگاه ۲ رو جداگانه نشون بده.
        در این صورت میزان تخلیه بار در هر ایستگاه رو میتونم مشخص کنم.
        اگر بخوام جمع آوری بعد از هر گره رو محاسبه کنم باید گمز بدونه که چه گره هایی رو قبلش دیده. که این رو نمی دونم چجوری به گمز بفهمونم

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

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

    J index of bus /j1*j33/
    t index of time period /t1*t24/
    n(j,j,t) /
    j1.j2.#t
    j2.j3.#t
    j3.j4.#t
    .
    .
    /
    

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

    activeflc $ n(J,J,t)..          PF(J,J,t)+PW(t)=e= sum(J,PF(J,J,t))-PU(J,t);
    

    میخوام سامیشن روی اندیس j آزاد باشه و PF به شرط ترتیب اندیس سه بعدی n توی معادله باشه یعنی pf برای همه باس ها بر قرار نیس فقط طبق اون ترتیبی که توی n گفتم
    اما متاسفانه ارور میده که uncontrolled set entered as constant
    و این ارور رو روی n میگیره . وقتیم که به صورت

    activeflc(j,j,t) $ n(J,J,t)..          PF(J,J,t)+PW(t)=e= sum(J,PF(J,J,t))-PU(J,t);
    

    مینویسم میگه set is already under control
    معادلم به این صورته که PF و سامیشن روی ترتیبی که من میگم بیان توی معادله و باقی موارد روی تمام J انجام بشن
    ممکنه بهم کمک کنید
    واقعا ممنون میشم

    • سلام
      اولا شما باید از آلیاس استفاده کنین. (j,jp) . که هم تو تعریف n هم تو معادلات هر جا لازم بود j و هر جا لازم بود jp تعریف کنین.
      ثانیا شما باید مشخص کنین که تو معادله ای که نوشتین کدومش j هست و کدومش jp
      عمل اول رو انجام بدین، و برای ادامه ماجرا سوال دوم رو جواب بدین. عرض میکنم خدمتتون چیکار کنین

      • ممنون که پاسخ میدید.
        من n رو توی ست تعریف کرده بودم به صورت n(j,j) که اگر طبق گفته شما n(j,jp) تعریف کنم چون n ست هست نمیتونم قبلش alias کنم مجبورم که بعدش انجام اما اگه این کار رو بکنم jp رو نمیشناسه. مجبور شدم یه سری ست جدید تعریف کنم به اسم
        Jp /jp1*jp33/ که بتونم اون تفکیکی که شما گفتین انجام بدم. اما هنوزم نمیتونم مثلا pf(j,jp,t) رو مجبور کنم که طبق درایه های n یا طبق چینش j و jp عمل کنه .

        • شما یه j تعریف کنین. بعد jp رو الیاس کنین. بعد دوباره با یه دستور set دیگه بیاین n رو ترعیف کنین.

  27. سلام. ممنون از سایت فوق العاده مفیدتون .
    من نیاز دارم در مدلم اندیسی رو تعریف کنم که برحسب عدد یکی از پارامترها می باشد . ولی نمیدونم چجوری باید تعریف بشه .
    فرض کنید مدل دارای اندیسی برای تعریف محل های مورد نظر به صورت /f/ f1*fn می باشد . که n برحسب هر مسئله می تواند متفاوت باشد . هریک از این محل ها دارای تعدادی اپراتور هست که پارامتر C بدین منظور مثلا به صورت مقابل
    تعریف میشه /C(f)/ f1 2,f2 3,…,fn 5 . در هریک از محل های f باید فرمولی محاسبه بشه که این فرمول دارای یک sum هست که اندیس sum برای هر محل برابر ۰ تا C(f)-1 می باشد یعنی مثلا فرمول در f1 دارای جمع با اندیس ۰ تا ۱ ، در محل ۲ جمع روی ۰ تا ۲ و به این ترتیب تا محل n م محاسبه میشه . و من نمیدونم این اندیس رو به چه صورتی تعریف کنم . از طرفی نمیشه برای هر fi اندیس جدا در نظر گرفت چراکه ممکنه تعداد محل ها خیلی زیاد باشه و این کار معقول نیست . ممنون میشم راهنمایی بفرمایید .

    • سلام
      مقداری برای من گنگ بود فرمایش شما.
      ولی طبق چیزی که من از حرفاتون دریافت کردم، میتونین یه اندیس مثل p تعریف کنین که از ۱ تا یه عدد بزرگ مثل ۱۰ باشه (این ۱۰ بزرگتر مساوی هست با ماکسیمم Cها باشه) بعد تو اون سیگما بنویسی سیگما روی p به شرطی که p از ۰ تا cf-1 باشه.
      اگه متوجه سوالتون نشدم دقیق تر توضیح بدین لطفا.

  28. خیلی ممنون که پاسخ دادید . لطف کردید .
    من با مشکل دیگری هم در همین فرمول مواجه هستم ، ممنون میشم اگر در این مورد هم من را راهنمایی کنید .
    همین اندیس p که فرمودید ، در خود فرمول دخیل هست ولی وقتی همین اندیسی که در set تعریف شده را در فرمول می نویسم ارور می دهد . فرض کنید فرمول به صورت زیر باشد :
    a^p/p(روی p)∑
    به چه صورتی می توانم پارامتری تعریف کنم که برابر با اندیسی که بر روی sum قرار دارد، باشد و بتوان از آن به جای p در فرمول استفاده کرد ؟

پاسخ دهید

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