آموزش فارسی و گام به گام GAMS (گمز) توسط ریچارد روزنتال (مبتدی-متوسط)
ریچارد ای. روزنتال از دانشکده تحصیلات تکمیلی نیروی دریایی در مونتری، کالیفرنیا، نمونه ی دقیق و مفصلی از به کار گیری گمز برای فرمول نویسی، حل و تحلیل یک مسئله بهینه سازی کوچک و ساده نوشته است. این مقاله مروری سریع روی گمز و ویژگی های اصلی آن است. منابع زیادی برای دیگر بخش های مستندات، تهیه شده است، اما آنها فقط به شما می گویند که در کدام بخش ها می توانید جزئیات بیشتری جستجو کنید. مطالب موجود در اینجا بدون مراجعه به بقیه مستندات، می تواند برای شما بسیار مفید باشد.
مثالی که در این بخش آورده شده است، نمونه ای از مسئله ی حمل و نقل از برنامه نویسی خطی است که از لحاظ تاریخی مانند “یک حیوان آزمایشگاهی” در توسعه فناوری بهینه سازی خدمت کرده است. [برای مطالعه ی بیشتر به دانتزیگ (۱۹۶۳) مراجعه کنید]. برای نشان دادن قدرت زبانهای مدل سازی جبری مانند گمز این مثال، انتخاب بسیار خوبی است زیرا مسئله حمل و نقل، صرف نظر از اینی که چقدر می تواند بزرگ باشد؛ یک ساختار جبری ساده و قابل بهره برداری دارد. خواهید دید که حتی اگر یک مسئله ی حمل و نقل بسیار بزرگتر نیز در نظر گرفته شود، تقریباً همه عبارت های موجود در فایل ورودی GAMS که ما قصد ارائه آن داریم، بدون تغییر باقی می مانند.
در مسئله ی حمل و نقل، که مسئله آشنایی است، ملزومات در چندین کارخانه، و تقاضاها در چندین بازار برای یک کالای واحد تکمیل شده، به ما داده می شود و هزینه های واحد حمل و نقل کالا از کارخانه تا بازار را به ما می دهند. سوال اقتصادی این است: چه مقدار حمل و نقل باید بین هر کارخانه و هر بازار برقرار شود تا بتوان هزینه حمل و نقل را به حداقل رساند؟
نمایش های جبری این مسئله معمولاً با فرمتی مشابه شکل زیر ارائه می شود.
اندیس ها:
i = کارخانه ها
j = بازارها
اطلاعات داده شده:
ai = عرضه ی کالا در کارخانه i (در موارد)
bj = تقاضا برای کالا در بازار j
cij = قیمت حمل و نقل بین کارخانه i و بازار j
متغیرهای تصمیم گیری
xij = مقدار کالا برای حمل از کارخانه به بازار
که در آن برای تمامی i و j ها : xij0
محدودیت ها:
مشاهده محدودیت عرضه در کارخانه i = (برای تمامی i ها)
ارضای تقاضا در بازار j : (برای تمامی j ها)
تابع هدف: مینیمم ساختن
توجه داشته باشید که این مثال ساده برخی از شیوه های مدل سازی را نشان می دهد که بطور کلی آنها را با روش های خوبی تشخیص می دهیم زیرا با طراحی GAMS سازگار است. ابتدا همه آیتم های مدل براساس نوع شان مشخص (و گروه بندی) می شوند. در مرحله دوم، ترتیب اشیاء به گونه ای انتخاب می شود که قبل از تعریف، هیچ نمادی به آنها اشاره نکند. در مرحله سوم ، واحدهای همه آیتم ها مشخص شده اند، و در بخش چهارم، واحدها به گونه ای انتخاب می شوند که مقادیر عددی که باید توسط بهینه ساز وارد شوند، اندازه ی نسبتاً کوچکی دارند. (نماد K $ در اینجا به معنی هزاران دلار است.)
نام انواع اشیاء ممکن است در بین مدل سازها متفاوت باشد. به عنوان مثال ، اقتصاددانان به ترتیب از متغیر برون زا و متغیر درون زا برای اطلاعات داده شده و متغیر تصمیم گیری استفاده می کنند. در گمز، اصطلاحات اتخاذ شده به شرح زیر است: به اندیس ها مجموعه ها گفته می شود ، داده های ارائه شده پارامتر خوانده می شوند ، متغیرهای تصمیم گیری را متغیر می نامند ، و محدودیت ها و تابع هدف معادلات نامیده می شوند.
نمایش گمز از مسئله حمل و نقل شباهت نزدیکی با نمایش های جبری بالا دارد. مهمترین تفاوت این است که نسخه گمز توسط رایانه قابل خواندن و پردازش است.
جدول ۱: داده های مربوط به مسئله حمل و نقل (اقتباس از دانتزیگ ، ۱۹۶۳) نشان می دهد فاصله حمل و نقل از کتابخانه تا بازار (۱۰۰۰ مایل) می باشد، همچنین تقاضای بازار و ملزومات کارخانه نشان داده شده است.
کارخانه ها | نیویورک | شیکاگو | توپکا | بازارها |
سیاتل | ۲٫۵ | ۱٫۷ | ۱٫۸ | ۳۵۰ |
سن دیگو | ۲٫۵ | ۱٫۸ | ۱٫۴ | ۶۰۰ |
تقاضا | ۳۲۵ | ۳۰۰ | ۲۷۵ | ملزومات |
به عنوان نمونه ای از مسئله ی حمل و نقل، فرض کنید دو کارخانه کنسرو سازی و سه بازار وجود دارد که داده های آن در جدول ۱ نشان داده شده است. مسافت حمل و نقل هزاران مایل است ، و فرض می شود که هزینه حمل و نقل ۹۰٫۰۰ دلار در هر هزار مایل باشد. این مسئله در گمز به شرح زیر نمایش داده می شود:
اگر فایلی را که حاوی عبارت های فوق است؛ به عنوان ورودی به گمز ارسال کنید ، مدل حمل و نقل فرموله و حل می شود. جزئیات در مورد چگونگی فراخوانی گمز در رایانه های مختلف؛ متفاوت است، اما ساده ترین روش برای فراخوانی گمز وارد کردن کلمه GAMS به دنبال نام فایل ورودی است. شما تعدادی خط پیچیده را مشاهده خواهید کرد که نشان می دهد پیشرفت گمز در حال انجام است، همچنین شامل نام فایلی است که خروجی روی آن نوشته شده است. پس از آنکه گمز به پایان رسید، این فایل را بررسی کنید و اگر همه موارد خوب پیش رفته باشد، محموله های بهینه در ادامه به شرح زیر نمایش داده می شوند.
شما هزینه های حاشیه ای (مضارب سیمپلکس) را دریافت خواهید کرد.
این نتایج برای مثال، نشان می دهد که ارسال محموله از سیاتل به توپکا بهینه نیست ، اما اگر اصرار دارید که یک مورد را ارسال کنید، ۰٫۰۳۶ $K (یا ۳۶٫۰۰ دلار) به هزینه بهینه اضافه کنید.
ساختار مدل GAMS
برای ادامه آموزش، ما با اشاره به مثال بالا در مورد مؤلفه های اصلی یک مدل گمز بحث خواهیم کرد. مؤلفه های اساسی در جدول شماره ۲ آمده است.
جدول ۲: اجزای اصلی مدل گمز
مدل | مؤلفه |
ورودی ها | مجموعه ها
بیان تخصیص اعضا |
داده ها (پارامترها، جداول، اسکالرها)
بیان تخصیص اعضا |
|
متغیرها
بیان تخصیص اعضا |
|
تعیین محدوده های متغیر و / یا مقادیر اولیه (اختیاری) | |
معادلات
بیان تخصیص اعضا |
|
عبارت های حل و مدل | |
خروجی ها | چاپ اکو |
نقشه های مرجع | |
لیست معادلات | |
گزارش های وضعیت | |
گزارش های راه حل |
مؤلفه های ورودی اختیاری دیگری نیز مانند بررسی های مربوط به داده های بد و درخواست گزارش های سفارشی نتایج وجود دارد. از دیگر ویژگی های پیشرفته اختیاری می توان به صرفه جویی و بازیابی مدل های قدیمی و ایجاد چندین مدل در یک اجرای واحد اشاره کرد، اما در این آموزش فقط در مورد اجزای اصلی بحث خواهیم کرد.
قبل از بررسی مؤلفه های منحصر بفرد، چند نکته کلی را بیان می کنیم.
۱- یک مدل گمز مجموعه ای از عبارات به زبان گمز است. تنها قاعده حاکم بر ترتیب عبارت ها آن است که موجودیت مدل را نمی توان قبل از بیان موجودیت، به آن عبارت ها ارجاع داد.
۲- عبارت های گمز را می توان تقریباً به هر سبکی که برای کاربر جذاب باشد، تنظیم کرد. چندین خط در هر عبارت ، فاصله های تعبیه شده و عبارت های چندتایی در هر خط مجاز است. شما در مورد آنچه که مجاز است؛ از این مثال، مطالبی را خواهید فهمید، اما قوانین دقیق جاده در فصل بعد آورده شده است.
۳- هنگامی که شما یک کاربر تازه کار گمز هستید، مانند مثال های ما باید هر جمله را با استفاده از سمیکالون، خاتمه دهید. کامپایلر گمز بین حروف بزرگ و کوچک تفاوت قائل نمی شود ، بنابراین شما نیز قادر به استفاده از هر یک از آنها هستید.
۴- مستندات برای کاربردی بودن مدلهای ریاضی، بسیار مهم است. اگر مستندات به جای اینکه به طور جداگانه نوشته شود، در داخل مدل تعبیه شود؛ مفیدتر (و به احتمال زیاد دقیق تر) است. حداقل دو روش برای درج مستندات در یک مدل گمز وجود دارد. اول اینکه، هر خطی که با ستاره در ستون ۱ شروع می شود ، توسط کامپایلر GAMS به عنوان خط کامنت در نظر گرفته نمی شود. دوم این که، متن مستندات را می توان در جمله های خاص گمز درج کرد.
۵- همانطور که از لیست مؤلفه های ورودی فوق مشاهده می کنید ، ایجاد اشیاء در گمز شامل دو مرحله است: بیان و تخصیص یا تعریف. بیان به معنای اعلام وجود چیزی و نامگذاری آن است. تخصیص یا تعریف به معنای آن است که به چیزی، یک مقدار خاص یا شکلی اختصاص داد. در مورد معادلات ، باید عبارت های جداگانه ی گمز را بیان و تعریف کنید. با این وجود ، برای سایر اشیاء گمز، شما مختارید که بیان و تخصیصات را در یک عبارت یا به صورت جداگانه انجام دهید.
۶- اسامی که به اشیاء مدل داده می شود باید با یک حرف شروع شوند و نام آن را می توان تا ۶۲ حرف یا رقم دیگر ادامه داد.
مجموعه ها
مجموعه ها، بلوک های ساختاری اساسی یک مدل گمز هستند که دقیقاً مطابق با اندیس های موجود در نمایش های جبری مدل ها هستند. مثال حمل و نقل فوق فقط شامل یک عبارت مجموعه است:
تأثیر این جمله احتمالاً بدیهی و آشکار است. ما دو مجموعه را بیان و معرفی کردیم و آن ها را به اسم های i و j نامیدیم. ما همچنین اعضای هر مجموعه را به شرح زیر اختصاص دادیم:
i = {سیاتل ، سن دیگو}
j = {نیویورک ، شیکاگو ، توپکا}.
برای فهرست کردن عناصر یک مجموعه ، باید به تفاوتهای تایپی بین فرمت GAMS و فرمت ریاضی معمولی توجه کنید. در گمز به جای{} برای ترسیم مجموعه، از اسلش “/” استفاده می شود ، زیرا تمام کیبوردهای کامپیوتر ممکن است کلیدی برای گذاشتن آکلاد {} نداشته باشد. توجه داشته باشید که اسامی چند کلمه ای مانند “نیویورک” نیز باید به صورت نقل قول بیان شود ((به عنوان مثال “نیویورک” یا ‘نیویورک’) یا این که باید به جای فاصله از خط تیره استفاده کنید (به عنوان مثال New-York ).
کلماتی که بعد از نامهای مجموعه در بیان مجموعه ها در بالا می آیند؛ متن نامیده می شوند. آوردن متن اختیاری است. فقط برای مستندات داخلی موجود است، و هیچ هدف رسمی را در مدل ارائه نمی کند. کامپایلر GAMS هیچ تلاشی برای تفسیر متن ها نمی کند، اما متن ها، برای راحتی شما در زمان های مختلف ذخیره می شود.
نیازی به ترکیب مجموعه های i و j در یک عبارت نیست. ما می توانیم آنها را در عبارت های جداگانه، به شرح زیر قرار دهیم:
قرار دادن فاصله و خطوط (و همچنین انتخاب حروف بزرگ یا کوچک) به عهده شماست. هر کاربر گمز تمایل دارد که سبک قوانین ادبی منحصر به فردی را توسعه دهد. (استفاده از مجموعه واحد نیز به عهده شماست. استفاده از مجموعه در عبارتی که باعث می شود یک بیان واحد ایجاد شود و مجموعه ها در یک عبارت چندین مورد ایجاد می کند، اما گمز با مفرد و جمع یکسان رفتار می کند.)
یکی از ویژگی های قراردادی برای استفاده در هنگام اختصاص اعضا به یک مجموعه، استفاده از ستاره است. این آیتم در مواردی اعمال می شود که عناصر یک توالی را دنبال کنند. به عنوان مثال، عبارت های مجموعه ای معتبر در گمز به شرح زیر است:
در اینجا شیوه های اختصاص دادن آورده شده است
t =
m =
توجه داشته باشید که عناصر مجموعه به عنوان رشته کاراکترها ذخیره می شوند، بنابراین عناصر مجموعه t اعداد نیستند.
یکی دیگر از ویژگیهای مناسب عبارت alias است که برای اختصاص دادن نامی دیگر به مجموعه ای که قبلاً بیان شده استفاده می شود. در مثال زیر:
نام tp مانند t‘ در علامت های ریاضی است. به کار بردن این نماد؛ در مدل هایی مفید است که به تعاملات عناصر موجود در همان مجموعه مربوط می شوند.
مجموعه هایi ، j ، t و m در عبارات فوق نمونه هایی از مجموعه های استاتیک هستند، یعنی آنها، مستقیماً توسط کاربر به اعضای خود اختصاص داده می شوند و تغییر نمی کنند. گمز دارای چندین قابلیت برای ایجاد مجموعه های دینامیک است که اعضای خود را از طریق اجرای عملیات نظریه ای و منطقی به دست می آورند. مجموعه های دینامیکی در فصل مجموعه های دینامیک مورد بحث قرار گرفته است. یکی دیگر از ویژگی های ارزشمند پیشرفته، مجموعه های چند بعدی است که در بخش مجموعه های چند بعدی مورد بحث قرار می گیرد.
داده ها
مدل گمز از مسئله ی حمل و نقل سه نوع از فرمت های مختلف را نشان می دهد که برای ورود داده ها مجاز هستند. سه فرمت عبارتند از:
- لیست ها
- جداول
- تخصیص های مستقیم
سه بخش بعدی به نوبه خود در مورد هر یک از این قالب ها بحث خواهد کرد.
ورود داده ها توسط لیست ها
فرمت اول توسط اولین عبارت پارامترهای مثال نشان داده شده است که در زیر تکرار می شود.
این جمله چندین اثر دارد. باز هم ، آنها ممکن است بدیهی باشند، اما تحلیل جزئیات آنها می تواند ارزشمند باشد. این عبارت وجود دو پارامتر را بیان می کند، که به آنها اسم های a و b را داده است و دامنه های آنها را به ترتیب i و j بیان می کند. (یک دامنه مجموعه یا دسته ای از مجموعه ها است که یک پارامتر، متغیر یا معادله برای آن تعریف شده است.) این عبارت همچنین متن مستندات را برای هر پارامتر فراهم می کند و مقادیر a(i) و b(j) را برای هر عنصر اختصاص می دهد. اگر ترجیح می دهید که این عبارت را به دو صورت زیر تقسیم کنید، کاملاً قابل قبول است.
در اینجا نکاتی وجود دارد که باید هنگام استفاده از فرمت لیست بندی به یاد داشته باشید.
۱- لیست عناصر دامنه و مقادیر پارامتر مربوطه می تواند تقریباً به هر روشی که دوست دارید ارائه شود. تنها قانون، آن است که کل لیست باید محصور در اسلش ها درج شود و جفتهای مقدار عنصر را باید با کاما از هم جدا کنیم یا در خطوط جداگانه وارد کنیم.
۲- هیچ سمیکالونی وجود ندارد که لیست مقدار عناصر را از نام، دامنه و متنی که پیشتر ذکر شده است، جدا کند. زیرا هنگام استفاده از فرمت لیست بندی، همان جمله را برای بیان و تخصیص استفاده می کنید. (یک لیست از مقدار عناصر به خودی خود توسط گمز قابل تفسیر نیست و به یک پیام خطا منجر می شود.)
۳- کامپایلر گمز یک ویژگی غیرمعمول به نام بررسی دامنه دارد، که تأیید می کند که هر عنصر دامنه موجود در لیست در حقیقت عضو مجموعه ای مناسب است. به عنوان مثال ، اگر می خواهید “Seattle” را به طور صحیح در عبارتی که مجموعه i را بیان می کند؛ تلفظ کنید، اما آن را به شکل اشتباه “Seatle” در لیست بعدی مقادیر عناصر بنویسید، کامپایلر گمز به شما یک پیام خطا می دهد که عنصر “Seatle” متعلق به مجموعه i نیست.
۴- صفر مقدار پیش فرض برای همه پارامترها است. بنابراین ، شما فقط باید ورودی های غیر صفر را در لیست مقدار عناصر وارد کنید و اینها به هر ترتیب وارد می شوند.
۵- اسکالر به پارامتری گفته می شود که دامنه ندارد. این پارامتر را می توان با عبارت Scalar بیان کرد که حاوی یک لیست است که تنها یک مقدار دارد، که در عبارت زیر از مدل حمل و نقل آمده است.
اگر دامنه یک پارامتر دو یا چند بعد داشته باشد، باز هم می توان مقادیر آن را با فرمت لیست وارد کرد. این برای ورود آرایه هایی که پراکنده (مقادیر غیر صفر کمی دارند) و فوق العاده پراکنده (مقادیر غیر صفر مجزای کمی دارند) هستند؛ بسیار مفید است.
ورود داده ها توسط جداول
متخصصان بهینه سازی مدتی است که متوجه شده اند که بسیاری از داده های ورودی برای یک مدل بزرگ، از جداول نسبتاً کوچکی از اعداد گرفته شده است. بنابراین ، داشتن فرمت جدول برای ورود داده ها بسیار مفید است. نمونه ای از جدول دو بعدی (یا ماتریس) در مدل حمل و نقل ارائه شده است:
نکته مهم این است که بر حضور سمیکالون در انتهای خط اول تأکید می شود. بدون آن ، کامپایلر گمز تلاش می کند هر دو خط را به عنوان بخش هایی از همان جمله تعبیر کند. (گمز قادر به شناسایی معتبر بودن این عبارت نیست، بنابراین برای شما پیام خطایی ارسال می کند.)
تأثیرات اولین جمله فوق بیان پارامتر c ، مشخص کردن دامنه (i,j) و تهیه متن مستندات است. عبارت دوم به (c(i,j محصول مقادیر پارامترهای( f و d (i,j اختصاص یافته است. طبعاً ، این شیوه فقط در صورتی در گمز قانونی است که قبلاً مقادیری را به (f و d (i,j در عبارت های قبلی اختصاص داده باشید.
تخصیص مستقیم بالا به همه جفت های (i,j) در دامنه ی c اعمال می شود. اگر می خواهید مقادیری را به عناصر خاصی در این دامنه تخصیص دهید، باید اسامی عناصر را در داخل نقل قول محصور کنید. مثلاً
یک عبارت تخصیص دهی معتبر در گمز است.
به همان پارامتر می توان بیش از یک بار مقداری را اختصاص داد. هر عبارت تخصیص بلافاصله اجرا می شود و بر مقادیر قبلی ترجیح داده می شود. (در مقابل، همین پارامتر ممکن نیست که بیش از یک بار بیان شده باشد. این امر در گمز به خطا منجر می شود؛ تا شما را از استفاده تصادفی از یک نام برای دو چیز متفاوت باز دارد).
سمت راست عبارت تخصیص می تواند شامل انواع زیادی از عبارات ریاضی و توابع داخلی باشد. اگر با یک زبان برنامه نویسی علمی مانند C آشنایی داشته باشید، هیچ مشکلی نخواهید داشت و به راحتی می توانید عبارت های تخصیص دهنده را در GAMS بنویسید. (با این حال ، توجه کنید که گمز دارای کارآمدی هایی است که در Cوجود ندارد. برای مثال ، ما توانستیم مقادیر (c (i,j را برای همه جفت های (i ، j) بدون ایجاد “حلقه” اختصاص دهیم.
عملکردهای استاندارد گمز و توابع ارائه شده بعداً ارائه می شود. در اینجا چند نمونه از تخصیص های معتبر آورده شده است. در همه موارد ، فرض کنید پارامتر سمت چپ قبلاً بیان شده است و به پارامترهای سمت راست قبلاً مقادیری را در عبارت های قبلی اختصاص یافته اند.
عملگرهای جمع و ضرب که بعداً معرفی می شوند؛ را می توان در تخصیص دادن به طور مستقیم استفاده کرد.
متغیرها
متغیرهای تصمیم گیری (یا متغیرهای درون زا) یک مدل بیان شده ی گمز باید با عبارت Variables بیان شوند. به هر متغیر یک نام، یک دامنه در صورت نیز و (اختیاری) یک متن اختصاص داده می شود. مدل حمل و نقل شامل عبارت Variables های زیر است.
این عبارت منجر به بیان متغیر حمل و نقل برای هر جفت (i,j) می شود. (در فصل معادلات خواهید دید که چگونه گمز می تواند وضعیت معمولی در دنیای واقعی را کنترل کند که در آن فقط یک زیر مجموعه از جفت های (i,j) برای حمل و نقل مجاز است.)
متغیر z بدون دامنه بیان می شود زیرا این یک کمیت اسکالر است. هر مدل بهینه سازی گمز باید یک متغیر از این دست داشته باشد تا به عنوان کمیت مینیمم شده یا ماکسیمم شده؛ استفاده شود.
پس از بیان، به هر متغیر باید یک نوع اختصاص داده شود. فهرست انواع مجاز مقدار های قابل اختصاص یابی در جدول ۳ آمده است. برای لیست کامل، به بخش انواع متغیرها مراجعه کنید.
جدول ۳: انواع متغیرهای مجاز برای اختصاص یابی
نوع متغیر | محدوده مجاز برای متغیر |
آزاد (پیشفرض) | تا |
مثبت | ۰ تا |
منفی | تا ۰ |
باینری | ۰ یا ۱ |
عدد صحیح | ۰,۱,…,۱۰۰ (پیش فرض) |
متغیری که به عنوان کمیتی برای بهینه سازی استفاده می شود باید اسکالر باشد و از نوع آزاد باشد. در مثال حمل و نقل ما ، z به طور پیش فرض آزاد نگه داشته می شود ، اما x(i,j) توسط عبارت زیر محدود به متغیرهای مثبت شده است.
توجه داشته باشید که دامنه x در اختصاص دادن نوع متغیر، نباید تکرار شود. به همه ورودی های دامنه به طور خودکار باید یک نوع متغیر یکسان اختصاص داده شود.
بخش پایگاه داده .lo- .l – .up – .m نحوه اختصاص کران های پایین ، کران های بالا و مقادیر اولیه به متغیرها را شرح می دهد.
معادلات
قدرت زبانهای مدل سازی جبری مانند گمز در ایجاد معادلات و نامعادلاتی مشهود است که مدل در دست ساخت را تشکیل می دهند. دلیلش این است که هر زمان که گروهی از معادلات یا نامعادلات دارای ساختار جبری یکسان باشند؛ تمام اعضای گروه به طور هم زمان ایجاد می شوند، نه به صورت جداگانه.
بیان معادلات
معادلات باید در بیانیه های جداگانه معرفی و تعریف شوند. فرمت بیان معادلات همانند سایر واحدهای گمز است. ابتدا واژه کلیدی، Equations در این مورد می آید و پس از آن نام، دامنه و متن یک یا چند گروه از معادلات یا نامعادلات اعلام می شود. در مدل حمل و نقل ما، بیان معادله به شرح زیر است:
به خاطر داشته باشید که کلمه Equation در گمز معنای گسترده ای دارد. این روابط هم معادلات و هم نامعادلات را در بر می گیرد و معادله گمز با یک نام واحد می تواند به یک یا چند مورد از این روابط اشاره داشته باشد. به عنوان مثال، متغیر هزینه (Cost) دامنه ندارد؛ بنابراین یک معادله واحد است، اما عرضه (Supply) به مجموعه ای از نامعادله های تعریف شده در دامنه i اشاره دارد.
نماد جمع و ضرب GAMS
قبل از شروع به تعریف معادله، نماد جمع را در GAMS شرح می دهیم. به یاد داشته باشید که GAMS برای صفحه کلیدهای استاندارد و خوانندگان ورودی خط به خط طراحی شده است، بنابراین امکان استفاده از علائم ریاضی استاندارد برای جمع بندی امکان پذیر نیست (و همچنین برای کاربر راحت نخواهد بود).
نماد جمع در گمز می تواند برای عبارات ساده و پیچیده استفاده شود. فرمت براساس این ایده است که همیشه به عنوان یک اپراتور با دو استدلال به جمع بندی فکر می کنیم: (Sum(index of summation, summand یک کاما این دو آرگومان را از هم جدا می کند، و اگر اولین آرگومان به کاما نیاز داشته باشد، باید در پرانتز قرار بگیرد. استدلال دوم می تواند هرگونه بیان ریاضی از جمله جمع بندی دیگر باشد.
به عنوان یک مثال ساده؛ مسئله حمل و نقل شامل بیان زیر است:
که این عبارت معادل است با:
جمع کمی پیچیده تر به صورت مثال زیر بیان می شود:
که معادل است با:
آخرین بیانی که می توان به عنوان جمع تودر تو نوشت؛ در زیر آورده ایم:
در بخش عملیات فهرست بندی شده ی مشروط، ما چگونگی استفاده از اپراتور دلار را برای اعمال محدودیت در اپراتور جمع بندی توضیح می دهیم تا فقط عناصر i و j که شرایط مشخص را برآورده می کنند؛ در عبارت کلی جمع شوند.
ضرب نیز با استفاده از دقیقاً همان فرمت جمع بندی در گمز تعریف می شوند و عبارت Sum با Prod. جایگزین می شود؛
که معادل عبارت ریاضی می باشد.
عملگرهای جمع و ضرب را می توان در عبارت های تخصیص مستقیم برای پارامترها به کار گرفت. برای مثال:
تعریف معادلات
تعاریف معادله پیچیده ترین عبارات در گمز از نظر تنوع آنهاست. اجزای تعریف معادله به ترتیب عبارتند از:
۱- نام معادله ی تعریف شده است
۲- دامنه
۳- شرط محدودیت دامنه (اختیاری)
۴- علامت ‘..’
۵ -بیان سمت چپ
۶- اپراتور رابطه ای: =l= ، =g=، =e= یا دیگران. برای دریافت لیست کامل، به جدول انواع معادلات مراجعه کنید.
۷- بیان سمت راست
مثال حمل و نقل شامل سه مورد از این عبارت ها است.
در این بخش چند نکته وجود دارد که بهتر است به خاطر بسپارید:
قدرت ایجاد معادله چندگانه با یک عبارت گمز تنها توسط دامنه کنترل می شود. به عنوان مثال، تعریف محدودیت تقاضا منجر به ایجاد یک محدودیت برای هر عنصر دامنه j خواهد شد، که در گزیده زیر از خروجی گمز نیز نشان داده شده است.
ایده اصلی در اینجا آن است که تعریف محدودیت های تقاضا دقیقاً یکسان است چه بخواهیم نمونه ای کوچک مانند مثال بالا حل کنیم و چه مسئله ای از دنیای واقعی با بیش از ۲۰٫۰۰۰ گره در دست داشته باشیم؛ در هر دو صورت، کاربر فقط یک معادله عمومی را به صورت جبری و وارد می کند، و GAMS معادلات خاصی را که برای نمونه ی مدل مناسب است، ایجاد می کند. (با استفاده از برخی بسته های بهینه سازی دیگر، چیزی مانند خلاصه فوق بخشی از ورودی خواهد بود نه خروجی.)
در بسیاری از مسائل در دنیای واقعی، برخی از اعضای یک دامنه ی معادلات به دلیل برخی از استثنائات، باید از الگوی دیگران حذف شود. گمز می تواند با استفاده از ویژگی قدرتمند موسوم به دلار یا اپراتور “such-that” که در اینجا نشان داده نمی شود، این افت ساختار را به راحتی جبران کند. ویژگی محدودیت دامنه می تواند برای حفظ اندازه یک مدل در دنیای واقعی در محدوده قابلیت حل شدن، کاملاً ضروری باشد.
عملگرهای رابطه ای دارای این معانی هستند:
= l = کمتر یا مساوی با
= g = بزرگتر یا مساوی است
= e = برابر است با
درک تفاوت بین نمادهای “=” و “= e =” مهم است. نماد “=” فقط در تخصیص دادن مستقیم استفاده می شود و نماد “= e =” فقط در تعاریف معادله استفاده می شود. این دو متن بسیار متفاوت هستند. یک تخصیص مستقیم قبل از فراخوانی حل کننده، مقدار مطلوب را به پارامتر می دهد. یک تعریف معادله همچنین یک رابطه مطلوب را توصیف می کند، اما تا زمانی که حل کننده معادله فراخوانی نشود، برآورده نمی شود. به این ترتیب تعاریف معادله باید متغیرها را شامل شوند ولی تخصیص های مستقیم نباید متغیرها را شامل شوند.
متغیرها می توانند در سمت چپ یا راست یک معادله یا هر دو ظاهر شوند. یک متغیر می تواند بیش از یک بار در یک معادله ظاهر شود. پردازنده گمز به طور خودکار قبل از فراخوانی حل کننده، معادله را به فرم استاندارد معادل آن (متغیرها در سمت چپ ، بدون ظهور متغیر تکراری) تبدیل می کند.
تعریف معادله ممکن است در هر نقطه از ورودی GAMS ظاهر شود، معادله و کلیه متغیرها بیان می شود، همچنین پارامترهایی که قبلاً بیان شده اند نیز در معادله می توانند ظاهر شوند. (توجه داشته باشید که می توان به پارامتر ظاهر شده در معادله پس از تعریف، یک مقدار اختصاص داده شود و یا مجدداً مقدار دیگری به آن اختصاص داده شود. این موضوع در هنگام اجرای چندین مدل با یک ورودی گمز مفید است.) این معادلات لازم نیست به همان ترتیب تعریف شوند.
تابع هدف
این فقط یک یادآوری است تا بدانید گمز هیچ نهاد صریح و مشخصی به نام تابع هدف ندارد. برای مشخص کردن عملکرد بهینه سازی شده، شما باید یک متغیر ایجاد کنید که آزاد باشد (بدون محدودیت در علامت) و مقدار اسکالر دارد (جهت ندارد) و در تعریف معادله ظاهر می شود که آن را با تابع هدف معادل می کند.
عبارت های حل معادله و مدل
کلمه Model در گمز معنای بسیار دقیقی دارد. مدل فقط مجموعه ای از معادلات است. مانند سایر اشیاء گمز، باید در یک عبارت نامی به آن داده شود. فرمت بیان، کلیدواژه مدل است که نام آن را به دنبال می آورد و پس از آن لیستی از اسامی معادله محصور در اسلش ها قرار می گیرد. اگر قرار است کلیه معادلات تعریف شده در آن گنجانده شود ، می توانید به جای لیست صریح ، / All / را وارد کنید. در مثال ما ، یک عبارت مدل وجود دارد:
این عبارت ممکن است اضافی به نظر برسد ، اما برای کاربران پیشرفته ای که ممکن است چندین مدل را در یک اجرای گمز ایجاد کنند، مفید است. اگر بخواهیم به جای میانبر / All / از لیست صریح استفاده کنیم ، عبارت به صورت زیر نوشته می شود:
دامنه ها از لیست حذف می شوند زیرا بخشی از نام معادله نیستند. گزینه لیست هنگامی استفاده می شود که زیرمجموعه معادلات موجود فقط شامل یک مدل خاص (یا مدل فرعی) باشد.
پس از اعلام یک مدل و معادلات مشخص شده، ما آماده فراخوانی حل کننده معادله هستیم. این کار با یک عبارت solve انجام می شود، که در مثال ما به صورت نوشته شده است:
فرمت عبارت solve به صورت زیر است:
۱-کلیدواژه solve
۲- نام مدلی که باید حل شود
۳- کلیدواژه using
۴- یک روش راه حل موجود. لیست کاملی در زیر آورده شده است. برای جزئیات بیشتر ، به بخش طبقه بندی مدل ها مراجعه کنید.
راه حل | شرح |
۱p | برای برنامه نویسی خطی |
qcp | برای برنامه نویسی محدودیت درجه دوم |
n1p | برای برنامه نویسی غیرخطی |
dn1p | برای برنامه نویسی غیرخطی با مشتقات غیر خطی |
mip | برای برنامه نویسی عدد صحیح مختلط |
rmip | برای برنامه نویسی عدد صحیح آرام |
miqcp | برای برنامه نویسی محدودیت درجه چهار عدد صحیح |
rmiqcp | برای برنامه نویسی محدودیت عدد صحیح آرام عدد صحیح |
minlp | برای برنامه نویسی غیرخطی عدد صحیح مختلط |
rminlp | برای برنامه نویسی غیر خطی عدد صحیح مختلط آرام |
mcp | برای مسائل مکمل مختلط |
mpec | برای برنامه های ریاضیاتی با محدودیت های تعادلی |
rmpec | برای برنامه های ریاضیاتی آرامش با محدودیت های تعادل |
Cns | برای سیستم های غیر خطی محدود شده |
emp | برای برنامه نویسی ریاضیاتی تمدید شده |
۵- کلیدواژه Minimizing یا Maximizing
۶- نام متغیری که باید بهینه شود.
نمایش عبارت ها
عبارت solve باعث می شود که در هنگام اجرا چندین اتفاق رخ دهد. نمونه خاص مدل ایجاد می شود، ساختار داده های مناسب برای وارد کردن این مسئله به حل کننده ایجاد می شود ، حل کننده فراخوانی می شود و خروجی حاصل از حل کننده در یک فایل پرینت می شود. برای به دست آوردن مقادیر بهینه از متغیرهای اولیه و / یا دوگانه، می توانیم به خروجی حل کننده نگاه کنیم، یا در صورت تمایل می توانیم به گمز درخواست بدهیم تا این نتایج را نمایش دهد. مثال ما حاوی جمله زیر است:
که برای چاپ سطوح نهایی x.1 و هزینه های حاشیه ای (یا کاهش یافته)، x.m متغیرهای حمل و نقل، x(i,j) فراخوانی می شود. گمز به صورت اتوماتیک این نتیجه چاپی را به فرمت های جداول چندبعدی با عناوین مناسب در می آورد.
پایگاه داده .lo ، .l، .up ، .m
گمز با یک سیستم پایگاه داده ی کوچک طراحی شده است که در آن سوابق برای متغیرها و معادلات حفظ می شوند. مهمترین زمینه در هر پرونده عبارتند از:
.lo کران پایین
.l سطح یا مقدار اولیه
up. کران بالا
.m مقدار حاشیه ای یا دوگانه
فرمت برای ارجاع این کمیتها، متغیر یا نام معادله است که به دنبال آن نام متغیر یا معادله آمده است ، و (در صورت لزوم) توسط دامنه (یا عنصری از دامنه) دنبال می شود.
گمز به کاربر اجازه می دهد که به خواندن و نوشتن کامل در پایگاه داده دسترسی داشته باشد. این ممکن است اکنون برای شما قابل توجه به نظر نرسد، اما می تواند به یک ویژگی قابل توجه در استفاده پیشرفته تبدیل شود. چند نمونه از استفاده از پایگاه داده در زیر آمده است.
اختصاص کران ها و / یا مقادیر اولیه متغیر
کران های پایین و بالای یک متغیر به طور خودکار با توجه به نوع متغیر (بی علامت، مثبت ، منفی ، باینری یا عدد صحیح) تنظیم می شود ، اما این مرزها ممکن است توسط کاربر گمز نادیده گرفته شود. برخی مثال ها در ادامه آمده است.
در مثالهای اول و سوم فرض بر این است که ظرفیت (i,j) پارامتری است که قبلاً مقادیر آن اعلام شده و اختصاص یافته است. این عبارت ها باید بعد از بیان متغیر و قبل از عبارت Solve ظاهر شوند. تمام عبارات ریاضیاتی موجود برای تخصیص دادن مستقیم در سمت راست قابل استفاده است.
در برنامه نویسی غیرخطی برای مدل ساز بسیار مهم است که با مشخص کردن دامنه محدود بین کران پایین و بالا ، به حل کننده معادله کمک کند. همچنین مشخص کردن راه حل اولیه که حل کننده می تواند از آن نقطه، جستجوی مطلوب را شروع کند، بسیار مفید خواهد بود. به عنوان مثال ، در یک مدل موجودی محدود ، متغیرها کمیت (i) هستند و مشخص است که راه حل بهینه برای نسخه غیرمحدود مسئله پارامتری به نام eoq (i) است. به عنوان حدسی برای بهینه ی مسئله محدود شده ای که داریم؛ وارد می کنیم:
(سطح اولیه پیش فرض صفر است مگر اینکه صفر در محدوده محدود باشد ، در این صورت آن نزدیکترین صفر به صفر است.)
درک این نکته مهم است که زمینه های .lo و .up کاملاً تحت کنترل کاربر GAMS هستند. در مقابل ، زمینه های .l و .m در ابتدا می توانند توسط کاربر اولیه شوند اما سپس توسط حل کننده کنترل می شوند.
تحول و نمایش مقادیر بهینه
(از این بخش در صورت تمایل می توانید عبور کنید.)
پس از فراخوانی بهینه ساز از طریق عبارت solve، مقادیر محاسبه شده برای متغیرهای اصلی و دوگانه در پایگاه داده در فیلدهای .l و .m قرار می گیرد. سپس می توانیم این نتایج را بخوانیم و آنها را به عبارات گمز تبدیل کرده و نمایش دهیم.
به عنوان مثال ، در مسئله حمل و نقل ، فرض کنید می خواهیم درصد تقاضای هر بازار را که توسط هر کارخانه پر می شود ، بدانیم. بعد از عبارت solve، ما عبارت زیر را وارد می کنیم:
ارسال این دستورات به ورودی اصلی مسئله ی حمل و نقل منجر به خروجی زیر می شود:
برای مثال با در نظر گرفتن حاشیه، ما به طور خلاصه محدودیت های نسبی را در نظر می گیریم؛ که معمولاً در مسئله های ترکیب و پالایش ظاهر می شوند. این مدل های برنامه نویسی خطی معمولاً با تعیین مقدار بهینه هر یک از چندین ماده اولیه موجود، آنها را در هر یک از چندین محصول نهایی مورد نظر قرار می دهند. فرض کنید y(i,j) متغیر تعداد تن های مواد اولیه i باشد که در محصول نهایی j قرار داده شده است. فرض کنید محدودیت نسبی این است که هیچ محصولی نمی تواند از بیش از ۲۵ درصد از یک ماده تشکیل شود، یعنی برای تمامی i و jها:
برای این که خطی بودن مدل حفظ شود؛ محدودیت به جای آن که صریحاً به عنوان یک نسبت نوشته شود؛ به صورت زیر نوشته می شود:
مسئله اینجاست که نسبت.m(i,j) ؛ مقدار حاشیه ای که با شکل خطی محدودیت همراه است ، معنای ذاتی ندارد. در بهینه سازی، این به ما می گوید که حداکثر چقدر می توانیم از آرامش محدودیت خطی سود ببریم
متأسفانه ، این محدودیت آرامش از اهمیت واقعی برخوردار نیست. محدودیتی که در آرامش ما به آن علاقه مند هستیم، شکل غیر خطی محدودیت نسبت است. به عنوان مثال ، ما می خواهیم از سود حاشیه ای ناشی از تغییر محدودیت نسبی مطلع شویم
ما در واقع می توانیم با وارد کردن تغییر زیر در حاشیه های ناخواسته، حاشیه های مورد نظر را بدست آوریم:
توجه کنید که عبارت تخصیص برای amr به سوابق .m و .l از پایگاه داده دسترسی دارد. ایده پشت تبدیل ، توجه به این است که:
برابر است با
خروجی گمز
خروجی پیش فرض اجرای گمز؛ گسترده و آموزنده است. برای یک بحث کامل، به فصل خروجی گمز مراجعه کنید. این آموزش در مورد خروجی تا حدی به شرح زیر است:
- چاپ اکو
- نقشه های مرجع
- گزارش وضعیت
- پیغام خطا
- آمار مدل
- گزارش های راه حل
نگرانی های غیر ضروری زیادی با مطالعه ی کتاب ها کتابچه های آموزش کاربر ایجاد شده است که به خواننده این تصور غلط را می دهد که استفاده بی عیب و نقص از نرم افزارهای پیشرفته باید برای هر فرد زنده ای آسان باشد. اما بدانید که برای مثال گمز به صورتی طراحی شده است که حتی با تجربه ترین کاربران را نیز ممکن است دچار خطا کند. گمز تلاش می کند خطاها را در اسرع وقت مرتفع کرده و پیامدهای آنها را به حداقل برساند.
چاپ اکو
این که آیا خطاها از حل مشکل بهینه سازی شما جلوگیری می کنند یا خیر ، اولین بخش خروجی حاصل از اجرای GAMS اکو یا کپی کردن از پرونده ورودی شما است. به خاطر مرجع آینده ، GAMS شماره های خط را در سمت چپ اکو قرار می دهد. برای مثال حمل و نقل ما ، که خوشبختانه هیچ خطایی نداشته است ، چاپ echo به شرح زیر است:
دلیل این که چاپ اکو به جای خط شماره ۱، از خط شماره ۲ شروع می شود، آن است که فایل ورودی حاوی یک عبارت dollar-print-control است. این نوع دستورالعمل چاپ خروجی را کنترل می کند ، اما از آنجا که هیچ ارتباطی با تعریف مدل بهینه سازی ندارد ، از اکو حذف می شود. کنترل های چاپ دلار باید در ستون ۱ شروع شوند.
عبارت $title باعث می شود که متن بعدی در بالای هر صفحه خروجی چاپ شود. سایر دستورالعمل های موجود در فصل گزینه های کنترل دلار آمده است.
پیام های خطا
زمانی که کامپایلر گمز با خطایی در فایل ورودی مواجه می شود ، یک پیام خطای رمزگذاری شده را درون چاپ اکو روی خط وارد می کند که بلافاصله پس از وقوع خطا ظاهر می شود. این پیام ها همیشه با **** شروع می شوند و حاوی “$” هستند که مستقیماً در زیر نقطه ای قرار می گیرد که کامپایلر فکر می کند خطایی روی داده است. به دنبال علامت $ کد خطای عددی آورده می شود که پس از چاپ اکو توضیح داده می شود. چندین نمونه از این مورد در ادامه آمده است.
مثال۱ وارد کردن عبارت
نتایج در اکو به صورت زیر است:
در این مورد، کامپایلر گمز نشان می دهد که یک مورد خطا در جمع عناصر مجموعه رخ داده است. در انتهای نقطه پرینت، تفسیر کد خطای ۱۶۰ مشاهده می شود:
مسئله این است که sos1 یک کلمه رزرو شده است که به طور کلی نمی توان از آن به عنوان شناسه (مشخص کننده) استفاده کرد. لیست کامل کلمات رزرو شده در این فصل نشان داده شده است. بنابراین عنصر مجموعه ما باید یک نام منحصر به فرد مانند “summer” داشته باشد. این یک خطای رایج مبتدیان است.
مثال ۲: خطای رایج دیگر حذف یک سمیکالون قبل از تخصیص مستقیم یا تعریف معادله است. در مثال حمل و نقل، فرض کنید که ما سمیکالون قبل از تخصیص c(i,j) را به شرح زیر حذف کنیم:
خروجی حاصل به شرح زیر خواهد بود:
مشاهده می کنید که یک خطای کوچک مانند فراموش کردن یک سمیکالون؛ به ایجاد ۵ پیام خطای طولانی و ترسناک شده است. درس اول آن است که بر روی رفع اولین خطا تمرکز کنید و پیام های دیگر را نادیده بگیرید! اولین خطای شناسایی شده (در خط ۱۷) ، کد ۹۷، نشان می دهد که گمز فکر می کند که نمادهای موجود در خط ۱۷ ادامه متن مستندات انتهای خط ۱۶ است؛ نه یک تخصیص مستقیم که در نظر داشتیم ایجاد کنیم. پیام خطا نیز به درستی به ما توصیه می کند که خط قبلی را بررسی کنید زیرا احتمالاً یک علامت کوچک را فراموش کرده اید.
متأسفانه ، همیشه نمی توانید انتظار داشته باشید که پیامهای خطا بتوانند توصیفی دقیقی از اشتباهات شما باشند. کامپایلر نمی تواند ذهن شما را بخواند. در بعضی مواقع، در درک اهداف شما ناکام می ماند، بنابراین با چیدن سرنخ هایی که در خروجی گمز وجود دارد، سعی کنید دلایل خطاها را تشخیص دهید. به عنوان مثال،سمیکالون جا افتاده را می توانید با جستجوی ورودی c در لیست مرجع متقاطع (در بخش بعدی توضیح داده می شود) مشخص کنید و متوجه می شوید که تخصیص c اصلاً انجام نشده است.
مثال ۳٫ بسیاری از خطاها صرفاً با اشتباهات املایی ایجاد می شوند و قبل از آسیب زدن به کل برنامه؛ پیدا می شوند. به عنوان مثال ، با بیان “Seatle” که در ابتدای معرفی پارامتر به صورت “Seattle” آمده است، پیام خطای زیر را دریافت می کنیم:
مثال ۴٫ مشابهاً؛ اگر به اشتباه به جای b(j) عبارت dem(j) را به عنوان سمت راست محدوده ی تقاضا وارد کنیم؛ نتیجه به شکل زیر است:
مثال ۵٫ مثال بعدی یک خطای ریاضیاتی است؛ که بعضی اوقات توسط مدل سازان تازه کار انجام می شود و گمز در شکار خطاهای این چنینی مهارت خاصی دارد. جمله زیر از نظر ریاضی متناقض بوده و از این رو جمله ای قابل تفسیر نیست.
در این معادله دو خطا وجود دارد که هر دو مربوط به کنترل اندیس ها هستند. محدوده مشخص شده برای اندیس i بیش از حد کنترل شده و اندیس j کنترل نشده است.
مشاهده می شود که اندیس i مرتبه های متناقضی می گیرد. وقتی عبارت برای همه ی i ها مطرح می شود، با قرار دادن هر عددی به جای i معادله باید ثابت بماند. اما وقتی به عنوان اندیس جمع ظاهر می شود؛ مقدارهای متفاوتی ایجاد می کند. به این ترتیب در این جمله تناقض ایجاد می شود. از طرف دیگر ، اندیس j به هیچ وجه کنترل نمی شود ، بنابراین ما به هیچ طریقی نمی توانیم بدانیم که از کدام یک از مقادیر احتمالی آن باید استفاده کنیم.
اگر این معادله بی معنا را در گمز وارد کنیم، خطا به درستی تشخیص داده می شود:
اطلاعات بیشتر در مورد خطاها را می توانید در بخش گزارش خطاها مطالعه کنید. تشخیص جامع خطا و پیام های خطایی که به خوبی طراحی شده باشد، کمک زیادی به اجرای سریع و صحیح مدل ها می کند.
نقشه های مرجع
بخش بعدی از خروجی ، که در صورت شناسایی خطاها، آخرین مورد است، یک جفت نقشه مرجع است که شامل خلاصه ها و تجزیه و تحلیل فایل ورودی به منظور اشکال زدایی و مستندسازی می باشد.
اولین نقشه مرجع، نقشه مرجع متقاطع cross-reference map است که در بیشتر کامپایلرهای مدرن وجود دارد. این نقشه؛ یک لیست الفبایی، متشکل از همه واحدها (مجموعه ها ، پارامترها ، متغیرها و معادلات) از مدل است. این لیست نوع هر بخش و یک مرجع رمزگذاری شده را برای هر یک از بخش های موجود در ورودی نشان می دهد. نقشه مرجع متقاطع برای نمونه حمل و نقل ما به شرح زیر است (همه جدول ها را نمایش نمی دهیم). برای مشاهده ی نقشه مرجع، لطفاً خط را به مدل خود اضافه کنید
به عنوان مثال ، لیست مرجع متقاطع به ما می گوید که نماد a یک پارامتر است که در خط ۹ معرفی شده، مقدار مربوط به آن در خط ۱۰ تخصیص داده شده است و در خط ۴۲ به آن اشاره شده است. نماد i در جدول مرجع متقاطع دارای ورودی پیچیده تری است. نشان داده شده است که i در خط ۵ بیان و تعریف شده است. یک بار در سطرهای ۱۰ ، ۱۹ ، ۲۶ ، ۲۸ ، ۳۱ ، ۳۸ ، ۴۵ به ارجاع داده شده است و در خطوط ۴۱ و ۴۳ نیز دو بار به آن اشاره شده است. مجموعه i همچنین در خط ۲۸ به عنوان شاخص کنترل در معادله جمع، درخط ۴۱ برای تعریف معادله و در خط ۴۵ برای اختصاص دادن مستقیم پارامتر استفاده شده است.
برای تازه کاران گمز ، تجزیه و تحلیل دقیق لیست مرجع متقابل ممکن است مهم نباشد. شاید به احتمال زیاد سودی که وی از نقشه های مرجع می برد؛ کشف یک آیتم ناخواسته است که به دلیل خطای نگارشی وارد مدل شده است.
بخش دوم نقشه مرجع لیستی از آیتم های مدل است که براساس نوعشان گروه بنده شده و همراه با متن مستند مرتبط با آنها فهرست شده اند. به عنوان مثال ، این لیست به شرح زیر است.
فهرست کردن معادله ها
هنگامی که در ساختن یک فایل ورودی عاری از خطاهای تلفیقی موفق شدید، گمز قادر به تولید یک مدل است. تنها یک سؤال باقی مانده است که فقط شما می توانید به آن پاسخ دهید ، آیا گمز الگوی مورد نظر شما را تولید می کند؟
لیست کردن معادلات احتمالاً بهترین وسیله برای بررسی این سوال بسیار مهم است. حاصلی که از دستور solve به دست می آید، لیست معادلات؛ نمونه خاص مدل را نشان می دهد که وقتی مقادیر فعلی مجموعه ها و پارامترها به فرم جبری عمومی مدل وارد می شوند، ایجاد شده است. به عنوان مثال ، محدودیت تقاضای عمومی که در فایل ورودی برای مدل حمل و نقل ارائه شده است، به صورت زیر است:
در حالی که فهرست معادلات محدودیت های خاص در زیر آمده است:
خروجی پیش فرض، ماکزیمم سه معادله خاص برای هر معادله عمومی است. برای تغییر پیش فرض، یک عبارت ورودی را پیش از عبارت solve وارد کنید:
که در آن r عددی دلخواه است.
خروجی پیش فرض همچنین شامل بخشی است که فهرست ستون نامیده می شود و مشابه لیست معادلات است که در آن ضرایب سه متغیر خاص را برای هر متغیر عمومی نشان می دهد. این لیست به ویژه برای تأیید مدل گمز که قبلاً در قالب MPS پیاده سازی شده بود، بسیار مفید خواهد بود. برای تغییر تعداد پیش فرض چاپهای یک ستون خاص در هر متغیر عمومی، دستور بالا را می توانید بسط بدهید:
که در آن c تعداد ستون مورد نظر است. (تنظیم limrow و limcol روی ۰ راهی مناسب برای کاهش اندازه اولین فایل شما، پس از رفع اشکال در مدل تان است.) در مدلهای غیرخطی، لیست معادلات گمز تقریب های مرتبه اول تیلور از معادلات غیرخطی را نشان می دهد. تقریب ها با مقادیر شروع متغیرها گرفته می شوند.
داده های آماری مدل
آخرین بخش خروجی که گمز قبل از فراخوانی حل کننده تولید می کند، گروهی از داده های آماری مربوط به اندازه مدل است، که در زیر نیز برای مثال حمل و نقل نشان داده شده است.
اعدادBLOCK به تعداد معادلات عمومی و متغیرها اشاره دارد. اعداد SINGLE به ردیف ها و ستون های فردی در نمونه خاصی که تولید می شود؛ اشاره دارد. برای مدل های غیرخطی ، برخی اطلاعات آمار دیگر برای توصیف میزان عدم خطی بودن در مسئله؛ ارائه شده است.
گزارش وضعیت
بعد از اجرای حل کننده ، گمز Solve Summary (خلاصه حل) را چاپ می کند که دو تا از مهم ترین ورودی های آن SOLVER STATUS و MODEL STATUS است. برای مسئله حمل و نقل ما خلاصه ی حل به شرح زیر است:
نقاط واحد ‘.’ در خروجی نشان دهنده صفرها است. ورودی EPS ، که مخفف epsilon (اپسیلون) است، به معنای بسیار کوچک اما غیرصفر می باشد. در این حالت، EPS نشان دهنده تباهیدگی است. (متغیر کمبود برای محدودیت عرضه سیاتل در پایه در سطح صفر است. عبارت حاشیه ای به جای صفر با EPS مشخص شده است تا آغاز بهینه سازی مجدد از مبنای قدیمی را تسهیل کند.)
اگر نتایج حل کننده ها شامل مواردی چون هزینه های نشدنی یا حاشیه ای با علامت های اشتباه باشد، ورودی های خطا به ترتیب با INFES یا NOPT مشخص می شوند. اگر مسئله بدون کران بندی پایان یابد؛ سطرها و ستونهای مربوط به خط نهای با عبارت UNBND مشخص می شوند.
در پایان گزارش راه حل حل کننده ها؛ گزارش بسیار مهمی است که جمع آوری تعداد کل سطرها و ستونهای غیر بهینه، نشدنی و بدون کران بندی را نشان می دهد. برای مثال ما ، خلاصه گزارش ، تمام موارد صفر را به دلخواه نشان می دهد.
پس از نوشتن گزارش حل کننده ، کنترل از حل کننده به گمز برگردانده می شود. تمام سطوح و حاشیه های به دست آمده توسط حل کننده در قسمت های .l و .m پایگاه داده گمز وارد می شوند. این مقادیر می توانند در هر گزارش دلخواه تغییر یافته و نمایش داده شوند. همانطور که قبلاً اشاره شد، کاربر صرفاً مقادیر نمایش داده شده را لیست می کند و گمز بطور خودکار یک آرایه مناسب را تشکیل داده و برچسب گذاری می کند. به عنوان مثال ، عبارت ورودی:
منجر به خروجی زیر می شود:
همانطور که در نقشه های مرجع ، لیست معادلات ، گزارش های راه حل و نمایشگرهای اختیاری مشاهده می شود، گمز متن مستند را ذخیره می کند.
خلاصه
این آموزش چندین ویژگی طراحی گمز را نشان داده است که شما را قادر می سازد مدلهای بهینه سازی عملی را به روشی سریع و مؤثر بسازید. بحث زیر مزایای استفاده از یک زبان مدل سازی جبری مانند گمز را در مقابل ژنراتور ماتریس یا حل کننده محاوره ای خلاصه می کند.
- با استفاده از یک نماد مبتنی بر جبر، همان طور که به آسانی می توانید یک مدل بهینه سازی را برای شخص دیگری که ریاضی بلد است، توصیف کنید؛ می توانید آن را برای یک کامپیوتر توصیف کنید.
- از آنجا که توصیف جبری از یک مسئله، عمومیت و کلیت دارد، بسیاری از عبارات در یک مدل گمز در صورت بروز موارد جدیدی از مسائل مشابه یا مرتبط با آنها، قابل استفاده هستند. این امر به ویژه در محیط هایی که مدل ها مدام در حال تغییر هستند بسیار مهم است.
- در وقت خود صرفه جویی می کنید و خطاهای تولید شده را با ایجاد مجموعه ای از محدودیت های نزدیک به هم در یک عبارت؛ کاهش می دهید.
- شما می توانید در زمان صرفه جویی کرده و با ارائه فرمول هایی برای محاسبه داده ها به جای وارد کردن صریح آنها، خطاهای ورودی را کاهش دهید.
- یک مدل؛ خود مستند ساز است. از آنجایی که می توان وظایف توسعه مدل و مستندسازی مدل را به طور هم زمان انجام داد، مدل ساز بسیار محتاط است که صحت مستندات را به روز نگه دارد.
- خروجی گمز برای خواندن و استفاده آسان است. گزارش راه حل از حل کننده به طور خودکار بازنویسی می شود تا معادلات و متغیرهای مرتبط با هم گروه بندی شده و به طور مناسب برچسب گذاری شوند. همچنین، فرمان display به شما امکان می دهد نتایج را بسیار آسان تغییر داده و جدول بندی کنید.
- اگر مشغول تدریس یا یادگیری مدل سازی هستید ، می توانید از تأکیدکامپایلر گمز بر این موضوع که هر معادله از نظر ریاضی باید سازگار باشد؛ استفاده کنید. حتی اگر شما یک مدل ساز و طراح با تجربه باشید، صدها روش شناسایی خطا؛ می تواند زمان توسعه ی مدل را برای شما به شدت کاهش دهد.
- با استفاده از عملگر dollar و سایر ویژگی های پیشرفته ای که در این آموزش مطرح نکردیم، می توان مدل های در مقیاس بزرگ را به طور مؤثری پیاده سازی کرد. برنامه های کاربردی ویژه عملگر دلار شامل موارد زیر می باشد:
۱- می تواند محدودیت های منطقی را در ترکیب های مجاز اندیس ها برای متغیرها و معادلات موجود در مدل اعمال کند. از این طریق می توانید ردیف ها و ستون های غیر ضروری را جدا کرده و اندازه مسئله را در محدوده قابل حل نگه دارید.
۲- می توان از آن برای ساخت خلاصه ها و محصولات پیچیده استفاده کرد که از این طریق می توان در معادلات یا گزارش های سفارشی استفاده کرد.
۳- می توان برای صدور پیام های هشدار دهنده یا برای خاتمه دادن به شرایط ویرایش داده های متنی خاص پیش از موعد مورد استفاده قرار گیرد.