هدف از حل مدلهای MIP رسیدن به یک جواب شدنی و بهینه است که باید متغیرهای integer دخیل در آن مقادیر صحیحی به خود بگیرند. در پاره ای از اوقات پیش می آید که در خروجی گمز مشاهده می شود که یک متغیر مثلا عددی نزدیک به صفر (مثلا 3 میلیونم!) به خود گرفته است. این عدد از لحاظ مفهومی احتمالا نامفهوم و غیر کاربردی است. به عنوان مثال وقتی ما یک متغیر صفر و یک تعریف کرده ایم ولی در خروجی مقداری نزدیک به صفر مشاهده می کنیم، از لحاظ ما این امر پذیرفته نیست و فوری به دنبال راه چاره خواهیم گشت.
برای رفع این مشکل ابتدا باید به تلرانس مجاز متغیرهای عدد صحیح دقت کنیم. این تلرانس با آپشنی به نام epint در گمز تعریف شده است. آپشن به صورت دیفالت مقدار بین 0 تا 1e-5 را مجاز اعلام می کند. به عبارتی اگر متغیر عدد صحیح مقدار 3 میلیونم را کسب کرد، گمز بدون ایراد هیچ مشکلی آن را مورد پذیرش قرار می دهد (در حالی که ممکن است منطقی هم نباشد) کاری که ما می توانیم علیه این گزارش گمز انجام دهیم این است که این آپشن را برابر صفر قرار دهیم یعنی epint=0 . در این صورت در صورت وجود جواب شدنی برای مسئله، گمز جواب دقیق عدد صحیح به ما ارائه خواهد داد. که البته ممکن است زمان حل مسئله بیشتر از قبل شود. پس اگر دنبال این جواب هستید حتما مقدار epint را تنظیم کنید.
از طرفی می توان از این آپشن به عنوان نوعی تلرانس مجاز برای متغیرها هم استفاده کرد. به عنوان مثال فردی ممکن است تمایل داشته باشد که برای متغیرهایش تلرانس 0.01 در نظر بگیرد (این بستگی به هدف و چرایی مدل و کد دارد).
سلام وقت بخیر
بنده مدل ریاضی رو توی گمز پیاده سازی کردم و مدل ران شد ولی جواب هایی که به من میده یا 1 و -1 توی محدودیت ها و عدد منفی در تابع هدف امکانش هست راهنماییم کنید
سلام و ادب
سوال واضح نیست.
سلام، وقت بخیر، راهی هست که یک متغیر تصمیم رو بزرگتر از صفر تعریف کرد نه بزرگتر مساوی، به عبارت دیگه اون متغیر هیچ وقت صفر نشه. البته راهی غیر از تعریف حد پایین یا فیکس کردن .
ممنون از راهنمایی شما
سلام و ادب
بستگی داره کجا بخواین استفاده کنین. معمولا راه حل های خلاقانه باید استفاده کرد. مورد استفاده شما چیه؟
برای اینکه اون متغیر معرف عدم قطعیت مسئله هست، و میخوام مسئله تحت عدم قطعیت حل بشه، اون متغیر در تابع هدف و قیود میاد.
ممنون از راهنمایی شما.
در تابع هدف و قیود این متغیر استفاده میشه.
من تو این شرایط معمولا یا حد پایین میذارم، یا اینکه تو محدودیت ها هر جا استفاده شد این متغیر (x) مقدار کوچکی رو بهش اضافه میکنم. (x+0.0001)
با عرض سلام.
من مساله ای دارم شامل عدم قطعیت. میخوام این عدم قطعیت رو با emp و سولور لیندو حل کنم . عدم قطعیت توان سلول خورشیدی مدنظرم هست . زمانی که تعداد پارامترهای عدم قطعیت کم باشه مثلا باری حل مساله تا 5 تا پارامتر دارای عدم قطعیت هیچ مشکلی نداره و سریع جواب میده.اما از 5 تا به بعد مثلا بشه تا ،خیلی خیلی کند میشه و از یک تعداد بیش تر هم که همون اول ارور میده. میخواستم ببینم ایا emp محدودیت تعداد سمپل داره یا محدودیت سخت افزاری مانع حل میشه که اگه اینطوره به چه دستوری میتونم زمان حل رو کاهش بدم ولو یکم دقت حل مساله بیاد پایین؟ پیشاپیش سپاسگزارم .خیلی مشغولم کرده این مساله
سلام
برای توضیح بیشتر باید مقاله و یا فایل کدتون را ببینم. اما نمی دونم مدلتون غیر خطی هست که با Lindo حل می کنید. اگر اینجوریه خوب مدل غیر خطی به تعداد متغیرها و فضای حل حساسیت بیشتری داره. اما اصولاً سخت افزاری باعث افزایش زمان میشه و امکان پذیری حل را تغییر نمیده. برای تغییر دقت از همون مقادیر optca و optcr می تونید استفاده کنید. که البته زمان رو خیلی تغییر نمیده. فقط شرط توقفه. میتونید به مسئله جواب اولیه بدید. شاید سریعتر مسئله حل شد.
سلام ببخشید من برنامه ای برای یک ریزشبکه نوشتم که در ان برای محدوده تولید ژنراتورها مقدار باینری تعریف کردم اما گاهی اوقات این مقدار باینری به جای عدد یک مقدار اعشاری به خود میگیرد در توضیحاتی که داده بودید خوندم که باید از دستور epint استفاده کرد ولی من درست متوجه نشدم که باید چه طور این کار رو انجام دهم؟ بعد اگر از این دستور استفاده کنم این دستور روی تمامی مقادیر اعمال می شود؟ چون من در برنامم مقادیر دیگه اعشاری دارم مثل مقدار توانی که ژنراتور تولید میکند که این مقدارها نمیخام تغییر کنند فقط میخواهم که این دستور روی مقادیر باینری برنامه اعمال شوند اگر راهنمایی کنید ممنون میشم
سلام
اول بفرمایید که این اعداد اعشاری که برای متغیر باینریتون تولید میکنه چگونه هستن. یه عدد خیلی خیلی زیر در حد 1 ده هزارم و صد هزارم یا مثلا 0.1 و 0.8 و … ؟
اگه حالت اول باشه مشکلی نیست و میتونین صفر فرضشون کنین.
اگه حالت دومه، مسئله کامل حل نشده و احتمالا جوابش نشدنیه. آپشن زیر رو به قبل از دستور solve اضافه کنین.
سلام ، من دوبار پیام نوشتم خدمتتون اما نمیدونم چرا نمبینمشون روز بعدش ،
ممنون از سایت خوبتون. میشه لطفا بفرمایید epintرو بصورت دستی کجا باید صفر بگذارم ؟ اصلا کجاست این اپشن ؟ ممنونم از لطفتون
سلام
ایمیلتونو چک کنین مشخص میشه کجا کامنت گذاشتبن. جواب داده شد. این epint به درد چیزی که شما میخوان نمیخوره احتمالا. نحوه صفر کردنش رو سایت نوشتیم. این آپشن ها اینجوری نوشته میشن. اینجا کلیک کنین.
کامنت قبلیتون هم اینجاس
سلام.ببخشید می خوام یه متغیر پس از حل در صورتی که از یه مقدار کمتر بشه دوباره مسیله از اول شروع شه یعنی متغیر مقدار جدید به خودش بگیره.این امکان پذیره؟؟چون در گمز م نمیشه روی متغیر شرط نوشت.ممنون میشم کمکم کنید.
سلام
از چه مقداری کمتر بشه؟ این مقدار چی هست؟
یه متغیر به نام ولتاژ باس که می خوام اگه در باس انتها از یک سطح کمتر شه، اونوقت ولتاژ در باس ابتدا یه پله افزایش پیدا کنه که همه ولتاژها در محدوده مشخص خودشون باشند.ولی مشکل اینه که ولتاژها متغیرند وپس از حل مشخص می شن.
ممنون از شما
اون ولتاژ اسلک رو متغییر تعریف کنید و اتوماتیک برای بالا آوردن ولتاژ انهتای شبکه خودش باید زیاد بشه و میشه
ممنون از توضیحاتتون، دو آپشن اول که فرمودین در کد قرار داده بودم و تنها از آپشن سوم با توجه به گمز 23.5 که دارم استفاده نشده. حالا با این وصف میشه راهنمایی بفرمایین؟
نه به روز کنید نسخه رو قطعا.
اگه نمیخواید اینکارو بکنین. برای هر متغیر اینتیجرتون. یه حد بالا مثلا ده هزار یا هر مقداری که مطمئن هستین هیچ متغیر عدد صحیحی تو مدلتون این مقدار رو نمیتونه بگیره برای تک تکشون در نظر بگیرین. مثلا x یه متغیر اینتیجر باشه.
سلام
من یک مدل موجودی دارم که تعداد ارسال انباشته یک متغیر عدد صحیح می باشد که در گمز با integer variable تعریف کردم برای اینکه مقدار صفر را شامل نشود حد پایین یک برای متغیر تعریف کردم پس از حل با گمز مقدار 5.073 را نمایش می دهد که صحیح نیست ممنون میشوم اگر راهنمایی بفرمایین.
سلام
سه option زیر رو به قبل از دستور solve اضافه کنین. توجه کنین intvarup برای نسخه های بالای 24.7 کار میکنه. اگه مدل نشدنی بشه، یعنی مشکلی هست و باید رفع کنین. اگه نه که چه بهتره. کارتون درسته.
فرض کنید در یک مسئله زمانبندی مقدار بهینه برای cmax یا makespan برابر 100 بدست آمده. حل مسئله توسط Cplex نشان میدهد که زمان پایان یک عملیات مشخص می تواند مقادیر 50 تا 60 را اختیار کند بطوریکه با هر مقداری در این بازه مقدار بهینه تابع هدف همان 100 بماند. سوال من اینه که آیا می توان شرایطی برای سالور تعریف کرد که در اینجور موارد همیشه مقدار کمتر را برای متغیرها انتخاب کند؟
سلام
یکی از مشکلاتی که کاربران با این جور مسائل دارن همینی هست که فرمودین.
برای رفع این مشکل، معمولا میان یه محدودیت اضافه میکنن که اجبار کنه که مثلا زمان اتمام برابر با زمان شروع به اضافه دیوریشن هست. بسته به نوع مسئله کارای خلاقانه میشه انجام داد.
سلام و عرض ادب
من روی یک مدل زمانبندی کار میکنم. برای زمان پایان بعضی از عملیات شناوری وجود داره. مثلا زمان پایان یک عملیات میتونه از a تا b را اختیار کنه بدون اینکه روی بهینه بودن جواب نهایی تاثیر بذاره. اما روی مقدار متغیرهای دیگه تاثیرگذاره. دستوری وجود داره که سالور حد پایین را برای اینجور متغیرها انتخاب کنه؟
شما می توانید حد بالا و پایین برای متغییر هاتون تعریف کنید
اما قطعا روی بهینه بودن جواب نهایی تاثیر می گذارد
سوالتون رو واضح بپرسید
سلام من در کدم میخوام در یک محدودیت یکی از متغیرها رو بزرگتر مساوی یک عدد خیلی کوچیک مثل 10 به توان منفی 16 قرار بدم ، اما در حل مسئله میبینم که اون رو صفر در نظر گرفته و فقط در صورتی صفر نمیشه که 10 به توان منفی 7 قرار بدم ، راهی برای این مشکل وجود داره؟ لطفا راهنمایی کنید خیلی ممنونم
سلام
تلرانس رو درست کردین؟ ضفرش کردین؟ اگه این میزان از تلرانس کمتر باشه، عمل نمیکنه.
محمودی می گوید :
مرداد ۲۶, ۱۳۹۷ در ۲۲:۴۱
سلام
محاسبات قبلی یعنی از یه مدل دیگه خروجی گرفته شده و به عنوان ورودی به مدل جدید داده میشه؟ اگه اره که باید از suffix استفاده کنین. اگه نه که بریم ادامه ماجرا:
برای اینکه تقسیم بر صفر نده، طرفین وسطین کنین و vsfp رو در vsfbush1 بکنین. برای مقدار صفر هم که گذاشتین برای متغیر صفر و یک کار بی معنی ای نیست آیا؟
برای خطی کردنش دردسر دارین. شاید به صرفه نباشه خیلی. مثلا یکی از راه ها اینه که vsfp رو به مجموع سه متغیر صفر و یک تبدیل کنین (تو یه محدودیت جدا). بعد که طرفین وسطین انجام دادین حاصلضرب سه متغیر صفر و یک رو در متغیر مثبت باید خطی کنین که حدود ۱۰ تا محدودیت احتمالا به مدلتون اضافه میشه.
جان؟
عذر خواهی میکنم من این سوال رو در دو قسمت( بخش خطاهای گمز و تلرانس متغیرهای INTEGER ) با دو شکل مختلف البته با یک مفهوم مطرح کرده بودم دلیل هم دیر شدن پاسخ بود و در این قسمت هم پاسخ که در بخش خطاها داده بودین گذاشته بودم من سوالم رو در اون بخش ادامه میدم به خاطر ایجاد سرگیجه ای که براتون اوردم باز هم ببخشید:)
میبخشین امکانش هست با جزییات بیشتر یا یک مثال در این مورد راهنمایی کنین؟
امکان خطی سازی متغیر عدد صحیح ضربدر پیوسته هست؟
z×y=m
در رابطه z متغیر صحیح ۰،۱،۲یا ۳(این متغییر حاصل جمع مجموعه متغییر باینری که در یک معادله همزمان در این مدل حل میشه)
همچنین y متغیر مثبت پیوسته که باید برابر یا نصف یا ۱/۳ متغیر اصلی پیوسته m باشد
و در اصل m متغیر اصلی که در محاسبات بدست میاد(این هم مثل بالاست همزمان محاسبه میشه) و باید تقسیم بر z بشه که y بدست بیاد جهت ساده سازی به صورت معادله فوق نوشته شده.
ممنون میشم اگر راهکاری هست راهنمایی کنید. من در مورد خطی سازی حاصل ضرب متغیر باینری در عدد پیوسته یه سایت بود استفاده کردم ولی در مورد عدد صحیح در پیوسته روش خاصی ندیدم.
سلام
وقتی به همون سوال ریپلای نمیکنین بحث گم میشه. الان چندتا سوالا بالا رو نگاه کنین. هیچ ربطی به هم ندارن. نمیشه اینجوری
e h:
با سلام.
امکان خطی سازی متغیر عدد صحیح ضربدر پیوسته هست؟
z×y=m
در رابطه z متغیر صحیح 0،1،2یا 3
همچنین y متغیر مثبت پیوسته که باید برابر یا نصف یا 1/3 متغیر اصلی پیوسته m باشد
و در اصل m متغیر اصلی که در محاسبات بدست میاد و باید تقسیم بر z بشه که y بدست بیاد جهت ساده سازی به صورت معادله فوق نوشته شده.
ممنون میشم اگر راهکاری هست راهنمایی کنید.
سلام. از این موضوع اطلاعاتی ندارین!؟
سلام
چه اطلاعاتی نیاز دارین؟
این ارور یعنی یه تابع مثل fact(x رو تو مدل استفاده کردین، در حالی که x متغیره. ولی تابع fact فقط برای مقادیر مشخص مثل parameter باید استفاده بشه.
سلام
فکر کنم یه جای دیگه جواب داده شد بهتون.
بله ولی این خطارو میده:
Error 64: function called with non constant argument
سلام
این یعنی شما تابعی رو استفاده کردین که جلوش به جای اینکه عدد ثابت بذارین، رفتین یه متغیر گذاشتین.
سلام
ممنون از سایت خوبتون
یک مدل بهینه سازی دارم که یک جمله از تابع هدفش به صورت زیر دارم که میخوام در گمز بزنم ولی چون در معادله فاکتوریل متغیر (c) باید حساب بشه، گمز اجرا نمیکنه و خطا میده که مقداری ثابت باید باشه. چطور این مشکل حل میشه؟
z= (c^2)/(c!*4^c)*0.044
سلام
از fact(c استفاده کردین؟
سلام. من یک مسأله MILP دارم که تعداد متغیرهای integer زیادی داره. برای حلش از یک کامپیوتر با 32GB رم با CPU هشت هستهای استفاده میکنم. منتها زمان حل طولانیه و از حجم کمی از رم و cpu استفاده میشه. ینی در زمان حل، رم حدود 10 درصد و cpu حدود 15 درصد هستن. میخاستم ببینم راهی هست که از حجم بیشتری از رم و cpu استفاده بشه که سریعتر به جواب برسم. لپتاپم، رم 4 و cpu چهار هستهای داره؛ این کامپیوتری که برای حل مسأله ازش استفاده میکنم، فقط 3 برابر سریعتر از لپتاپ جواب میده.
با تشکر
سلام
3 برابر هم باز هم خوبه! اینجوری نیست که سرعت ها به صورت نمایی تغییر کنه که. همینم خوبه.
ولی برای افزایش استفاده از cpu میتونین از آپشن زیر استفاده کرد:
که 8 تعداد هسته ها رو نشون میده.
خیلی ممنون. حتما بررسی می کنم
با سلام و احترام و تشکر بابت پاسخ هایی که تا الان داده اید
من کدی که مربوط به حالت خاصی از مسئله TSP هست رو ران می کنم. این کار رو هم رو سروری با حدود 20 ترد و 80 گیگ رم ران میکنم ولی متاسفانه به جهت محاسبات زیاد نیازمند رم بیشتری هست و در جایی که 0.67% گپ رو نشون میده ارور کم بودن رم رو میده و اجرا رو متوقف می کنه…آیا در گمز روشی وجود دارد که بواسطه اون بشه استفاده از رم رو مدیریت کرد و جلوی توقف کد رو گرفت … اگر زمانش طولانی بشه مسئله ای نیست. مهم اینه که اجرا رو تا آخر بره
ممنون از بابت پاسخهاتون
سلام
میتونین از optionهایی نظیر cutoff استفاده کنین. این آپشن به گمز میگه که جوابایی که از یه مقدار مشخص بدتر هستن رو حذف کنه. معمولا خیلی کمک میکنه. مقداری در موردش مطالعه کنین. و بر حسب مسئله خودتون ازش استفاده بکنین. ضمنا تو کانال تلگرام هم مطالبی در این مورد نوشتیم شاید به دردتون بخوره.
مرسی و خواهش میکنم.