ایجاد یک فایل GDX در گمز و نوشتن داده روی آن توسط دستور put

ایجاد فایل GDX و نوشتن داده روی آن راه های متفاوتی دارد، یک از این راه ها استفاده از دستور put است. کد زیر را در نظر بگیرید:

Set j / j01*j03 /;
alias(i,j);

parameter a(i,j);
a(i,j) = uniform(10,30);
table b(i,j)
    j01 j02 j03
j01 4   0   2
j02 1   3   4
j03 9   0   9
;

File testgdx;
put_utility testgdx 'gdxout' / 'data' '.gdx';

execute_unload a,b;

در کد فوق ما ابتدا یک مجموعه و دو پارامتر a,b را تعریف کرده ایم،
سپس توسط دستور file یک فایل به نام testgdx تعریف نموده ایم. در مرحله ی بعد توسط دستور put_utility یک فایل gdx تعریف کرده ایم که نام آن data.gdx می باشد. در نهایت هم مقادیر a,b را در فایل gdx تولید شده قرار داده ایم.
دقت کنید که توسط دستور put_utility ما می توانیم فایل ها را تغییر نام داده، فایل های جدید تولید کنیم، فایل هایی که از قبل ذخیره شده اند را با تغییر نام دستکاری کنیم، و یا توسط آن فایلهایی مانند gdx را تولید کنیم. در اینجا توسط دستور gdxout به گمز فهمانده ایم که یک فایل gdx تولید کند و با عبارت بعد از اسلش (/) یک فایل با نام data که فرمت آن gdx هست را ذخیره کرده ایم.
دقت بفرمایید که تا این مرحله از کار یک فایل data.gdx که خالی است تولید کرده ایم. در ادامه توسط execute_unload دو پارامتر a,b را روی آن نوشته ایم.
در نهایت خروجی به شکل زیر خواهد بود.
gdx
حال می توان تصور کرد که توسط put_utility و ترکیب آن با دستور Loop یا هر حلقه ی دیگری، فایل های متفاوت با فرمت ها و کاربردهای متفاوت را تولید کرد. در صورتی که در استفاده از این دستور حرفه ای شوید، می توانید با سرعت بیشتری فایلهای مورد نیاز خود را تولید و جهت گزارش دهی بازنویسی کنید.

به عنوان یک کاربرد دیگر از این دستور می توان به قابلیت فراخوانی داده ها از gdx اشاره کرد. در کد زیر ما داده های a,b که قبلا ذخیره کرده ایم را توسط دستور put_utility فراخوانی کرده ایم. این فراخوانی بسیار سریع بوده و می تواند برای علاقمندان مفید باشد.

put_utility 'gdxin' / 'data' '.gdx' ;
execute_load a,b;
display a,b;

 

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

26 دیدگاه

  1. reza

    سلام وقت بخیر
    من وقتی مدلو با اپسیلون کانسترینت حل میکنم و میخوام مقادیر متغیرها از گمز به اکسل انتقال بدهم از
    کد زیر استفاده میکنم و با مشکل مواجه میشم.در حین حل مساله وقتی شیت های مختلف اکسل را بررسی میکردم نتایج کاملا درست بود ولی زمانیکه تکرار آخر انجام میشد نتایج شیت دوم تا آخر یکسان میشد. اینم کدم بود که gهمون gridpoint ماست.

    loop(g
    
    execute_unload 'results.gdx' xa.l 
    put_utility 'exec' / 'gdxxrw.exe results.gdx   var=xa.l rng=sheet'g.tl:0'!a1'
    solve mod_epsmethod maximizing a_objval using mip;
    );
    

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

    1. محمودی

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

  2. reza

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

    1. محمودی

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

  3. ساناز

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

     table d(i,j)
    $ call=xls2gms r=sheet1!a1:j51 i=Ddata.xlsx o=model.inc
    $ include model.inc;
    وقتی ران می کنم کادر xls2gms باز میشه و ok رو میزنم و نوشته های پایین میاد و به نظر همه چیز اوکیه:
    Application: Microsoft Excel
    Version: 15.0
    Workbook: C:\Users\1\Documents\gamsdir\projdir\data.xlsx
    Sheet: Sheet1
    Range: $A$1:$J$51
    Done with model.inc
    

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

    1. محمودی

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

      $onecho > model.txt
      I=model.xlsx
      R=sheet1!a1:j51
      O=model.inc
      $offecho
      
      $call =xls2gms @model.txt
      
      
      table d(i,j)
      $include model.inc
      ;
      

      با این مشکل حل میشه. این روزا کمتر از xls2gms استفاده میشه. الان از تکنولوژی gdx استفاده میشه بیشتر

  4. احمد

    با سلام، دو سوال دارم:
    ۱- تفاوت دو کد دستوری زیر چیست؟ (x راکتانس خط و limit حد شارش توان خط انتقال قدرت می باشد)

    BRANCH(BUS,NODE,'X')$(BRANCH(NODE,BUS,'X'))=BRANCH(NODE,BUS,'X');
    BRANCH(BUS,NODE,'LIMIT')$(BRANCH(BUS,NODE,'LIMIT')=0)=BRANCH(NODE,BUS,'LIMIT');
    

    2- اگر بخواهیم باقی ورودی های معالات را در صفحه لیست ببینیم، از چه کد دستوری باید استفاده کنیم؟

    REMAINING 61 ENTRIES SKIPPED
    
    1. محمودی

      سلام
      من مفاهیم این مدل رو نمیدونم. ولی اولی میگه که در صورتی که branch مثبت باشه، معادله باید اجرا بشه. دومی هم میگه درصورتی که branch مساوی با صفر باشه.
      سوال دوم، کد زیر رو قبل از دستور solve بذارین.
      option limrow=1000;

  5. هانیه

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

    1. محمودی

      سلام
      قبل از هر چیزی نسخه گمزتون رو بروز کنین. فایل اکسل حتما باید تو دایرکتوری فعال گمز باشه تا بشه فراخوانی انجام داد.
      کد زیر نشون میده که جدول سه بعدی میخوایم فراخوانی کنیم که دو اندیس اول تو دو ستون A,B در اکسل قرار گرفتن و اندیس سوم تو سطر اول. یعنی ماتریسی که تو اکسل تعریف شده به این شکله که گفتم. پس گمزم باید همین رو بخونه.
      حالا کد زیر این جدول رو فراخوانی میکنه. نام فایل اکسل book.xlxs و شیت مربوطه sheet1 و داده ای که میخوایم بخونیم d(k,j,i هست.

      parameter d(k,j,i);
      $call GDXXRW gamsbook.xlsx par=d rng=sheet1!a1 rdim=2 cdim=1
      $gdxin gamsbook.gdx
      $load d
      $gdxin
      
      

      جدول تو اکسل به این شکله:

      		i01	i02	i03	i04
      k01	j01	5	10	2	5
      k01	j02	5	10	8	9
      k02	j01	3	0	8	10
      k02	j02	7	10	1	10
      k02	j03	4	1	1	3
      
      
  6. هانیه

    سلام ممنونم که جوابم رو دادید. اره منم همینجور دستورشو نوشتم . ولی خطای ۴۶۳ رو میزنه یعنی
    the column section in the previous table is misssing .
    مگه cdim تعداد ستونهایی نیست که در نظر میگیره برای اینکه به صورت اعداد داخل جدول محسوب نشه؟ مهم نیست جدول در اکسل از چه cell و ستونی نوشته بشه؟ میتونه تشخیص بده که از کدوم سمت چنتا رو بعنوان لیبل در نظر بگیره؟ یک دنیا ممنون میشم این سوالم رو هم پاسخ بدید

    1. محمودی

      ببینین، وقتی جدول رو تو اکسب وارد میکنین (فرضا از a1 تو شیت مورد بحث شروع میکنین به وارد کردن داده)، باید a1,b1 خالی باشن. c1 تا مثلا q1 بشه اندیس سوم شما. a2 تا aفلان، و b2 تا bفلان هم اندیس اول و دوم شما باشن. اینجوری میخونه. خودش دیگه میفهمه. برا اینکه قاطی نکنه، و ادرس دقیق تر نخواد، تو هر شیت فقط یه جدول بذارین.

  7. هانیه

    در واقع کد گمز من به صورت زیر هست
    CALL GDXXRW.EXE C:\Users\hani\Documents\gamsdir\projdir\data5.xlsx par=c rdim=1 cdim=1 rng=A1:Z26
    table c(i,j) ‘The cost of between nodes’
    $GDXIN data5.gdx
    $LOAD c
    $GDXIN
    display c;
    البته چون i وj رو ابتدای کد نویسی در مجموعه ها تعریف کردم اینجا دوباره تعریفش نکردم.

    1. محمودی

      طبق چیزی که من براتون گذاشتم بنویسین. parameter بذارین. ترتیب هم رعایت کنین.

  8. هانیه

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

  9. saeid

    با سلام و درود
    من در انتقال فایل از اکسل به گمز با مشکلی روبرو شدم و اونم اینه که هر موقع از گمز run میگیرم با چنین خطایی مواجه میشم
    error 510
    unable to open gdx file for $gdxin
    واقعا دیگه کلافه شدم و نمیدونم مشکل از کجاست.
    درضمن کدنویسیم هم بدین صورته..
    call gdxxrw saeid1.xlsx par=c reng=sheet1!a1:c3 rdim=1 cdim=1$
    $gdxin saeid1.gdx
    $load c
    $gdxin
    واقعا ممنون میشم اگه کمکم کنید.

    1. محمودی

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

      1. Maryam

        سلام لطف میکنید منظورتون رو از دایرکتوری گمز بیشتر توضیح بدید؟ من نمیتونم پیداش کنم و به ارور ۵۰۲ و ۵۱۰ برخوردم

        1. محمودی

          این مسیر رو دنبال کنید در گمز
          file/project
          اونجا مشخص میشه که دایرکتوری کجا هست. معمولا در صورتی که تغییر ندید، documents/gamsdir/projdir

  10. سروش رحیمی

    با سلام و خسته نباشید
    سوال من اینه که من در قسمت پارامترم اومدم تعریف کردم که به عنوان مثال
    parameter h(i) /
    1 25
    2 63
    3 40
    ……
    همینو اوردم تو اکسل با دستور مخصوص خودش
    Ww رو هم در قسمت مجموعه ۱ تعریف کردم
    Parameter h(i,ww)
    1
    1 25
    2 63
    3 40

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

    1. محمودی

      سلام
      چه تفاوتی داره؟
      بعد از اینکه گمز از رو اکسل خوند داده ها رو، آیا display کردین h رو؟

  11. mtm

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

    1. محمودی

      سلام
      آدرس دهی ها رو دقت کنین. هر بار که میریزین تو gdx داده ها رو، یه display هم بکنین. ببینین میخونه داده ها رو یا نه. اگه نه که ادرس دهیتون احتمالا اشتباه هست.

  12. امیرحسین

    سلام ببخشید توضیح این سه خط روش eps که در library گمز هست را کسی میدونه؟
    $set fname p.%gams.scrext%

    File fx ‘solution points from eps-method’ / “%gams.scrdir%%fname%” /;

    $if not set gridpoints $set gridpoints 10

    1. محمودی

      سلام
      اولی که داره یه فایل رو نامگذاری میکنه. که اسمش هم از gams.scrext میخونه. این جزو اطلاعات سیستمی گمز هست. برا اینکه متوجه بشین اینو سرچ کنین gams system attributes
      دومی هم داره یه فایل تولید میکنه به نام fx
      سومی هم میگه مقدار گریدلاین رو که تو روش eps برای تیکه تیکه کردن بازه های جواب استفاه میشه رو برابر ۱۰ قرار میده. (درصورتی که از قبل عدد دهی نشده باشه)

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