۲۲

ایجاد یک فایل 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;

 

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

  1. سلام وقت بخیر
    من وقتی مدلو با اپسیلون کانسترینت حل میکنم و میخوام مقادیر متغیرها از گمز به اکسل انتقال بدهم از
    کد زیر استفاده میکنم و با مشکل مواجه میشم.در حین حل مساله وقتی شیت های مختلف اکسل را بررسی میکردم نتایج کاملا درست بود ولی زمانیکه تکرار آخر انجام میشد نتایج شیت دوم تا آخر یکسان میشد. اینم کدم بود که 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;
    );
    

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

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

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

  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 هست رو میزنم فقط همین متنو رفرش میکنه دیگه اتفاقی نمیفته کادر همینجور میمونه و حل مدل ادامه پیدا نمیکنه
    میخواستم ببینم چی باید بزنم که حللش ادامه پیدا کنه و همینجور نمونه رو این کادر؟

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

      $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
    
    • سلام
      من مفاهیم این مدل رو نمیدونم. ولی اولی میگه که در صورتی که branch مثبت باشه، معادله باید اجرا بشه. دومی هم میگه درصورتی که branch مساوی با صفر باشه.
      سوال دوم، کد زیر رو قبل از دستور solve بذارین.
      option limrow=1000;

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

    • سلام
      قبل از هر چیزی نسخه گمزتون رو بروز کنین. فایل اکسل حتما باید تو دایرکتوری فعال گمز باشه تا بشه فراخوانی انجام داد.
      کد زیر نشون میده که جدول سه بعدی میخوایم فراخوانی کنیم که دو اندیس اول تو دو ستون 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 و ستونی نوشته بشه؟ میتونه تشخیص بده که از کدوم سمت چنتا رو بعنوان لیبل در نظر بگیره؟ یک دنیا ممنون میشم این سوالم رو هم پاسخ بدید

    • ببینین، وقتی جدول رو تو اکسب وارد میکنین (فرضا از 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 رو ابتدای کد نویسی در مجموعه ها تعریف کردم اینجا دوباره تعریفش نکردم.

  8. با سلام و درود
    من در انتقال فایل از اکسل به گمز با مشکلی روبرو شدم و اونم اینه که هر موقع از گمز 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
    واقعا ممنون میشم اگه کمکم کنید.

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

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

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

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

پاسخ دهید

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