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

مقدمهنرم افزار GAMS ابزاری تخصصی جهت حل مدل های ریاضی هست که به دنبال بهینه کردن اهداف خود با توجه به محدودیت هایی که هر تصمیم گیری با آن مواجه است، همچون محدودیت سرمایه، مواد اولیه، انرژی مصرفی، زمان اتمام، نیروی کار و غیره می باشد. نرم افزار GAMS به عنوان یک ابزار قدرتمند و فراگیر برای حل مدل های ریاضی حتی در ابعاد بزرگ روز به روز نقش پررنگ تری در رشته های مهندسی ایفا می کند، یعنی هر جا نیاز به تصمیم گیری بهینه با محدودیت زمان، هزینه و منابع داشته باشیم باید از مدل سازی ریاضی استفاده کرده که GAMS از ابزارهای بسیار کارآمد حل این نوع مدل ها است.(GDX) GAMS Data eXchangeامکانات GDX ویژگی های اساسی را برای تبادل داده های GAMS مانند خواندن و نوشتن فراهم می کند. علاوه بر این امکانات ، تعدادی ابزار GDX برای تبادل داده بین GAMS و سایر منابع داده و همچنین برای انجام عملیات خاص روی یک فایل GDX وجود دارد.فایل GDX فایلی است که مقادیر یک یا چند نماد GAMS مانند مجموعه ها ، متغیرهای پارامترها و معادلات را در خود ذخیره می کند. از فایل های GDX می توان برای تهیه داده برای یک مدل GAMS ، نتایج یک مدل GAMS ، ذخیره نتایج همان مدل با استفاده از پارامترهای مختلف و غیره استفاده کرد. از جمله موارد دیگر ، می توان از فایل GDX برای تهیه داده برای یک مدل GAMS ، انتقال نتایج یک مدل GAMS به برنامه های مختلف و انتقال نتایج به GAMS از برنامه های مختلف استفاده کرد.GDXXRWGDXXRW ابزاری برای خواندن و نوشتن داده های صفحه گسترده است. GDXXRW می تواند چندین محدودیت را در صفحه گسترده بخواند و داده ها را در یک فایل GDX بنویسد ، یا از یک فایل GDX بخواند ، و داده ها را در محدوده های مختلف در صفحه گسترده بنویسد.نحوه استفاده از GDXXRWفرمت کلی به صورت زیر میباشد:گزینه ها (options) و مشخصات نمادها (symbols) را می توان علاوه بر داخل برنامه که نوشته میشود از یک فایل متنی جدا نیز خواند بصورتی که قبل فایل (option file) یک @ قرار بگیرد که در ادامه به آن نیز خواهیم پرداخت.گزینه ها و مشخصات نمادها را می توان از یک خانه ای در خودصفحه گسترده نیز خواند.گزینه ها (options)برای انجام خواندن و نوشتن بر روی فایل توسط GDXXRW ، باید تعدادی از گزینه ها و مشخصات نمادها به داخل برنامه انتقال یابد و نوشته بشود. توانایی GDXXRW در پردازش چندین عمل در یک تماس ، انتقال و تفسیر میتواند گزینه را پیچیده تر بکند.چهار نوع گزینه وجود دارد که عبارتند از:1. گزینه Immediate: قبل از انجام اقدامات دیگر شناسایی و پردازش می شوند و فقط یک بار مشخص می شوند. مانند دستورات: input, output, traceمستقل از موقعیت آنها در خط دستور شناخته می شوند. آنها بصورت عمومی و global هستند و فقط یکبار می توان آنها را مشخص کرد.برای تعریف دقیق تر بیشتر چند گزینه از جدول بالا، گزینه input فایل ورودی را مشخص میکند و حتما باید مقدار داشته باشد. از کلیدواژه های input یا i برای تعیین نام فایل ورودی در هر کجای خط دستور (command line) استفاده میشود. پسوند فایل ورودی، مورد نیاز است چرا که آن اقدامات انجام شده توسط برنامه را تعیین می کند. پسوند .gdx برای فایل ورودی ، داده های یک فایل GDX را خوانده و داده ها را در صفحه گسترده می نویسد. پسوند .xls یا .xlsx برای فایل ورودی یک صفحه گسترده را خوانده و داده ها را در یک فایل .gdx می نویسد. علاوه بر پسوند فایل ورودی .xls و .xlsx ، پسوندهای زیر نیز برای فایل های ورودی صفحه گسترده معتبر هستند: .wk1 ، .wk2 ، .wk3 و .dbf.گزینه output هم مشخص کننده فایل خروجی است که مقدار اولیه آن نام فایل ورودی است.گزینه index خواندن گزینه ها و نمادها را مستقیماً از صفحه گسترده نشان می دهد و با استفاده از این دستور GDXXRW کوتاه می شود و می توان اطلاعات مربوط به نحوه خواندن داده ها را مستقیماً در صفحه گسترده نوشت تا خوانایی آن افزایش یابد. ردیف اول محدوده برای عنوان ستون که پارامترهای اضافی را نشان می دهد استفاده می شود.2. گزینه Global: این دستور از چپ به راست برای GAMS تفسیر و ترجمه می شوند و بر هر عمل و دستوری که انجام میشود تأثیر می گذارند و از یک گزینه می توان چندین بار استفاده کرد تا اقدامات بعدی را تحت تأثیر قرار دهد. مانند دستورات: skipEmpty, epsOutگزینه های بالا بر روی نمادهای دنباله روی گزینه تأثیر می گذارند. آنها در عمل باقی می مانند مگر اینکه دوباره تعریف شده و دوباره برای نماد دیگری استفاده شوند.3. گزینه Symbol: این گزینه عمل جدیدی را برای خواندن یا نوشتن نماد معرفی می کند. مانند دستورات: par, set, dSetبرای نوشتن داده ها در صفحه گسترده یا فایل GDX ، یک یا چند نماد و دامنه اکسل مربوط به آنها باید مشخص شود.نحو کلی مشخصات نماد بصورت dataType = symbolName {symbolAttributes} میباشد.عکس زیر دستورات کامل این گزینه میباشد.(var = GAMS_Variable) یک زیرشاخه (sub-field) از یک متغیر یا معادله را می توان در یک صفحه گسترده نوشت و باید به عنوان بخشی از نام نماد مشخص شود. زمینه های شناخته شده عبارتند از:.l (سطح(level)) ، .m (حاشیه ای(marginal)) ، .lo (حد پایین(lower bound)) ،.up (حد بالا(upper bound)) ، .prior (اولویت(priority)) و .scale(مقیاس(scale))نام های زیرشاخه ها به حروف کوچک و بزرگ حساس نیستند.(par = GAMS_Parameter) پارامترهای مورد استفاده در GAMSرا مشخص میکند تا از یک فایل GDXخوانده شود و در صفحه گسترده نوشته شود ، یا از صفحه گسترده خوانده شود و در یک فایل GDXنوشته شود یعنی نام پارامتر از قبل تعریف شده را وارد میکنیم تا بعد ها به طریق آن و با آن نام استفاده بکنیم. به عنوان مثال Par = data1 پارامتر data1 را خوانده و داده ها را درجای دیگری میریزد.(set = GAMS_Set [values = valueType]) در GAMS می توان با تعیین تمام عناصر، مجموعه ای را تعریف کرد.4. گزینه Symbol attributes: ویژگی ها اطلاعات اضافی را برای آخرین نماد تعریف شده مشخص می کنند. مانند دستورات: dim, cDimdataRange : محدوده اکسل برای داده های نماد. توجه داشته باشید که یک دامنه خالی معادل سلول اول صفحه اول است. rng = Excel Rangeمحدوده اکسل با استفاده از علامت گذاری استاندارد اکسل مشخص شده است: SheetName! CellRange.CellRange با استفاده از علامت گذاری سلول TopLeft: BottomRight مانند A1: C12 مشخص می شود. زمانی که BottomRight حذف شده است ، برنامه دامنه را تا آنجا که ممکن است پایین و به سمت راست گسترش می دهد. (استفاده از ".." به جای ":" پشتیبانی می شود.)هنگام نوشتن در صفحه گسترده اگر نام یک صفحه که در اکسل وجود ندارد آمده باشد، یک صفحه جدید با این نام اضافه می شود. جدول زیر خلاصه ای از دستورات میباشد.Dimensions:dim = integer بعد کلی برای نمادcDim = integer بعد ستون، تعداد ردیف های محدوده داده ای است که برای تعریف برچسب (label) ستون ها استفاده می شود. اولین ردیف های cDim برای برچسب ها استفاده می شود.rDim = integer بعد ردیف، تعداد ستون های محدوده داده ای است که برای تعریف برچسب ردیف ها استفاده می شود. اولین ستون های rDim محدوده داده برای برچسب ها استفاده می شود.هنگام خواندن داده ها از یک فایل GDX و نوشتن در صفحه گسترده ، ابعاد نماد مشخص است ولی هنگام خواندن صفحه گسترده و نوشتن در یک فایل GDX ، بعد مشخص نیست.مثال:خواندن اکسل Test1 با استفاده از پارامتر data برای استفاده در برنامه و range ستون A1 تا ردیف D3 و ردیف اول و ستون اول هم برچسب های داده ها هستند.خواندن پارامتر با استفاده از پیش مقدار تعریفبجای rng با سینتکس گفته شده در بالا از این استفاده میکنیم و فقط نام محدوده ای که در اکسل نام گذاری شده را در rng مینویسم.Return Codes(کدهای برگشت شده)هنگام اجرای برنامه با موفقیتGDXXRW ، عدد صفر را به عنوان کد خطا برمی گرداند. اگر خطایی وجود داشته باشد که علاوه بر پیام خطا ، با کد بازگشت خاص علامت گذاری شود.Option file (فایل گزینه)یک فایل گزینه می تواند چندین خط برای افزایش خوانایی داشته باشد و هنگام خواندن پارامترها از یک فایل متنی ، خطوطی که با ستاره (*) شروع می شوند نادیده گرفته می شوند و به عنوان یک نظر عمل می کنند.اگر فایل howToRead(fileName).txt باشد آنگاه در این حالت تنظیمات کلی اعمالی بر روی فایل برای خواندن یا حتی نوشتن را روی این فایل نوشته و هنگام نوشتن کد با استفاده @ قبل نام فایل و پسوندش، همه تنظیمات اعمال میشود و با استفاده از این حالت میتوان دستور قابتی را بدون نوشتن دوباره در چندین برنامه استفاده نمود.دستورات خواندن داده ها از صفحه گسترده و بارگیری در GAMSدستور $gdxin:این دستور برای بارگذاری موارد مشخص شده از یک فایل GDX یا برای بستن پرونده مشخص شده استفاده می شود. به شکل زیر نوشته میشود. (برای شناسایی و معرفی فایل منبع)دستور $load:این دستور موارد مشخص شده را از یک فایل GDX بارگیری می کند. گزاره حاوی $loadقبل و بعد از آن دستورات $gdxin قرار می گیرند. (وارد کردن داده به برنامه)$gdxin قبلی نام فایل GDX را مشخص می کند و پرونده را باز می کند.$gdxin موفق شده پرونده GDX را می بندد.نوشتن متن در فایل در حین compilationبا استفاده از دستوراتecho$ ، $onecho و offecho$ در هنگام اجرا متن را به فایل های نام برده ارسال می کنند.echo$ یک خط متنی می فرستد:نکته: استفاده از "> "یک فایل جدید ایجاد می کند ، در حالی که" >> "به یک فایل موجود اضافه متن را اضافه میکند.برای پیام های چند خطی می توان از دستورات onecho$ و offecho$ استفاده کرد.دستور $call :می توان از $call برای اجرای دستور GDXXRW در کد GAMS برای خواندن از صفحه گسترده در زمان تدوین(compilation) استفاده کرد.همه دستور ها در زمان اجرا و execute کردن فایل انجام خواهند شد.برای جایگزینی دستورات بالا می توان از execute و execute_load استفاده نمود برای مثال دو قطعه کد پایین معادل هم میباشند.نوشتن داده در صفحه گستردههنگام نوشتن در صفحه گسترده با GDXXRW ، باید از دستورات موجود در GAMS استفاده کنید تا ابتدا داده ها را در پرونده GDX قرار دهید . برای نوشتن داده ها باید از دستورات execute و execute_unload در زمان اجرا استفاده شود.برای مثال:خط execute_unload می گوید چه داده هایی را باید در فایل GDX قرار داد و نام فایل منبع GDX را تعیین می کند و قبل نوشتن در فایل، پارامتر ها را از GAMS بارگیری میکند. در خط بعدی GDXXRW نام فایل GDX ، صفحه گسترده (اختیاری)، را بیان می کند و داده های مورد نظر برای نوشتن را مشخص می کند.نکته: هنگام استفاده از GDXXRW باید مراقب باشید زیرا هر بار که دستور اجرا می شود فایل همنام GDX پاک می شود و فقط دارای محتوای فعلی بعد اجرا آن خط است، بنابراین در صورت استفاده مجدد از نام ، باید قبل از آن پشتبانی تهیه بشود.مثالی دیگر برای نوشتن در فایل با استفاده از .txt فایلhText نوشته عنوان در که از خانه A1 شروع میشود میباشد و به اندازه "," ستون رد میشود وبه ستون بعد میرود و در مثال بالا بعد نوشتن valuesL noData دو ستون رد شده و مقدار بعدی نوشته می شود. با توجه به خطوط بعدی و دستور values به معنی نوع داده در خانه ها، ستون اول خالی، ستون بعد مقدار y و ستون بعد با رشته(String) توسط GDXXRWپر خواهد شد و خروجی به شکل زیر میشود.برای اطلاع دقیق تر از موارد گفته شده و مضاف بر آنها منابع مطالعه گردد.منابعhttps://www.gams.com/latest/docs/T_GDXXRW.html#GDXXRW_SYMBOLS_SEThttps://www.gams.com/latest/docs/UG_GDX.html#UG_GDX_READ_COMPILE_GDXINhttps://www.gams.com/latest/docs/UG_DataExchange_ASCII.htmlhttps://www.gams.com/latest/docs/UG_GDX.html"این مطلب در راستای درس بهینه سازی خطی2 در دانشگاه تحصیلات تکمیلی علوم پایه نوشته شده است."