به عنوان یک برنامه نویس در محیط GAMS باید نکاتی را که در این صفحه بیان می شود را مد نظر داشته باشید. تمامی عملیاتی که GAMS برای شما انجام می دهد آن چیزی است که شما از آن خواسته اید.
وقتی به GAMS دستور می دهید که پس از حل مدل، مقدار فلان متغییر را به من نشان بده، GAMS دقیقاً این عمل را انجام خواهد داد. این متغییر ابتدا باید توسط شما به عنوان متغییر به نرم افزار فهمانده شده باشد. اگر اندیسی دارد، مجموعه ای که این اندیس را شامل می شود (و دامنه تغییرات آن) نیز از قبل باید تعریف شده باشد.
یا مثلاً وقتی در مدلتان پارامتری به نام مثلاً a دارید و می خواهید از آن در کد نویسی استفاده کنید، این پارامتر نیز باید به GAMS فهمانده شود. توجه داشته باشید که این طبیعت و زبان کامپیوتر است که شما باید خو را با آن تطبیق دهید و نه اینکه زبان خود را آن طور که فرا گرفته اید، در مکالمه با کامپیوتر نیز از آن استفاده کنید. حال فرض کنید که این پارامتر اندیسی نیز دارد. جهت وارد کردن این پارامتر در نرم افزار ابتدا باید مجموعه ی مربوط به اندیس را تعریف کرده باشد.
مثالی دیگر تعریف معادلات شما می باشد. اگر مدلی دارید که در آن تعدادی معادله یا نامعادله مانند یک مدل بهینه سازی دارای تابع هدف و تعدادی محدودیت وجود دارد، شما باید برای هر کدام از معادلات اسمی انتخاب کنید و به GAMS دستور دهید که چه عملی روی آن انجام دهد.
با توجه به مثال های فوق، در کد نویسی در محیط GAMS جهت وارد کردن داده های مختلف از مجموعه ها (Sets)، تعاریف، پارامترها (Parameters)، متغیرها (Variables) و … استفاده می شود. این عمل را Data Entry می نامند.
یک دسته بندی کلی برای وراد کردن داده ها می تواند به صورت زیر باشد:
تعریف مجموعه ها: این تعاریف با دستورات Set، Alias تعریف و مشابه سازی می شوند.
تعریف پارامترها: توسط دستوراتی مانند Parameter، Table، Scalar و همچنین اعمالی مانند Interface انجام می پذیرد.
تعریف متغیرها: متغییرها را می توان توسط توسط دستوراتی مانند Variable, Positive Variable, Binary Variable و … تعریف نمود.
در بخش های بعد وارد کردن داده ها به طور وسیع تری پوشش داده می شود که خواننده جهت مطالعات دقیق تر و کاربردی باید به این بخش ها (مانند بخش مجموعه ها در نوار کناری دسته بندی) مراجعه نماید.
خدمت آن دسته از عزیزانی که از ابتدای آموزش نرم افزار با ما همراه بوده اند، توصیه می شود پس از مطالعه ی این برگه به مطالعه ی بخش مجموعه ها و پس از آن پارامترها و… مراجعه فرمایند.
با تشکر
مدیریت سایت gamsbook.ir
ایمیل: Support@gamsbook.ir
شماره تماس: 3325-405–0919
سلام. خطای ۱۲۵ در گمز معمولا به چه دلایلی ایجاد میشه و چه راه هایی برای برطرف کردن اون هست؟
سلام
ما یه پست برای همین خطا گذاشتیم. بخونین.
وقتی رخ میده که شما یه اندیس رو هم تو صور عمومی و هم تو سیگما بیارین. (یا توابع دیگه)
یه اندیس فقط تو یکی از اینها میتونه استفاده بشه.
سلام مهندس ببخشید من یسری داده ورودی دارم در صورتی که کل دادها رو وارد میکنم مدل بعد از ران ارور no solution رو میده ولی تقریبا نصف وقتی داده ها رو به عنوان ورودی وارد میکنم با همون کد مدل رو حل میکنه. به نظر شما مشکل کجاست؟
سلام
یعنی چی کل داده ها ؟ نصفشون یعنی چی؟
منظورتون اینه که توسایز پاپیین جواب میده؟
با سلام
آیا امکان اصلاح کد رو دارین؟
من کدی نوشتم میخام مشکا کارم رو پیدا کنم نمیتونم
امکان برای ما هست؟
به این دلیل نیاز دارم که من یه OPF-dc طبق کتاب جناب دکتر سرودی و کدهای موجود نوشتم ولی با تغییر دادن شبکه ام و تعداد باس ها به جواب infeasible میرسم
خیر تکالیفتون رو باید خودتون انحام بدید
با سلام و تشکر از سایت بسیار مفیدتان.
من یک سوالی دارم
من متغیری به اسم x(s,t) تعریف کردم که s از 1 تا 4 و t از یک تا 3 هستش.
الان میخوام بگم در کلیه s ها، مقدار x در t=3 مثلا برابر 10 هستش.
میشه بگین چه جوری بنویسم؟
به شکل زیر نوشتم منتهی ارور دارم
x.fx(‘t3’)=10;
ممنون از پاسخ شما…از فیلم آموزشی استفاده کردم….اشکالی که وجود داره این هست که فایل gdx تولید میشه و من در گمز بازش میکنم اما در ادامه کد بارگزاری نمیشه و خطای زیر رو میده:
no such file or directory
لطفا به همون گفتگویی که از قبل داشتیم ریپلای کنین. اینجوری کامنتها به هم میریزه.
یعنی شما داده ها رو تو اکسل وارد میکنین، و وقتی وارد gdx میشن مشکلی ندارن؟ ولی وارد گمز نمیشن؟ اگه جواب بله هست، کد به همراه فایل اکسل رو ایمیل کنین برا سایت، (لطفا کد ساده شده رو بفرستین که درگریرش نشیم فقط قسمت ورود داده رو بفرستین)
کد خدمتتان ارسال شد. سپاس
سلام
پاسخی دریافت کردین؟
سلام
خیر آقای مهندس. پاسخی دریافت نکردم.
بله ببخشید.
کد رو دیدم و درست نوشته شده، شما کافیه که علامت سیمیکالون ; رو بعد از gdxin وردارین. مشکل حل میشه.
خیلی متشکرم.
با عرض سلام و تبریک سال نو خدمت شما
ممنون میشم اگر من رو راهنمایی بفرمایید.
یک جدول رو در گمز طراحی کردم اما حالا باید آن را در اکسل بنویسم و فراخوانی کنم…
سه مجموعه داده iو jو k دارم و جدول گمز به صورت (table(i,j,k هست که i سطر جدول و (j,k) ستون جدول هستند.
در دستوراتی که مینویسم مدام با خطا در خواندن فایل مواجه میشم. بسیار سپاسگزارم.
جدول به صورت زیر هست
سلام
از دستور $call gdxxrw استفاده کنین. توی کانال تلگرام یه فیلم اموزشی کوتاه گذاشتیم. چک کنین.
سلام. خسته نباشید. همونطور که می دونید در matlab و در مورد مثلا مسایل چند هدفه اگه بخواهیم از مجموع وزنی استفاده کنیم میشه مقدار بهینه تابع هدف رو از یک ام_فایل دیگه فراخوانی کرد و بعد محاسبات رو ادامه داد. ممکنه بگید توی گمز هم اینکار ممکنه؟ یعنی میشه بین فایلهای گمز لینک برقرار کرد؟ ممنون
سلام
بله میشه
هدف شما چی هست؟
من تازه کارم
یکی از منابعم علامتش با 4 تای دیگه تفاوت داره برای اون یه دونه چجور باید فرمول بنویسم ارور نده؟
سلام
بیشتر توضیح بدین
سلام وقتتون بخیر
من داده ها و مجموعه های مدلمو تو اکسل وارد کردم. خوشبختانه تمام پارامترهای دوبعدی و سه بعدی و چهاربعدی رو میخونه اما وقتی یه پارامتر 1 بعدی مثل L(i) وارد میکنم گمز ارور 141 میده. حتی رعایت میکنم که از دستور parameter استفاده کنم نه دستور table. میخواستم بدونم پارامتر 1 بعدی رو باید چجوری تو اکسل وارد کنم؟
مشکلش کجاست؟
خیلی خیلی ممنونم بابت اطلاعات خوبی که در اختیار بقیه قرار میدید.
سلام
تشکر.
از این کد استفاده کنین:
set i /i1*i10/
parameter v(i)
$CALL GDXXRW.EXE temp.xlsx par=v rng=sheet1!a1 rdim=1
$GDXIN temp.gdx
$LOADDC v
$GDXIN
ممنون
میشه دستور xls2gms و طریقه وارد کردن پارامتر 1 بعدی تو اکسل رو بگین؟
سلام
توی تابع هدف می خوام دو عبارت از همدیگه کم بشن و اگر مقدارشون مثبت شد هزینه اون در تابع هدف اعمال بشه و اگر منفی یا صفر شد اعمال نشه.
چجوری میتونم این کار رو انجام بدم؟
با تشکر
سلام
مقداری به جهت تابع هدف شما بستگی داره. و اینکه شما میخواین کمینه کنین یا بیشینه. البته اگه این دو عبارت مجهول نیستن (یعنی پارامتر هستن) اینا لازم نیست و ساده میتونین شرطی بنویسین.
یه مثال میتونه اینجوری باشه که: فرض کنیم x,y دو عبارت شما باشن. و تابع هدف شما این شکلی باشه (مینیمم بشه هدف):
min z=x-y+something;
اگه یه w تعریف کنیم که متغیر بزرگتر مساوی صفر باشه، به شکل زیر دو محدودیت زیر میتونن نوشته بشن و w تو تابع هدف جایگزین بشه:
min z=w+something
w>=x-y
w>=0
همه این کارا رو کردم اما نشد . فکر می کنم مشکل از خود تعریف i , j باشه . شاید اسم گذاری خونه های ماتریس موجود در اکسل رو باید عوض کرد…..
سلام
خب display کنین، ببینید چی رو نشون میده. ضمنا لطفا به همون سوالات ریپلای کنین، اینجوری کسی که نظرات رو بخونه نمیدونه چی مربوط به چی هست. مرسی
سلام باشه حتما….
display کردم دقیقا عین هم می یان . ولی بازم alias نمیشن. میشه بی زحمت شما یه بار برنامه ای رو که گذاشتم تو گمز اجرا کنین؟؟
ممنون.
کد و فایل اکسل رو بفرستین به ایمیل سایت لطفا
سلام
خیلی خیلی ممنون. کمکتون مشکل برنامم رو حل کرد. متشکرم….
خواهش میکنم
مگر این که یه جوری قبل از بشه تعریفشون کرد .
به نظر شما امکان نداره مشکل از اندیس های a2 تا a5 و b1 تا e1 باشه ؟ ولی نمی دونم چطور باید تغییرشون داد
قبل از شروع table q و بعد از اتمام دستور set i میتونین آلیاس کنین.
نمیشه . چون i,j ای قبل از این تعریف نشده که بخواد alias بشه .
نمیشه . چون i,j ای قبل از این تعریف نشده که بخواد alias بشه . i , j رو به عنوان اندیس از اکسل فراخوانی می کنه
سلام
خب وقتی هم i و هم J رو از اکسل بخونه که نمیتونه آلیاس کنه. باید یکی رو بخونه و اون یکی رو بهش الیاس کنین
سلام . وقت بخیر . قبلا یه برنامه رو برام اصلاح کرده بودید. توی اون برنامه نتونستم ماتریس موردنظرم رو اون طور که می خوام تولید کنم. بنابراین مجبور شدم داده ها رو در مطلب تولید و سپس به صورت فایل اکسل در گمز وارد کنم . مشکل من اینجاست که توی برنامه قبلی می تونستم i, j رو alias کنم. اما توی برنامه جدید نمیشه این کار رو انجام داد و به همین خاطر در تعریف توابع به مشکل برمی خورم. اگه بتونم یه جوری i,j رو alias کنم تمام مشکل برنامه حل میشه . نمی دونم چرا نمیشه این کار رو کرد. اگه کمکم کنید ممنون میشم.
توی برنامه زیر دو تا ماتریس Q, G رو از اکسل فرا خوانی می کنه …
set i /
$call =xls2gms r=a2:a5 i=filename.xls o=set100.inc
$include set100.inc
/;
set j /
$call =xls2gms r=b1:e1 s=”,” i=filename.xls o=set101.inc
$include set101.inc
/;
table Q(i,j) asdfg
$call =xls2gms r=A1:D4 i=filename.xls o=qwer.inc
$include qwer.inc
;
table G(i,j) asdfg
$call =xls2gms r=A1:D4 i=filename2.xls o=kll.inc
$include kll.inc
;
alias (i,j);
سلام
الیاس رو قبل اینا باید تعریف کنین که.
باسلام و خسته نباشید
ببخشید یه مجموعه دارم میخوام بدونم چطور تو مدلم کدش کنم
VA={(i,j);if l≠j then d_ij+d_jl<b ,otherwise d_ij<b}
چون بعد در محدودیت ها لازمه که ذکر کنیم برای هر (i,j) عضو VA .
بخاطر همین قبلش نیازه که این مجموعه تعریف شود.
مرسی
سلام و خسته نباشید
چطور میتونم محدودیت y(i,j)-x(j)>0 که به ازای همه i ها است رو در شرط if تعریف کنم؟
if (y(i,j)-x(j)>0,؟؟؟؟؟؟
و نامساوی در گمز چطور نشون داده میشه؟
تشکر
سلام
از دستور ifthen استفاده کنین در داخل محدودیت هاتون.
نامساوی <> است.
منظورم مثل الگوریتم های فراابتکاری که با جواب اولیه شروع میشند.
مثلا گمز بیاد از یک جواب اولیه برای متغیرهای مسئله شروع کنه و جواب رو بهبود بده..چطوری میشه اینکارو کرد؟…مرسی
سلام
قکز کنم نشه چون گمز خود جواب بهینه را بهتون میده اما الگوریتم های فراابتکاری جواب نزدیک به بهینه . وقتی گمز جواب بهینه را میده دیگر نیاز نیست بهبود بدین.
مرسی…میدونم جواب بهینه رو میده. منظورم برای مسائلی هست که گمز نمیتونه جواب شدنی هم پیدا کنه یا تو زمان خیلی بالا جواب با گپ بالا به دست میاره. برای همین گفتم اگه گمز بتونه از یه جواب اولیه شروع کنه شاید زودتر به جواب بهینه برسه یا گپش بهتر بشه.
من تاحالا انجام ندادم و تاحالا ندیدم !! ولی شاید بشه ولی کار زمان نریه !! توی متلب میشه با فراخوانی خیلی راحت همه چیزو به هم ربط داد ! ولی الگوریتم بخوای توی گمز بنویسی کار سخت و زمان بر میشه ! چون توی این زمینه کار با متلب راحت تره به نظرم بهتره وقت نزاری!!
سلام
احتمالا منظور شما جواب اولیه هست یا همون initial solve. شما براش دو راه دارین. یکی اینکه بیاین از دستور variable.fx استفاده کنین که این واسه زمانیه که شما به طور قطع میدونین که مدل شما جواب متغیر x رو مثلا 10 میده. واسه همین میزنین x.fx=10 .
اگه ندونین دقیقش چنده ولی حدودی بدونین چه مقداری میگیره، مثلا حدودا 10 میشه، باید بزنین x.l=10 . اینجوری گمز سعی میکنه با همین جواب اولیه که بهش دادین بهتر و سرعتر به جواب برسه.
مبحث متغیرها هم میتونه براتون مفید باشه.
بله من جوابمو گرفتم…..خیلی ممنونم
سلام
خیلی ممنون از سایت خوبتون
من میخام کد گمزم از یک جواب اولیه شروع کنه…ایا میشه همچین کاری کرد؟ ممنون میشم راهنماییم کنید.
سلام منظورتون اینه برای یک سایز مساله حل کنید و سایز مساله رو زیاد کنید ؟ یا اینکه داده هاییو در نظر بگیرین و تغییر داده بدین ؟ برای هر دو صورت میشه ! اگه منظورتون دو صورتی که گفتم نیست بیشتر توضیح بدین.
سلام و خسته نباشید
برای یک مجموعه alias(k,m) که هردوتا میخواین تو یک دستور شرطی از یک زیر مجموعه استفاده کنند چیکار میتونیم بکنیم مثلا
)Smin (k be sharte i va m be sharte i
سلام
این کامنت رو تو بخش Table هم نوشته بودین. همونجا جوابتون رو دادم
موفق باشین
سلام من یه مدل MILP اجرا می کنم با این که گپ به صفر می رسه ولی مدل متوقف نمیشه و ادامه میده علتش را می دانید؟
سلام
کامل به جواب نرسیده، خواستید متوقف بشه بعد ی زمانی، از دوستور reslim استفاده کنین.
خیلی ممنون ….دیگه لازم نیست….مدلمو سبک کردم
سلام
باتشکر از سایت خوبتون
من توی پارامترهام M دارم که به معنی عدد خیلی بزرگه…و باید به این پارامتر بزرگترین عدد ممکن رو بدم چون توی کاهش زمان حل خیلی تاثیر داره….شما نمیدونید بزرگترین عدد ممکن که میشه وارد گمز کرد چنده؟
مرسی
سلام
لطفا مقداری در مورد محدودیتتون و همچنین متغیرهایی که توش دخیلن صحبت کنین
باسلام.اگربخایم یه مسئله عمومی تعریف کنیم چیکار باید کرد.مثلا iاز1تاm?وهمچنین برای دستور حذف زیرتور چ کدی لازم هستش؟ممنون میشم از راهنماییتون
سلام
سوالتون گنگه. مسئله عمومی چیه و …