SETS - Reza Samizadeh Site

Download Report

Transcript SETS - Reza Samizadeh Site

‫واحد علوم وتحقيقات تهران‬
‫دانشكده مديريت واقتصاد‬
‫مديريت فن آوري اطالعات‬
‫موضوع ‪:‬‬
‫تهيه كنندگاه ‪:‬‬
‫نرم افزار‬
‫‪lingo‬‬
‫احمد محمدي –عليرضا روتيوند غياثوند – نقوي‬
‫بسته هاي نرم افزاري ليندو و لينگو توسط شرکت ليندو سيستمز(‪ )1‬براي‬
‫حل مسائل بهينه سازي در دانشگاه‪ ،‬صنعت و تجارت‪ ،‬طراحي گرديده است‪ .‬دو‬
‫محصول فوق همراه با کتاب تحقيق در عمليات ‪ :‬کاربرد ها و الگوريتم ها (‪ )2()1994‬و‬
‫کتاب مقدمه اي بر برنامه ريزي رياض ي ‪ :‬کاربرد ها و الگوريتم ها (‪ )3()1995‬که توسط‬
‫پروفسور واين ال‪ .‬وينستون(‪ )4‬نگاشته شده است‪ ،‬تشريح گرديده اند‪.‬‬
‫‪1) Lindo Systems, Inc.‬‬
‫)‪2) Operations Research : Applications and Algorithms (1994‬‬
‫)‪3) Introduction to Mathematical Programming : Application and Algorithms (1995‬‬
‫‪4) Wayne L.Winston‬‬
‫‪2‬‬
‫نرم افزارهاي مشابه‬
‫امروزه بسياري از مدل هاي بهينه سازي تحقيق در عمليات اعم از مدل‬
‫هاي خطي‪ ،‬غير خطي و يا عدد صحيح به مدد نرم افزارهاي کامپيوتري به‬
‫سادگي قابل تجزيه و تحليل مي باشند‪ .‬در اين ميان مي توان از نرم افزارهايي‬
‫چون ‪ QSB ،LINGO ،LINDO ،GINO ،GAMS‬و ‪ TORA‬نام برد‪.‬‬
‫‪3‬‬
‫‪ LINGO‬بعد از ‪ GAMS‬قوي ترين نرم افزار تحقيق در عمليات‬
‫مي باشد‪ .‬از جمله برتري هاي لينگو نسبت به ‪ LINDO‬يا ‪، GAMS‬‬
‫قدرت آن در مدل سازي تمام مسائلي است که توسط ليندو مدل شده اند‪،‬‬
‫بدون اين که نيازي به تعيين نوع مدل توسط کاربر باشد‪ ،‬در حالي که‬
‫‪LINDO‬يا ‪ GAMS‬چنين قابليتي را دارا نمي باشد‪ .‬يکي ديگر از قابليت‬
‫هاي مهم لينگو برخورداري از‪ Help‬ي بسيار قوي‪ ،‬ساده و کامل مي باشد‪.‬‬
‫به گونه اي که با استفاده از ‪ Help‬آن مي توان تا حد زيادي بر اين نرم‬
‫افزار مسلط شد ‪.‬‬
‫‪4‬‬
‫تعريف اول ‪ :‬راهنماي ‪ PDF‬لينگو ‪:‬‬
‫لينگو ابزاري ساده براي بهره گيري از قدرت برنامه ريزي خطي و غير‬
‫خطي در فرموله کردن مسائل خيلي بزرگ به صورت مختصر و تجزيه و‬
‫تحليل آنهاست‪ .‬بهينه سازي به شما کمک مي کند تا جوابي را با بيشترين‬
‫سود‪ ،‬خروجي‪ ،‬يا رضايتمندي و يا جوابي با کمترين هزينه‪ ،‬تلفات يا ناراحتي‬
‫بدست آوريد‪ .‬اغلب اين مسائل با استفاده موثر از منابعي همچون پول‪،‬‬
‫زمان‪ ،‬ماشين‪ ،‬نيروي کار‪ ،‬موجودي و ‪ ...‬در ارتباط است‪.‬‬
‫‪5‬‬
‫تعريف دوم ‪ :‬کتاب تحقيق در عمليات واين ال‪ .‬وينستون ‪:‬‬
‫لينگو يک بسته نرم افزاري با امکان برقراري ارتباط دو طرفه با کاربر است و از‬
‫آن مي توان در حل مسائل خطي‪ ،‬عدد صحيح و غير خطي کمک گرفت‪ .‬استفاده از‬
‫اين نرم افزار وضعيت مشابهي مانند ليندو دارد‪ ،‬اما از انعطاف بيشتري در بيان مدل‬
‫برخوردار است‪ .‬بر خالف ليندو‪ ،‬لينگو امکان استفاده از پرانتزها و متغيرها را در‬
‫سمت راست معادله فراهم مي آورد‪ .‬بنابراين‪ ،‬محدوديت ها را مي توان به صورت‬
‫اوليه‪ ،‬بدون نياز به تبديل آن به ساختار استاندارد (آوردن مقادير ثابت به سمت‬
‫راست) نوشت‪ .‬همچنين لينگو داراي يک کتابخانه بزرگ از توابع رياض ي‪ ،‬آماري و‬
‫احتمالي بوده و قدرت باالي آن در خواندن اطالعات از فايل هاي خارجي و نرم‬
‫افزارهاي صفحه گسترده است‪.‬‬
‫‪6‬‬
‫مسائل بهينه سازي اغلب به خطي و غير خطي تقسيم مي شوند‪ ،‬که‬
‫اين تقسيم بندي با توجه به رابطه متغيرهاست؛ بدين معني که اگر رابطه‬
‫همه متغيرها با هم خطي باشد‪ ،‬مسئله را خطي و در غير اينصورت غير‬
‫خطي مي گويند‪.‬‬
‫لينگو زباني جامع و فراگير جهت تسهيل تمام مدل هاي بهينه سازي از‬
‫مسائل تحقيق در عمليات گرفته تا اقتصاد مهندس ي‪ ،‬شبيه سازي‪ ،‬کنترل‬
‫کيفيت‪ ،‬کنترل پروژه و کنترل موجودي مي باشد‪.‬‬
‫‪7‬‬
‫نصب نرم افزار‬
‫نصب لينگو به راحتي انجام مي گيرد و همانند بسياري از نرم‬
‫افزارهاي تحت سيستم عامل ‪ Windows‬مي باشد‪.‬‬
‫تنها نکته اي که در نصب مي توان به آن اشاره کرد فضاي‬
‫مورد نياز در روي ديسک سخت مي باشد که ‪ 40MB‬است‪ .‬براي‬
‫دريافت نرم افزار مي توانيد به سايت لينگو مراجعه کنيد‪.‬‬
‫‪8‬‬
‫وارد کردن يک مدل در نسخه تحت ويندوز لينگو‪ ،‬شبيه‬
‫تايپ کردن در يک محيط پردازشگر متني تحت ويندوز است؛‬
‫چون وقتي در يک مدل داده تايپ مي کنيد‪ ،‬تقريبا بايد آنچه را که‬
‫به صورت دستي نوشته ايد‪ ،‬وارد مدل کنيد‪ .‬کاربر مي تواند‬
‫اطالعات ورودي خود را در پنجره ي داخلي که ابتدا تحت عنوان‬
‫‪ Lingo Model‬است‪ ،‬وارد کند‪ .‬همچنين‪ ،‬لينگو شامل‬
‫دستورات ابتدايي ويرايش براي بريدن‪ ،‬کپي کردن و چسباندن يک‬
‫متن است‪ .‬اين ابزارها و ساير ويژگي ها‪ ،‬در منوي فرمان ها‬
‫موجود است که در ادامه مورد بررس ي قرار مي گيرد‪.‬‬
‫‪9‬‬
‫عناصر مورد نياز در لينگو مشابه ليندو است‪ .‬لينگو نيازمند تابع هدف‪،‬‬
‫يک يا چند متغير و يک يا چند محدوديت است‪ .‬بر خالف ليندو‪ ،‬محدوديت‬
‫هاي لينگو بعد از عبارات خاص از قبيل ‪ SUBJECT TO‬يا ‪SUCH‬‬
‫‪ THAT‬نمي آيند‪.‬‬
‫‪10‬‬
‫اصول اوليه مدل نويس ي در لينگو‬
‫‪ ‬در لينگو هر عبارت با يک ” ; “ پايان مي يابد؛‬
‫‪ ‬هرگاه بخواهيم يک عبارت توضيحي به متن برنامه بيافزاييم کافيست در ابتداي‬
‫عبارت از عالمت تعجب ( ! ) استفاده کنيم‪ .‬اين توضيحات نيز به ” ; “ ختم مي‬
‫شوند؛‬
‫‪ ‬کليه عبارات متني که مابين ( ! ) و ” ; “ نوشته مي شوند از سوي لينگو ناديده‬
‫گرفته مي شوند؛‬
‫‪ ‬لينگو به بزرگ يا کوچک بودن حروف حساس نيست؛‬
‫‪11‬‬
‫‪ ‬مي توانيم دو خط برنامه لينگو را در يک خط بياوريم و يا يک خط آن را در دو سطر‬
‫بياوريم‪:‬‬
‫‪Max = 100 * Standard‬‬
‫;‪+ 150 * Turbo‬‬
‫يا‬
‫;‪Turbo <= 120; Standard <= 100‬‬
‫‪ ‬حتي مي توانيم توضيحات را در وسط محدوديت ها بياوريم‪:‬‬
‫;‪X = Y + !Number of Products; Q + 2 * C‬‬
‫( معادل ‪ X = Y + Q + 2 * C‬است )‬
‫‪12‬‬
‫‪ ‬عملگرهاي رياض ي حتما فراموش نشود؛ ( مخصوصا عملگر ضرب “ * “ )‬
‫(اشتباه)‬
‫‪2X + 3Y <= 25‬‬
‫‪( 2 * X + 3 * Y <= 25‬درست)‬
‫‪ ‬اسامي متغيرها حتما با يک حرف شروع مي شوند‪ .‬بعد از آن مي توان حرف‪ ،‬رقم يا‬
‫زير خط ( _ ) استفاده کرد‪ .‬اسم متغيرها نمي تواند بيشتر از ‪ 32‬کاراکتر باشد؛‬
‫‪ ‬استفاده از فاصله “ “ ( فاصله ) در اسم متغير ها ممنوع است؛‬
‫‪13‬‬
‫‪ ‬عالئم ساده رياض ي‪ ،‬توان ) ^ (‪ ،‬ضرب ) * (‪ ،‬تقسيم ) ‪ ،( /‬جمع ) ‪ ( +‬و تفريق (‬
‫) ‪ -‬با همين ترتيب اولويت معتبرند؛‬
‫‪ ‬اگر بخواهيم به محدوديت اسمي اختصاص دهيم در ابتداي محدوديت اسم آن را در‬
‫داخل عالمت کروشه مي آوريم؛ و به صورت مقابل مي نويسيم ‪] :‬اسم محدوديت[‬
‫‪ Help ‬لينگو يک راهنماي بسيار خوب براي استفاده بهتر از نرم افزار است‪ .‬از آن بهره‬
‫بگيريد!‬
‫‪14‬‬
‫پيغام خطا‬
‫‪ ‬هنگام حل مدل اگر ايرادي در آن وجود داشته باشد‪ ،‬نرم افزار پيغام خطا داده و مکان‬
‫نما به اول سطري مي رود که به نظر لينگو اين خطا از آنجا ناش ي شده است؛‬
‫‪ ‬ممکن است در بعض ي مواقع با وجود آنکه فکر مي کنيد مدلي که نوشته ايد درست‬
‫است‪ ،‬نرم افزار هنگام حل آن پيغام خطا بدهد‪ .‬در اين مواقع يک راه ساده آن است‬
‫که يک صفحه جديد لينگو باز کرده و دستورات و عبارت هايي که در مدل نوشته ايد را‬
‫يکي يکي‪ ،‬به صفحه ي جديد کپي کرده و هر بار مدل جديد را اجرا کنيد‪ .‬با اين کار در‬
‫اکثر موارد به راحتي مي توانيد به اشکال برنامه پي ببريد‪.‬‬
‫‪15‬‬
‫نرم افزار لينگو از سه بخش کلي منوها‪ Toolbar ،‬و پنجره ي مدل نويس ي تشکيل‬
‫شده است‪.‬‬
‫‪ ‬منوهاي نرم افزار به ترتيب زير مي باشد ‪:‬‬
‫‪File; Edit; LINGO; Window; Help‬‬
‫منويي که بيشتر به چشم آمده و در واقع منوي اصلي نرم افزار مي باشد منوي‬
‫‪ LINGO‬ست‪ ،‬با ساير منوها که در نرم افزارهاي تحت سيستم عامل ‪Windows‬‬
‫عموما موجود مي باشند پيشتر آشنا هستيد‪.‬‬
‫‪ Toolbar ‬شامل ابزارهاي ‪( Shortcut‬ميانبر) موجود در منوها مي باشد‪.‬‬
‫‪ ‬پنجره ي مدل نويس ي محل پياده سازي مسئله ي بهينه سازي فرموله شده طبق قواعد‬
‫لينگوست‪.‬‬
‫‪16‬‬
‫‪Menus‬‬
‫‪Toolbar‬‬
‫‪17‬‬
‫پنجره ي مدل نويس ي‬
‫‪ ‬توسعه ي يک مدل بهينه سازي‬
‫يک شرکت کامپيوتري دو نوع کامپيوتر استاندارد و توربو توليد مي کند‪ .‬سود هر کامپيوتر استاندارد براي‬
‫اين شرکت ‪ $100‬و هر دستگاه توربو برابر ‪ $150‬است‪ .‬در شرکت‪ ،‬خط توليد کامپيوتر استاندارد‬
‫حداکثر تا ‪ 100‬دستگاه در روز مي تواند توليد کند‪ .‬همچنين حداکثر توان توليد خط توربو برابر ‪120‬‬
‫دستگاه در روز اعالم شده است‪ .‬شرکت نيروي کار محدود ‪ 160‬نفر ساعت در هر روز در اختيار دارد‪.‬‬
‫کامپيوترهاي استاندارد يک ساعت نيروي کار الزم دارند در حالي که کامپيوترهاي توربو ‪ 2‬ساعت نيروي‬
‫کار نياز دارند‪ .‬مساله اي که شرکت با آن روبروست اين است که ترکيبي از کامپيوترهاي استاندارد و‬
‫توربو را براي توليد انتخاب کند که سودش را بيشينه کند در حالي که از محدوديت هاي توان خطوط‬
‫توليد و ظرفيت نيروي کار تجاوز نکند‪.‬‬
‫‪18‬‬
‫يک مدل بهينه سازي شامل موارد زير است ‪:‬‬
‫‪ ‬تابع هدف – فرمولي است که دقيقا آنچهه را کهه مهي خواهيهد بهينهه کنيهد‪ ،‬بيهان مهي‬
‫کند‪ .‬در مدل هاي مربوط به کسب و کار اين يک تهابع سهود اسهت کهه مهي خواهيهد آن‬
‫را بيشينه کنيد و يا يک تابع هزينه است که مهي خواهيهد آن را کمينهه کنيهد‪ .‬مهدل هها‬
‫ممکههن اسههت حههداکثر يههک تههابع هههدف داشههته باشههد‪ .‬در مثههالي کههه داريههم‪ ،‬تههابع هههدف‪،‬‬
‫سود شرکت را بهه صهورت تهابعي از خروجهي کامپيوترههاي اسهتاندارد و توربهو محاسهبه‬
‫مي کند‪.‬‬
‫‪19‬‬
‫‪ ‬متغيرههها – کميههت هههايي هسههتند کههه تحههت کنتههرل شههما هسههتند و شههما بايههد تص هميم‬
‫بگيريد که بهترين مقادير اين متغير ها کدامند؛ به همين دليل گاها به آنها متغير هاي‬
‫تصههميم گيههري نيههز مههي گوينههد‪ .‬هههدف بهينههه سههازي يههافتن مقههاديري بههراي متغيرهههاي مههدل‬
‫است که با توجه به همه شهرايط محهدود کننهده کهه روي متغيرهها اعمهال مهي شهوند‪،‬‬
‫بهتههرين مقههدار را بههراي تههابع هههدف توليههد کننههد‪ .‬در ايههن مثههال مهها دو متغيههر تصههميم گيههري‬
‫يکي مربوط به تعداد کامپيوترهاي استاندارد و ديگري مربوط به تعداد کامپيوترهاي‬
‫توربو داريم‪.‬‬
‫‪20‬‬
‫‪ ‬محدوديت ها – تقريبا بدون استثنا‪ ،‬برخي محدوديت ها براي مقاديري که متغيرها مي‬
‫توانند اتخاذ کنند خواهد بود‪ .‬حداقل يک منبهع محهدود خواههد بهود‪( .‬بهراي مثهال زمهان‪،‬‬
‫مواد اوليه‪ ،‬بودجه دپارتمان شما و ‪ )...‬اين محهدوديت هها بهه وسهيله تهوابعي از متغيرههاي‬
‫م ههدل بي ههان م ههي ش ههوند‪ .‬اي ههن فرم ههول ه هها ب ههه عن ههوان مح ههدوديت ش ههناخته م ههي ش ههود‪ ،‬چ ههون‬
‫مقاديري را که متغيرها مي توانند بگيرند‪ ،‬محدود مي کنند‪.‬‬
‫‪21‬‬
‫در اين مثال ما براي هر خط توليد يک محدوديت و براي کل نيروي کار استفاده شده‬
‫نيز يک محدوديت داريم‪.‬‬
‫متغيرهاي ‪ Standard‬و ‪ Turbo‬را به عنوان تعداد کامپيوترهاي استاندارد و توربو‬
‫که شرکت مي خواهد توليد کند در نظر مي گيريم‪ .‬هدف شرکت بيشينه کردن سود کل‬
‫است که اين سود برابر مجموع سود حاصل از کامپيوترهاي استاندارد و توربو است ‪:‬‬
‫;‪Max = 100 * Standard + 150 * Turbo‬‬
‫‪22‬‬
‫حال محدوديت مربوط به ظرفيت خطوط توليد را اعمال مي کنيم ‪:‬‬
‫;‪Standard <= 100‬‬
‫;‪Turbo <= 120‬‬
‫محدوديت مربوط به نيروي کار نيز بصورت زير است ‪:‬‬
‫;‪! Our labor supply is limited‬‬
‫‪<= 160; Standard + 2 * Turbo‬‬
‫‪23‬‬
‫وقتي حل شروع مي شود‪ ،‬نرم افزار پنجره‬
‫وضعيت حل کننده (‪ )Solver Status‬را‬
‫مانند شکل زير نمايش مي دهد‪:‬‬
‫‪24‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪25‬‬
‫کادر متغيرها‪ :‬تعداد کل متغيرها در مدل‪ ،‬تعداد متغيرهاي غيرخطي (‪ )nonlinear‬و‬
‫تعداد متغيرهاي صحيح‬
‫کادر محدوديتها‪ :‬تعداد کل محدوديتها و تعداد محدوديتهاي غيرخطي‬
‫کادر غيرصفرها‪ :‬تعداد کل ضرايب غيرصفر در مدل‪ ،‬و تعدادي از آنها که روي متغيرهاي‬
‫غيرخطي ظاهر مي شوند‪.‬‬
‫کادر حافظه اشغال شده‪ :‬اين کادر‪ ،‬مقدار حافظه مولد مدل ‪ LINGO‬از سهم‬
‫حافظه آن که در حال استفاده ميباشد‪.‬‬
‫کادر مدت زمان سپري شده‪ :‬کل زمان سپري شده براي توليد و حل مدل‬
‫‪Model Class‬‬
‫دسته بندي هاي مدل را نشان مي دهد‪ .‬دسته هاي احتمالي عبارتند از‬
‫‪ : LP ‬همه عبارتها خطي هستند و مدل محدوديت عدد صحيحي روي متغيرها ندارد‪.‬‬
‫‪ : QP ‬همه عبارات خطي يا درجه دوم هستند‪ ،‬مدل محدب است و محدوديت عدد صحيح وجود ندارد‪.‬‬
‫‪ : ILP ‬همه عبارات خطي هستند و زيرمجموعه اي از متغيرها‪ ،‬به مقادير صحيح محدود مي شوند‪.‬‬
‫‪ : IQP ‬همه عبارات خطي يا درجه دوم هستند‪ .‬مدل محدب است و زيرمجموعه اي از متغيرها‪ ،‬محدوديت عدد‬
‫صحيح دارند‪.‬‬
‫‪ :PILP ‬همه عبارات خطي هستند و همه متغيرها به مقادير صحيح محدود مي شوند‪.‬‬
‫‪ :PIQP ‬همه عبارات خطي يا درجه دوم هستند‪ ،‬مدل محدب است و همه متغيرها به مقادير صحيح محدود مي‬
‫شوند‪.‬‬
‫‪ : NLP ‬حداقل يکي از روابط در مدل‪ ،‬نسبت به متغيرها غيرخطي است‪.‬‬
‫‪ :INLP ‬حداقل يکي از عبارات در مدل غيرخطي است و زيرمجموعه اي از متغيرها‪ ،‬محدوديت عدد صحيح دارد‪ .‬به‬
‫طور کلي حل اين دسته از مدلها بسيار سخت خواهد بود‪ ،‬مگر براي کوچکترين موارد‪.‬‬
‫‪ :PINLP ‬حداقل يکي از عبارات در مدل غيرخطي است و همه متغيرها محدوديت عدد صحيح دارند‪ .‬بطور کلي حل‬
‫اين دسته از مدلها بسيار سخت خواهد بود‪ ،‬مگر براي کوچکترين موارد‪.‬‬
‫‪26‬‬
State

:‫ حاالت ممکن عبارتند از‬.‫وضعيت حل جاري را نشان مي دهد‬
Global Optimum
Local Optimum
Feasible
Unbounded
Interrupted
Undetermined
27
‫‪‬‬
‫‪‬‬
‫‪Objective‬‬
‫‪Infeasibility‬‬
‫مقاديري که همه محدوديتهاي مدل توسط آنها نقص مي شوند (از آن تجاوز مي کنند) را‬
‫ليست مي کند‬
‫‪‬‬
‫‪Iteration‬‬
‫تعداد مراحل حل‬
‫‪28‬‬
‫اطالعاتي مربوط به چندين حل کننده ويژه‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫حل کننده انشعاب و تحديد(‪)Branch and Bound Solver‬‬
‫حل کننده عمومي(‪)Global Solver‬‬
‫حل کننده چند آغازه (‪)Multistart Solver‬‬
‫فيلدهاي اين کادر با اجراي يکي از اين سه حل کننده بهنگام مي شوند‪.‬‬
‫‪29‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪30‬‬
‫‪ :Solver Type‬نوع حل کننده ويژه مورد استفاده‬
‫‪ :Best OBJ‬مقدار تابع هدف براي بهترين حلي که تا کنون بدست آمده است‪.‬‬
‫‪ :OBJ Bound‬کران نظري بر روي مقدار تابع هدف را نشان مي دهد‪.‬‬
‫‪ :Steps‬تعدا مراحلي که توسط ‪ Solver‬ادامه يافته است‪.‬‬
‫‪ :Active‬تعداد زير مسئله هاي فعالي که براي تحليل باقي مانده اند‪.‬‬
31
‫‪Objective value: 14500.0000‬‬
‫مشخص مي کند که مقدار بهينه تابع هدف ‪ 14500‬است‪.‬‬
‫‪ Value‬مقدار متغير در جواب بهينه مدل خطي را مي دهد‪ .‬بنابراين جواب بهينه‬
‫توليد ‪ 100‬کامپيوتر ‪ STANDARD‬و ‪ 30‬کامپيوتر‪ ، TURBO‬است‪.‬‬
‫‪ Reduced Cost‬ضريب متغير در سطر صفر جدول بهينه را مي دهد (مسئله‬
‫ماکزيمم سازي)‪ .‬همانگونه که مي دانيد بايد هزينه کاهش يافته هر متغير پايه برابر‬
‫صفر باشد‪ .‬براي يک متغير غير پايه ‪ ،xj‬هزينه کاهش يافته مقداري است که اگر ‪، xj‬‬
‫‪ 1‬واحد اضافه شود‪ ،‬به آن اندازه‪ ،‬جواب بهينه کاهش مي يابد (درحالي که بقيه‬
‫متغيرهاي غير پايه برابر صفر بمانند)‪.‬‬
‫‪32‬‬
‫در قسمت بعدي از خروجي يا ‪ Report‬مشاهده مي کنيم که هر خط مدل با‬
‫شماره اي مشخص شده و در مقابل آن دو عبارت ‪ Slack or Surplus‬و ‪Dual Price‬‬
‫مشاهده مي شود ‪:‬‬
‫دهد‪.‬‬
‫‪ Slack or Surplus‬مقدار کمبود يا اضافي (مازاد) در جواب بهينه را نشان مي‬
‫‪ Dual Price‬يا قيمت سايه مقداري است که اگر سمت راست محدوديت‪ ،‬يک‬
‫واحد اضافه شود‪ ،‬به آن اندازه جواب بهينه‪ ،‬بهبود مي يابد ( با فرض اينکه اين‬
‫تغييرات باعث از دست رفتن پايه بهينه فعلي نمي شوند )‪ .‬اگر بعد از يک تغيير در طرف‬
‫راست محدوديت‪ ،‬پايه فعلي ديگر بهينه نماند‪ ،‬قيمت هاي سايه محدوديت ها ممکن‬
‫است تغيير کند‪.‬‬
‫‪33‬‬
‫انواع مسائل‬
‫لينگو قادر به حل مسائل مختلف بهينه سازي از جمله برنامه هاي خطي‪،‬‬
‫کوآدراتيک‪ ،‬خطي عدد صحيح‪ ،‬کوآدراتيک عدد صحيح‪ ،‬عدد صحيح خطي خالص‪،‬‬
‫عدد صحيح کوآدراتيک خالص‪ ،‬غير خطي‪ ،‬غير خطي عدد صحيح و غير خطي عدد‬
‫صحيح خالص مي باشد‪ .‬مدل هاي فوق توسط لينگو تشخيص داده شده و در‬
‫گزارش خروجي مدل پس از حل آن به ترتيب فوق ‪،IQP ،ILP ،QP ،LP‬‬
‫‪ PINLP ،INLP ،NLP ،PIQP ،PILP‬خواهيم داشت‪ .‬در اينجا به پياده‬
‫سازي و تحليل يک مدل خطي مي پردازيم‪.‬‬
‫‪34‬‬
‫‪Case Study‬‬
‫شرکت داکوتا فرنيچر‪ ،‬توليد کننده ميز تحرير‪ ،‬ميز و صندلي است‪ .‬توليد هر‬
‫کدام از انواع مبلمان به الوار و دو نوع نيروي کار ماهر در دو زمينه نجاري و پرداخت‬
‫نياز دارد‪ .‬مقدار هر يک از منابع مورد نياز براي توليد هر يک از انواع مبلمان در‬
‫جدول ذيل آمده است ‪:‬‬
‫‪35‬‬
‫منبع‬
‫ميز تحرير‬
‫ميز‬
‫صندلي‬
‫الوار (فوت تخته)‬
‫‪8‬‬
‫‪6‬‬
‫‪1‬‬
‫زمان پرداخت (ساعت)‬
‫‪4‬‬
‫‪2‬‬
‫‪5/1‬‬
‫زمان نجاري (ساعت)‬
‫‪2‬‬
‫‪5/1‬‬
‫‪5/0‬‬
‫در حال حاضر‪ 48 ،‬فوت تخته از الوارها‪ 20 ،‬ساعت زمان پرداخت و ‪ 8‬ساعت‬
‫زمان نجاري موجود است‪ .‬هر ميز تحري ‪ 60‬دالر‪ ،‬ميز ‪ 30‬دالر و صندلي ‪ 20‬دالر به‬
‫فروش مي رسد‪ .‬و حداکثر تقاضاي ميز ‪ 5‬عدد مي باشد‪ .‬با فرض اينکه منابع در‬
‫دسترس به تازگي تدارک ديده شده باشند‪ ،‬شرکت داکوتا مي خواهد کل سود خود را‬
‫به حداکثر برساند‪.‬‬
‫متغير هاي تصميم بصورت ذيل تعريف شده اند ‪:‬‬
‫‪ : Desk‬تعداد ميز تحريرهاي توليد شده‬
‫‪ : Table‬تعداد ميزهاي توليد شده‬
‫‪ : Chair‬تعداد صندلي هاي توليد شده‬
‫‪36‬‬
‫شرکت داکوتا به حل مدل خطي زير نياز دارد ‪:‬‬
‫‪Max z = 60 Desk + 30 Table + 20 Chair‬‬
‫‪(8 Desk + 6 Table + Chair <= 48‬محديديت الوار)‬
‫‪s.t‬‬
‫‪(4 Desk + 2 Table + 1.5 Chair <= 20‬محدوديت پرداخت)‬
‫‪(2 Desk + 1.5 Table + 0.5 Chair <= 8‬محدوديت نجاري)‬
‫‪(Table <= 5‬محدوديت تقاضاي ميز)‬
‫‪Desk, Table, Chair >= 0‬‬
‫‪37‬‬
‫مدل فوق به زبان لينگو در قسمت ‪ Lingo Model‬وارد مي شود ‪:‬‬
‫‪38‬‬
‫با استفاده از گزينه ‪ Solve‬جواب نهايي سيمپلکس بصورت زير خواهد بود ‪:‬‬
‫‪39‬‬
‫‪Objective value: 280.0000‬‬
‫مشخص مي کند که مقدار بهينه تابع هدف ‪ 280‬است‪.‬‬
‫‪ Value‬مقدار متغير در جواب بهينه مدل خطي را مي دهد‪ .‬بنابراين جواب بهينه‬
‫داکوتا توليد ‪ 2‬ميز تحرير‪ ،‬صفر ميز‪ ،‬و ‪ 8‬صندلي است‪.‬‬
‫‪ Reduced Cost‬ضريب متغير در سطر صفر جدول بهينه را مي دهد (مسئله‬
‫ماکزيمم سازي)‪ .‬همانگونه که مي دانيد بايد هزينه کاهش يافته هر متغير پايه برابر‬
‫صفر باشد‪ .‬براي يک متغير غير پايه ‪ ،xj‬هزينه کاهش يافته مقداري است که اگر ‪، xj‬‬
‫‪ 1‬واحد اضافه شود‪ ،‬به آن اندازه‪ ،‬جواب بهينه کاهش مي يابد (درحالي که بقيه‬
‫متغيرهاي غير پايه برابر صفر بمانند)‪ .‬در خروجي لينگو براي مسئله داکوتا‪ ،‬هزينه‬
‫کاهش يافته ميز برابر ‪ 5‬است‪ .‬اين يعني اگر داکوتا بخواهد يک ميز توليد کند‪ ،‬درآمد‬
‫به اندازه ‪ 5‬دالر کاهش خواهد يافت‪.‬‬
‫‪40‬‬
‫در قسمت بعدي از خروجي يا ‪ Report‬مشاهده مي کنيم که هر خط مدل با‬
‫شماره اي مشخص شده و در مقابل آن دو عبارت ‪ Slack or Surplus‬و ‪Dual Price‬‬
‫مشاهده مي شود ‪:‬‬
‫‪ Slack or Surplus‬مقدار کمبود يا اضافي (مازاد) در جواب بهينه را نشان مي‬
‫دهد‪ .‬بنابراين ‪ 24‬فوت تخته الوار و ‪ 5‬عدد ميز به صورت مازاد وجود خواهد داشت‪.‬‬
‫‪ Dual Price‬يا قيمت سايه مقداري است که اگر سمت راست محدوديت‪ ،‬يک‬
‫واحد اضافه شود‪ ،‬به آن اندازه جواب بهينه‪ ،‬بهبود مي يابد ( با فرض اينکه اين‬
‫تغييرات باعث از دست رفتن پايه بهينه فعلي نمي شوند )‪ .‬اگر بعد از يک تغيير در طرف‬
‫راست محدوديت‪ ،‬پايه فعلي ديگر بهينه نماند‪ ،‬قيمت هاي سايه محدوديت ها ممکن‬
‫است تغيير کند‪.‬‬
‫‪41‬‬
‫پس از حل مدل توسط ‪ Solve‬با استفاده از گزينه ‪ Range‬موجود در منوي ‪ LINGO‬گزارش‬
‫خروجي تحليل حساسيت مدل را مشاهده مي کنيم‪ ،‬در صورت مشاهده خطا وارد ‪LINGO Option‬‬
‫شده و گزينه ‪ Dual Computations‬از قسمت ‪ General Solver‬را در حالت سوم قرار دهيد‪.‬‬
‫‪42‬‬
‫تحليل حساسيت نشان مي دهد که ضرايب تابع تا چه ميزان مي‬
‫توانند افزايش يا کاهش يابند بدون اينکه پايه بهينه مسئله (مجموعه‬
‫متغيرهاي غير صفر) عوض شود‪ .‬تحليل حساسيت شامل دو بخش است‪،‬‬
‫يکي مربوط به تابع هدف و ديگري مربوط به محدوديت ها‪ ،‬که در هر کدام‬
‫به تفکيک مقدار واقعي و مقادير کاهش و افزايش قيد شده است‪.‬‬
‫در پايان با استفاده از گزينه ‪ Solution‬در منوي ‪ LINGO‬مي‬
‫توانيد نمايش گرافيکي از هر يک از متغيرهاي موجود در مدل را داشته‬
‫باشيد‪.‬‬
‫‪43‬‬
‫‪‬‬
‫فرض کنيد شرکت ‪ 6 Wireless Widget‬انبار براي تامين‪ ،‬و ‪ 8‬مرکز فروش کاالي‬
‫توليدي دارد‪ .‬هر انبار محدوديت مقدار کاالي انبار شده دارد که بيشتر از آن مقدار‪،‬‬
‫انبار کردن آن کاال مقدور نيست و نيز هر مرکز فروش تقاضايي دارد‪ ،‬که مي بايست‬
‫حداقل به اندازه آن مقدار تامين شود‪ .‬شرکت مي خواهد تعداد کااليي که از هر انبار‪،‬‬
‫به هر مرکز فروش حمل مي شود را‪ ،‬به گونه اي که کل هزينه حمل مينيمم گردد تعيين‬
‫کند‪.‬‬
‫‪V1‬‬
‫‪WH1‬‬
‫‪V2‬‬
‫‪WH2‬‬
‫‪V3‬‬
‫‪WH3‬‬
‫‪V4‬‬
‫‪WH4‬‬
‫‪V5‬‬
‫‪WH5‬‬
‫‪V6‬‬
‫‪WH6‬‬
‫‪V7‬‬
‫‪V8‬‬
‫‪44‬‬
‫کاالي موجود‬
‫انبار‬
‫‪60‬‬
‫‪1‬‬
‫‪55‬‬
‫‪2‬‬
‫‪51‬‬
‫‪3‬‬
‫‪43‬‬
‫‪4‬‬
‫‪41‬‬
‫‪5‬‬
‫‪52‬‬
‫‪6‬‬
‫تقاضاي کاال‬
‫فروشنده‬
‫‪35‬‬
‫‪1‬‬
‫‪37‬‬
‫‪2‬‬
‫‪22‬‬
‫‪3‬‬
‫‪32‬‬
‫‪4‬‬
‫‪41‬‬
‫‪5‬‬
‫‪32‬‬
‫‪6‬‬
‫‪43‬‬
‫‪7‬‬
‫ظرفيت هر انبار‬
‫‪45‬‬
‫‪8‬‬
‫‪38‬‬
‫تقاضاي هر فروشنده‬
‫‪V8‬‬
‫‪V7‬‬
‫‪V6‬‬
‫‪V5‬‬
‫‪V4‬‬
‫‪V3‬‬
‫‪V2‬‬
‫‪V1‬‬
‫‪9‬‬
‫‪5‬‬
‫‪2‬‬
‫‪4‬‬
‫‪7‬‬
‫‪6‬‬
‫‪2‬‬
‫‪6‬‬
‫‪Wh1‬‬
‫‪2‬‬
‫‪8‬‬
‫‪5‬‬
‫‪8‬‬
‫‪3‬‬
‫‪5‬‬
‫‪9‬‬
‫‪4‬‬
‫‪Wh2‬‬
‫‪3‬‬
‫‪3‬‬
‫‪4‬‬
‫‪7‬‬
‫‪9‬‬
‫‪1‬‬
‫‪2‬‬
‫‪5‬‬
‫‪Wh3‬‬
‫‪1‬‬
‫‪7‬‬
‫‪2‬‬
‫‪9‬‬
‫‪3‬‬
‫‪7‬‬
‫‪6‬‬
‫‪7‬‬
‫‪Wh4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪2‬‬
‫‪7‬‬
‫‪5‬‬
‫‪9‬‬
‫‪3‬‬
‫‪2‬‬
‫‪Wh5‬‬
‫‪3‬‬
‫‪4‬‬
‫‪1‬‬
‫‪8‬‬
‫‪2‬‬
‫‪2‬‬
‫‪5‬‬
‫‪5‬‬
‫‪Wh6‬‬
‫هزينه حمل هر کاال‬
‫ مقدار کاالي حمل شده از‬:VOLUME_I_J
J ‫ به مرکز فروش‬I ‫انبار‬

MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 +
6 * VOLUME_1_3 + 7 * VOLUME_1_4 +
4 * VOLUME_1_5 +
.
.
8 * VOLUME_6_5 + VOLUME_6_6 +
4 * VOLUME_6_7 + 3 * VOLUME_6_8
Minimize ijCOSTij  VOLUMEij
LINGO:
MIN= @SUM(LINK(I,J):
COST(I,J)* VOLUME(I,J);
Math
Notation
LINGO Syntax
Minimize
MIN=
ij
@SUM(LINK(I,J):
COSTij
COST(I,J)

*
VOLUMEij
VOLUME(I,J)
46
‫ محدوديتهاي تقاضا‬:‫ دسته اول‬
VOLUME_1_1 + VOLUME_2_1+ VOLUME_3_1+ VOLUME_4_1+
VOLUME_5_1+ VOLUME_6_1=35
I VOLUMEij = DEMANDj, for all in VENDORS
LINGO:
@FOR(VENDORS(J):
@SUM(WAREHOUSE(I): VOLUME(I,J))=
DEMAND(J));
47
‫ محدوديتهاي ظرفيت‬:‫دسته دوم‬

j VOLUMEij <= CAPi, for all in WAREHOUSES
LINGO:
@FOR(WAREHOUSES(I):
@SUM(VENDORS(J): VOLUME(I, J))<=
CAPACITY(I));
48
SETS:
WAREHOUSES: CAPACITY;
VENDORS: DEMAND;
LINKS(WAREHOUSES, VENDORS): COST, VOLUME;
ENDSETS
Member
Index
Shipping
Arc
1
WH1V1
2
WH1V2
3
WH1V3
…
…
47
WH6V7
48
WH6V8
49
50
51
‫ازمنوي ‪ LINGO‬و گزينه ‪ Solution‬را انتخاب کرده سپس با انتخاب ‪VOLUME‬‬
‫و ‪ Nonzeros Only‬خواهيم داشت‪:‬‬
‫‪52‬‬
‫يک برنامه در لينگو با کلمه ”‪ “Model‬آغاز و به کلمه ”‪ “End‬ختم مي شود و‬
‫معموال از چهار بخش زير تشکيل مي شود ‪:‬‬
‫‪ ‬بخش مجموعه ها؛‬
‫‪ ‬بخش داده ها؛‬
‫‪ ‬تابع هدف؛‬
‫‪ ‬بخش محدوديت ها؛‬
‫همچنين مي توان در يک برنامه‪ ،‬تابع هدف را بعد از نوشتن محدوديت ها آورد‪.‬‬
‫‪53‬‬
‫مجموعه ها در لينگو در واقع قالبي براي تعريف متغيرهاي برنامه مي باشند (اين‬
‫متغيرها مي توانند متغير تصميم گيري و يا پارامترهاي عددي مدل باشند)‪ .‬در لينگو دو‬
‫نوع مجموعه داريم ‪:‬‬
‫‪ ‬مجموعه هاي مستقل؛ ‪Primitive Sets‬‬
‫‪ ‬مجموعه هاي وارث ؛ ‪Derived Sets‬‬
‫مجموعه هاي مستقل براي تعريف متغيرهاي آرايه اي يک بعدي و مجموعه‬
‫هاي وارث براي تعريف آرايه هاي چند بعدي مورد استفاده قرار مي گيرند‪.‬‬
‫‪54‬‬
‫در يک مدل لينگو‪ ،‬مجموعه ها در يک قسمت اختياري که قسمت مجموعه ها( ‪Sets‬‬
‫‪ )Section‬ناميده مي شود تعريف ميشوند‪ .‬اين قسمت با کلمه کليدي ‪SETS:‬‬
‫شروع و با ‪ ENDSETS‬خاتمه مي يابد‪.‬‬
‫ساختار کلي تعريف مجموعه هاي مستقل در لينگو به صورت زير مي باشد ‪:‬‬
‫خصوصيات مجموعه‪ / :‬عناصر مجموعه ‪ /‬نام مجموعه;‬
‫مثال‪:‬‬
‫;‪WAREHOUSES / WH1 WH2 WH3 WH4 WH5 Wh6/: CAPACITY‬‬
‫;‪WAREHOUSES/ WH1 ..WH6/ : CAPACITY‬‬
‫;‪WAREHOUSES/ 1..6 / : CAPACITY, LOCATION, DOCKS‬‬
‫‪55‬‬
‫نکته قابل ذکر در مورد عناصر مجموعه اين است که اسم عناصر مي تواند‬
‫عدد‪ ،‬رشته اي از اعداد و يا حروف باشد‪( .‬فقط بايد با حرف شروع شود‪).‬‬
‫براي آشنايي بيشتر چند مجموعه در پايين آمده است ‪:‬‬
‫‪Department / Industrial, Mechanic, Civil, Electronic,‬‬
‫;‪Computer, Material/: Average‬‬
‫;‪WAREHOUSE / WH1, WH2, WH3/: CAPACITY‬‬
‫;‪CUSTOMER / C1, C2, C3, C4/: DEMAND‬‬
‫‪56‬‬
Implicit Member List
Format
Example
Set Members
1 ..n
1 .. 5
1,2,3,4,5
stringM .. stringN
TRUCKS3 ..
TRUCKS204
TRUCKS3,TRUCKS4,…,TRUCKS2
04
dayM .. dayN
MON .. FRI
MON, TUE, WED, Thu, FRI
monthM .. MonthN
OCT .. JAN
OCT, NOV, DEC, JAN
monthYearM .. monthYearN
OCT2001 .. JAN2002
OCT2002, NOV2001, DEC2001,
JAN2002
57
‫در لينگو نمي توان به صورت مستقيم ماتريس و آرايه هاي چند بعدي را تعريف‬
‫کرد‪ .‬براي تعريف آرايه هاي چند بعدي از مجموعه هاي وارث استفاده مي کنيم‪.‬‬
‫ساختار کلي مجموعه هاي وارث بصورت زير است ‪:‬‬
‫‪Sets:‬‬
‫;‪PRODUCT /A B/‬‬
‫;‪MACHINE / M N/‬‬
‫;‪WEEK / 1 2/‬‬
‫;)‪ALLOWED (PRODUCT, MACHINE, WEEK‬‬
‫‪Endsets‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪Index‬‬
‫)‪(B,N2‬‬
‫)‪(B,N,1‬‬
‫)‪(B,M,2‬‬
‫)‪(B,M,1‬‬
‫)‪(A,N,2‬‬
‫)‪(A,N,1‬‬
‫)‪(A,M,2‬‬
‫)‪(A,M,1‬‬
‫‪Member‬‬
‫‪58‬‬
‫يک ليست اعضاي مشخص‬
•
ALLOWED( PRODUCT, MACHINE, WEEK)/ A M 1, A N 2, B N 1/;
‫ استفاده از يک شرط منطقي‬:‫يک فيلتر عضويت‬
•
HEAVY_DUTY(TRUCKS) | CAPACITY(&1) #GT# 50000:
59
‫براي درک بهتر به مثال هاي کلي زير توجه کنيد ‪:‬‬
‫فرض کنيد کارخانه اي سه نوع ماشين مختلف توليد مي کند و مشتريان پنج شهر‬
‫مختلف نيز سفارش هاي متفاوتي از هر نوع ماشين به کارخانه مي دهند‪ .‬حال زير برنامه‬
‫ي زير را در نظر بگيريد‪:‬‬
‫‪Sets:‬‬
‫;‪Car/1..3/‬‬
‫;‪City/1..5/‬‬
‫;‪Demand (Car, City): Dem‬‬
‫‪Endsets‬‬
‫اين زير برنامه مجموعه اي مستقل ار نوع ‪ Car‬به صورت آرايه تک بعدي ‪3‬‬
‫خانه اي و مجموعه اي مستقل از نوع ‪City‬به صورت يک آرايه تک بعدي ‪ 5‬خانه اي‬
‫توليد مي کند‪( .‬دقت کنيد که متغيري از نوع ‪ Car‬يا ‪ City‬نداريم‪).‬‬
‫‪60‬‬
‫در خط چهارم اين زير برنامه‪ ،‬مجموعه وارث ‪ Demand‬به صورت يک ماتريس‬
‫‪ 3*5‬و ماتريس ‪ Dem‬از نوع ‪ Demand‬تعريف مي شود؛ بنابراين در بخش‬
‫مقداردهي‪ ،‬مي بايست ‪ 15‬عدد به متغير ‪ Dem‬نسبت داد‪ ،‬که در اين حالت مقدار‬
‫تقاضاي شهر ‪ j‬از ماشين ‪i‬در خانه اي واقع در سطر ‪i‬ام و ستون ‪j‬ام ماتريس ‪Dem‬‬
‫قرار مي گيرد‪.‬‬
‫در قسمت داخل اسلش ها (انديس هايي که با هم ارتباط دارند) مي توانيم‬
‫انديس هايي را ذکر کنيم که ارتباطشان با هم تعريف شده است‪ .‬در صورت حذف‬
‫قسمت بين اسلش ها‪ ،‬فرض بر اين است که ارتباط تمام انديس ها در تمام بعد ها‪ ،‬با‬
‫هم تعريف شده است و متغيرهاي وابسته به مجموعه‪ ،‬با تمام انديس هاي خود مي‬
‫توانند مقدار بگيرند‪ .‬استفاده از قسمت انديس هايي که با هم ارتباط دارند به‬
‫خصوص در مسائل کنترل پروژه کاربرد دارد که خود مبحثي جداگانه است‪ .‬مثال پيش‬
‫رو مطالب را بيشتر براي ما روشن مي سازد‪:‬‬
‫‪61‬‬
SETS:
TASK/A B C D E F G H I J K/: T;
PRED (TASK, TASK) / A,B B,C C,F C,G F,J G,J J,K D,E
E,H E,I H,J I,J/;
STATION /1..4/;
TXS (TASK, STATION): X;
ENDSETS
62
‫در مثال فوق مجموعه ‪ TASK‬از ‪ 11‬عضو تشکيل يافته است و مجموعه‬
‫‪ STATION‬از ‪ 4‬عضو‪ .‬با اين وجود مجموعه ‪ PRED‬به جاي ‪ 121=11*11‬عضو‬
‫تنها از ‪ 12‬عضو مشخص شده‪ ،‬تشکيل شده در حالي که ‪ TXS‬شامل ‪ 32=4*8‬عضو‬
‫مي باشد‪.‬‬
‫توجه کنيد که در برنامه هاي مختلف گاهي مواردي پيش مي آيد که هنگام کار با‬
‫مجموعه ها (در تعريف مجموعه ها و يا هنگام استفاده از توابع ‪ for‬و يا ‪ ) sum‬برخي‬
‫از انديس هاي مجموعه را مي بايست ناديده گرفت و يا هر شرط خاص ديگري را بايد‬
‫با برخي از انديس هاي مجموعه ها (و نه تمامي آنها) اعمال کرد؛ در اين حالت از‬
‫عملگرهاي مختلف و عبارات شرطي استفاده مي کنيم که در فصل هاي آتي در مورد‬
‫آنها به تفصيل بحث خواهيم کرد‪.‬‬
‫‪63‬‬
‫بخش داده ها به ما اين امکان را مي دهد که داده ها را از بقيه مدل‬
‫جدا کنيم‪ .‬اين کار باعث مي شود در هنگام تغيير و يا توسعه مدل راحت تر و‬
‫کم اشتباه تر عمل کنيم‪ .‬در بخش داده که مابين دو کلمه کليدي ‪ DATA‬و‬
‫‪ ENDDATA‬است مي توانيم مقادير پارامترها و اسم عناصر مجموعه‬
‫هايي را که در بخش قبلي تعريف شده اند مقداردهي کنيم‪.‬‬
‫‪64‬‬
: ‫ مثال زير توجه کنيد‬3 ‫به‬
1)
SETS:
SET1 / A, B, C/: X, Y;
ENDSETS
DATA:
X = 1, 2, 3;
Y = 4, 5, 6;
ENDDATA
65
2)
SETS
SET1 / A, B, C/: X, Y;
ENDSETS
DATA
X, Y = 1, 4,
2, 5,
3, 6;
ENDDATA
3)
SETS
SET1 : X, Y;
ENDSETS
DATA
SET1, X, Y = A 1 4
B25
C 3 6;
ENDDATA
66
‫در هر سه مثال فوق مجموعه ‪ SET1‬داراي سه عنصر ‪ B ،A‬و ‪ C‬است که دو خصيصه‬
‫‪ X‬و ‪ Y‬به آن نسبت داده شده و جواب هر سه برابر است با ‪:‬‬
‫‪X ( A ) = 1, X ( B ) = 2, X ( C ) = 3‬‬
‫‪)=6‬‬
‫‪Y ( A ) = 4, Y ( B ) = 5, Y ( C‬‬
‫پارامترهاي ‪ 1*1‬را مي توان مستقيما در قسمت داده ها تعريف و مقداردهي کرد‪ .‬مثال ‪:‬‬
‫‪DATA‬‬
‫;‪INTEREST_RATE = .085‬‬
‫‪ENDDATA‬‬
‫و يا‬
‫‪DATA‬‬
‫;‪INTEREST_RATE, INFLATION_RATE = .085, .03‬‬
‫‪ENDDATA‬‬
‫‪ INTEREST_RATE‬در هر دو مثال فوق برابر ‪ .085‬و در مثال دوم‬
‫‪ INFLATION_RATE‬برابر‪ .03‬است‪.‬‬
‫‪67‬‬
‫نقاط آغازي فقط در مدلهاي غيرخطي مورد استفاده قرار مي گيرد‪.‬‬
‫اگر مقادير آغازي تقريبا نزديک به مقادير بهينه باشند‪ ،‬در زمان الزم براي اجراي مدل صرفه‬
‫جويي خواهد شد‪.‬‬
‫مثال‪ :‬جواب (‪0‬و‪)1‬‬
‫;)‪Y<=@LOG(X‬‬
‫;‪X^2+ Y^2 <=1‬‬
‫‪Feasible solution found at iteration:‬‬
‫‪946‬‬
‫‪Variable‬‬
‫‪Value‬‬
‫‪Y‬‬
‫‪0.5309317E-05‬‬
‫‪X‬‬
‫‪1.000004‬‬
‫‪68‬‬
INIT ‫با اصالح مدل و استفاده از‬
INIT:
X= 0.999;
Y=0.002;
ENDINIT
Y<=@LOG(X);
X^2+ Y^2 <=1;
Feasible solution found at iteration:
450
Variable
Value
X
0.9999995
Y
0.000000
69
‫براي تسهيل مدل سازي‪ ،‬در لينگو توابع و عملگرهاي متفاوتي وجود‬
‫دارند‪ .‬حتي اگر با شکل کلي استفاده از اين توابع آشنايي نداشته باشيد‪،‬‬
‫لينگو اين شکل کلي را در اختيار شما قرار مي دهد‪ .‬براي اين منظور در‬
‫منوي ‪ Edit‬گزينه ‪ Paste Function‬را انتخاب نماييد‪ ،‬مالحظه مي کنيد‬
‫که ليستي از انواع توابع براي شما نمايش داده مي شود‪.‬‬
‫‪70‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪.9‬‬
‫‪71‬‬
‫عملگرهاي استاندارد‬
‫توابع رياضياتي ‪@Cos(X) ,@EXP(X), @Floor(X), @LGM(X),‬‬
‫)‪@LOG(X‬‬
‫توابع مالي )‪@FPA(I,N), @FPL(I,N‬‬
‫توابع احتمالي )‪@PBN(P,N,X), @PCX(N,X‬‬
‫توابع دامنه متغير )‪@BIN(variable), @FREE(variable‬‬
‫توابع مجموعه نگهدار ‪@IN(set_name,‬‬
‫‪Primitive_1,[Primitive_2…], @INDEX‬‬
‫توابع حلقه گردي مجموعه اي ‪@FOR, @SUM‬‬
‫توابع ورود و صدور‬
‫توابع متفرقه ‪@IF‬‬
‫کليه متغيرها در لينگو‪ ،‬از نوع نامنفي پيوسته هستند‪ ،‬مگر اينکه خالف آن قيد شود‪ .‬به طور‬
‫کلي متغيرها مي توانند هر مقداري از صفر تا مثبت بينهايت را بپذيرند‪.‬‬
‫براي دستيابي به اين مهم‪ ،‬لينگو چها تابع دامنه متغير را براي اعمال اين شرايط بر روي‬
‫متغيرها در اختيار شما قرار مي دهد تا بتوانيد دامنه پيش فرض متغير را ملغي کنيد‪.‬‬
‫‪ :@GIN‬متغير را محدود به پذيرش يک مقدار صحيح مي کند‪.‬‬
‫‪ :@BIN‬متغير را از نوع باينري (‪ 0‬يا ‪ )1‬قرار مي دهد‪.‬‬
‫‪ :@FREE‬به متغير اجازه پذيرش هر مقدار حقيقي اعم از مثبت يا منفي يا صفر را مي دهد‪.‬‬
‫‪ :@BND‬متغير را‪ ،‬ملزم به قرار گرفتن در يک بازه مشخص مي کند‪.‬‬
‫‪72‬‬
‫ساختار تابع ‪ @BIN‬براي استفاده از اين متغيرها اينگونه است‪:‬‬
‫;)‪@BIN(variable_name‬‬
‫که ‪ variable_name‬نام متغيري است که مي خواهيد مقدار صفر و يک اختيار کند‪.‬‬
‫مثال‪:‬‬
‫;)‪@BIN(X‬‬
‫متغير عدد صحيح ‪ X‬را از نوع باينري قرار مي دهد‪.‬‬
‫;))‪@BIN(INCLUDE(4‬‬
‫متغير )‪ INCLUDE(4‬را از نوع باينري قرار مي دهد‪.‬‬
‫;))‪@FOR(ITEMS:@BIN(INCUDE‬‬
‫کليه متغيرهاي خصوصيت ‪ INCLUDE‬را‪ ،‬از نوع صفر و يک قرار مي دهد‪.‬‬
‫‪73‬‬
‫‪‬‬
‫‪74‬‬
‫اين توابع قابليت اعمال يک سري از دستورات به تمام اعضاي مجموعه با استفاده از‬
‫يک دستور ساده را قادر مي سازند‪.‬‬
‫تابع‬
‫کاربرد‬
‫‪@FOR‬‬
‫قدرتمندترين تابع حلقه گردي مجموعه اي براي اعمال محدوديتها بر روي‬
‫اعضاي مجموعه‬
‫‪@SUM‬‬
‫پرکاربردترين تابع براي اعمال مجموع يک عبارت بر روي تمامي اعضاي‬
‫مجموعه‬
‫‪@MIN‬‬
‫اعمال مينمم يک عبارت در بين تمامي اعضاي مجموعه‬
‫‪@MAX‬‬
‫اعمال ماکسيمم يک عبارت در بين تمامي اعضاي مجموعه‬
‫‪@PROD‬‬
‫اعمال حاصلضرب يک عبارت در بين تمامي اعضاي يک مجموعه‬
‫بررس ي تک تک اين توابع از سطح کار ما فراتر است؛ همچنين به‬
‫خاطر عدم نياز به توابع مالي و احتمالي در برنامه ريزي خطي در اينجا فقط‬
‫به تشريح برخي توابع مي پردازيم‪.‬‬
‫(در صورتي که مايليد اطالعات بيشتري در ارتباط با ساير توابع لينگو‬
‫بدست آوريد در منوي ‪ Help‬گزينه ‪ Help Topics‬را انتخاب نماييد و‬
‫پنجره محاوره اي باز شده را در حالت ‪ Index‬قرار دهيد؛ سپس کلمه‬
‫‪ Function‬را تايپ کنيد‪ ،‬در اين حالت لينگو اطالعات مفيد بسياري در‬
‫اختيار شما قرار مي دهد‪).‬‬
‫‪75‬‬
‫نکته ‪:‬‬
‫قبل از معرفي توابع به اين نکته مهم توجه کنيد که در لينگو هنگام به‬
‫کار بردن توابع‪ ،‬ميبايست قبل از نام تابع از عالمت @ استفاده کرد‪.‬‬
‫‪ ‬در اينجا به بررس ي دو تابع ‪ FOR‬و ‪ SUM‬مي پردازيم‪.‬‬
‫‪76‬‬
‫اين تابع در دسته ‪ Set Looping‬يعني توابع حلقه اي قرار دارد و شکل‬
‫کلي آن بصورت زير مي باشد ‪:‬‬
‫;)‪@FOR( Set : expression‬‬
‫در صورت استفاده از عبارات شرطي به صورت زير عمل کنيد ‪:‬‬
‫;)‪@FOR( Set | condition: expression‬‬
‫وجود تابع ‪ For‬در لينگو در واقع يکي از برتري هاي بارز اين زبان مي‬
‫باشد‪ .‬از اين تابع براي نسبت دادن يک ويژگي به تمام يا بخش ي از اعضاي‬
‫يک مجموعه استفاده مي کنيم‪ .‬به مثال هاي زير توجه کنيد ‪:‬‬
‫‪77‬‬
‫فرض کنيد انباري داريم که در آن هفت قلم کاالي متفاوت نگهداري‬
‫مي کنيم‪:‬‬
‫‪SETS:‬‬
‫;‪Items /1..7/: Capacity‬‬
‫‪ENDSETS‬‬
‫حال فرض کنيد ظرفيت انبار محدود بوده و حداکثر ‪ 12‬واحد از هر قلم مي‬
‫توان در آن نگهداري کرد‪ .‬براي وارد کردن اين محدوديت به صورت زير‬
‫عمل مي کنيم ‪:‬‬
‫;)‪@For(Items (i): Capacity (i) <= 12‬‬
‫‪78‬‬
‫اين عبارت در واقع معادل عبارت زير است ‪:‬‬
‫;‪Capacity (1) <= 12‬‬
‫;‪Capacity (2) <= 12‬‬
‫;‪Capacity (3) <= 12‬‬
‫;‪Capacity (4) <= 12‬‬
‫;‪Capacity (5) <= 12‬‬
‫;‪Capacity (6) <= 12‬‬
‫;‪Capacity (7) <= 12‬‬
‫از آنجا که تمام متغيرهاي به کار رفته در مجموعه ‪ Items‬قرار دارند‪ ،‬عبارت باال‬
‫را به صورت زير نيز مي توان نوشت ‪:‬‬
‫;)‪@For(Items: Capacity <= 12‬‬
‫توجه کنيد که در صورتي که متغيرهاي به کار رفته در ‪ For‬متعلق به مجموعه‬
‫هاي متفاوت باشند نمي توان از شکل خالصه شده باال استفاده کرد‪.‬‬
‫‪79‬‬
‫حال فرض کنيد ظرفيت انبار فقط براي دو قلم کاالي آخر (اقالم ‪ 6‬و ‪7‬‬
‫) محدوديت داشته باشد؛ براي وارد کردن اين محدوديت از عبارات شرطي و‬
‫عملگرهاي منطقي استفاده مي کنيم ‪:‬‬
‫;)‪@For(Items (i) | i#GT#5: Capacity (i) <= 12‬‬
‫‪80‬‬
‫اين تابع نيز همانند تابع ‪ For‬در دسته توابع ‪ Set Looping‬قرار دارد‬
‫و شکل کلي کاربرد آن به صورت زير مي باشد ‪:‬‬
‫;)‪@SUM (Set: expression‬‬
‫در صورت استفاده از عبارات شرطي به صورت زير عمل کنيد ‪:‬‬
‫;)‪@SUM (Set | condition: expression‬‬
‫از اين تابع براي محاسبه حاصل جمع اعضاي يک مجموعه يا عبارتي‬
‫شامل اعضاي يک مجموعه استفاده مي کنيم‪ .‬براي روشن شدن مطلب‬
‫به مثال هاي زير توجه کنيد ‪:‬‬
‫‪81‬‬
‫فرض کنيد ‪ 5‬مشتري مختلف تقاضاهاي متفاوتي از کاالي ‪ X‬دارند؛ حال اين زير‬
‫برنامه را در نظر بگيريد ‪:‬‬
‫‪SETS:‬‬
‫;‪Customers /1 2 3 4 5/: Demand, cost‬‬
‫‪ENDSETS‬‬
‫‪DATA‬‬
‫;‪demand= 5 1 3 4 6‬‬
‫‪ENDDATA‬‬
‫حال اگر بخواهيم مجموع تقاضاها براي کاالي ‪ X‬را محاسبه نماييم‪ ،‬کافيست‬
‫عبارت زير را به برنامه بيافزاييم ‪:‬‬
‫;))‪Total_Demand = @Sum (Customers (i): Demand (i‬‬
‫‪82‬‬
‫در واقع اين عبارت معادل عبارت زير مي باشد ‪:‬‬
‫‪Total_Demand = Demand (1) + Demand (2) + Demand (3) +‬‬
‫;)‪Demand (4) + Demand (5‬‬
‫مي توانستيم از عبارت خالصه شده زير نيز استفاده کنيم ‪:‬‬
‫;)‪Total_Demand = @Sum (Customers: Demand‬‬
‫‪83‬‬
‫‪‬‬
‫هنگاميکه يک تابع حلقه گردي مجموعه اي‪ ،‬در محدوده عمل تابع حلقه گردي ديگري‬
‫استفاده شود آن را تودرو يا النه اي (‪ )Nesting‬مي نامند‪.‬‬
‫;‪! The demand constraints‬‬
‫‪@FOR(VENDORS(J):‬‬
‫=)‪@SUM(WAREHOUSES(I) : VOLUME(I, J‬‬
‫;))‪DEMAND(J‬‬
‫براي هر فروشنده‪ ،‬کل محموله هايي که از هر يک از انبارها به آن فروشنده ارسال مي‬
‫شود را با يکديگر جمع کرده و مقدار حاصل برابر با تقاضاي فروشنده قرار داده شده‬
‫است‪.‬‬
‫‪84‬‬
‫برخي مواقع مقدار دقيق يک پارامتر را نداريم و مي خواهيم براي محدوده اي‬
‫از اعداد اين پارامتر را مقداردهي کرده و مدل را حل کنيم‪ .‬در اين مواقع در‬
‫قسمت داده ها به جاي اينکه مقدار عددي آن پارامتر را وارد کنيم عالمت‬
‫سوال ” ? “ قرار مي دهيم‪ .‬در اين صورت هر بار که مي خواهيم مدل را‬
‫حل کنيم‪ ،‬لينگو مقدار عددي اين پارامتر را از ما مي پرسد و سپس شروع به‬
‫حل مدل مي کند‪ .‬به مثال زير توجه کنيد‪.‬‬
‫‪85‬‬
‫‪DATA:‬‬
‫? = ‪INFLATION_RATE‬‬
‫‪ENDDATA‬‬
‫در اين مثال‪ ،‬در هر بار حل مدل‪ ،‬لينگو مقدار‬
‫‪ INFLATION_RATE‬را به وسيله پنجره اي از ما مي خواهد‪.‬‬
‫به مثال هاي زير در مورد مقداردهي تکي به متغيرها و پارامتر ها توجه‬
‫کنيد ‪:‬‬
‫‪86‬‬
SETS
DAYS / MO, TU, WE, TH, FR, SA, SU/: NEEDS;
ENDSETS
DATA:
NEEDS = 20;
ENDDATA
.‫ مي گيرند‬20 ‫ مقدار‬NEEDS ‫در اين مثال همه اعضاي‬
87
SETS
DAYS / MO, TU, WE, TH, FR, SA, SU/: NEEDS, COST;
ENDSETS
DATA:
NEEDS, COST = 20, 100;
ENDDATA
‫ و همه اعضاي‬20 ‫ مقدار‬NEEDS ‫در اين مثال همه اعضاي‬
.‫ مي گيرند‬100 ‫ مقدار‬COST
88
‫در بخش داده ها اگر مقدار برخي از متغيرها وارد نشده باشد‪ ،‬آنها به‬
‫صورت متغيرهاي تصميم در نظر گرفته مي شوند نه اعداد ثابت‪ .‬به مثال‬
‫زير توجه کنيد ‪:‬‬
‫‪SETS‬‬
‫;‪YEARS / 1..5 /: CAPACITY‬‬
‫‪ENDSETS‬‬
‫‪DATA‬‬
‫; ‪CAPACITY = 34, 34, , ,‬‬
‫‪ENDDATA‬‬
‫در اين مثال )‪ CAPACITY (1‬و )‪ CAPACITY (2‬برابر ‪ 34‬در‬
‫نظر گرفته مي شوند و عناصر سوم تا پنجم ‪ CAPACITY‬متغير به‬
‫حساب مي آيند‪.‬‬
‫‪89‬‬
‫به عنوان مدير توليد يک کارخانه فرآوري سوخت‪ ،‬مايليد سود حاصل از ترکيب ‪ 3‬ماده‬
‫خام ‪ butane, catalytic reformate, naphtha‬را‪ ،‬در دو محصول‬
‫نهايي ‪ Regular‬و ‪ Premium‬ماکزيمم کنيد‪ .‬اين محصوالت نهايي‪ ،‬بايد شرايط‬
‫کيفيت را در ‪ octane, vapor pressure, volatility‬براورده کنند‪ .‬هر‬
‫ماده خام‪ ،‬يک هزينه به ازاي هر واحد و مقدار در دسترس محدودي دارد‪ .‬حداقل مقدار‬
‫مورد نياز براي هر محصول نهايي ماکزيمم مقداري از هر محصول است که مي توانيد‬
‫بفروشيد و نيز سهم سود هر واحد را نيز مي دانيد‪.‬‬
‫‪90‬‬
‫شرکت شما قصد انتخاب سه مکان‪ ،‬براي احداث کارخانه توليدي در آن مکانها را دارد‪.‬‬
‫چهار مشتري با تقاضاي معلوم براي محصول شما وجود دارند‪ .‬هر مکان بالقوه احداث‬
‫کارخانه‪ ،‬هزينه هاي عملياتي مربوطه و مسيرهاي حمل به شهرهاي تقاضا دهنده اي‬
‫دارد که هزينه هاي متفاتي دارند‪ .‬عالوه بر اين هر کارخانه بالقوه‪ ،‬ظرفيت ارسالي دارد‬
‫که نبايد از آن تجاوز شود‪ .‬مساله اي که با آن مواجهيم تايين کارخانجاتي است که‬
‫بايد احداث شوند و نيز مقداري از محصول که بايد از هر کارخانه به هر يک از مشتريان‬
‫ارسال شود‪ .‬در عين اينکه مي خواهيم مجموع هزينه هاي ثابت عملياتي و هزينه هاي‬
‫ارسال را مينيمم نماييم‪.‬‬
‫‪91‬‬
‫يکي از مسائل رايج مديريت موجودي‪ ،‬هنگامي است که محصول مورد نظر‪ ،‬زمان نگهداري‬
‫محدودي دارد‪ .‬هزينه اي براي سفارش بيش از مقدار مورد نياز متحمل خواهيم شد‪ ،‬چرا‬
‫که محصول به سرعت فاسد و يا تاريخ استفاده از آن منقض ي مي شود‪ .‬همچنين يک‬
‫هزينه فروش از دست رفته متناظر با کاالهاي از بين رفته وجود دارد درچنين شرايطي‪،‬‬
‫اينگونه مسائل که چه مقدار سفارش دهيم تا سود مورد نظر را ماکزيمم کنيم‪ ،‬تحت‬
‫عنوان مسائل روزنامه فروش شناخته مي شوند‪ .‬در مورد اين مثال فرض مي کنيم که‬
‫تقاضا توزيع پوآسن دارد‪ .‬هر چند اين فرض الزامي نيست‪.‬‬
‫‪92‬‬
‫در اين مدل‪ ،‬شش کار وجود دارد که بايد بر روي يک ماشين انجام شود‪ .‬در هر لحظه‬
‫فقط يکي از اين کارها مي توان بر روي ماشين انجام داد‪ .‬هر کار‪ ،‬يک سررسيد اتمام‬
‫مقرري دارد‪ .‬اگر نتوانيم کار را تا لحظه سررسيدش به اتمام برسانيم‪ ،‬آن را انجام‬
‫نخواهيم داد‪ .‬هدف ما‪ ،‬ماکزيمم سازي کل ارزش کارهاي انتخاب شده است‪.‬‬
‫‪93‬‬
‫فرض کنيد مي خواهيد براي پيک نيک برنامه ريزي کنيد و ليست موادي را که مي خواهيد با خود‬
‫حمل کنيد تهيه کده ايد‪ .‬هر آيتم وزن مشخص ي دارد و کوله پشتي شما قادر به ذخيره باري بيش‬
‫از ‪ 15‬کيلوگرم نيست‪ .‬همچنين يک ليست رتبه بندي براي اين آيتمها تهيه کرده ايد‪ ،‬که در آن‬
‫به هر آيتم نمره اي از ‪ 1‬تا ‪ 10‬داده ايد که مشخص مي کند قرار گرفتن هر آيتم خاص در کوله‬
‫پشتي‪ ،‬تا چه حد براي شما مطلوبيت دارد‪ .‬اين اطالعات به صورت جدول زير فهرست شده اند‪:‬‬
‫‪94‬‬
‫‪Rating‬‬
‫‪Weight‬‬
‫‪Item‬‬
‫‪2‬‬
‫‪1‬‬
‫‪Ant Repellent‬‬
‫‪9‬‬
‫‪3‬‬
‫‪Beer‬‬
‫‪3‬‬
‫‪4‬‬
‫‪Blanket‬‬
‫‪8‬‬
‫‪3‬‬
‫‪Bratwurst‬‬
‫‪10‬‬
‫‪3‬‬
‫‪Brownies‬‬
‫‪6‬‬
‫‪1‬‬
‫‪Frisbee‬‬
‫‪4‬‬
‫‪5‬‬
‫‪Salad‬‬
‫‪10‬‬
‫‪10‬‬
‫‪Watermelon‬‬
‫فرض کنيد که مدير يک کارخانه هواپيماسازي هستيد و تصميم گرفته ايد بهترين ترکيب‬
‫توليد شش مدل محصول را پيدا کنيد‪ .‬شش مدلي که در حال حاضر زير خط توليد‬
‫هستند عبارتند از‪Rocket, Meteor, Streak, Comet, Jet, :‬‬
‫‪ .Biplane‬هر هواپيما‪ ،‬سهم سود مشخص ي دارد‪ .‬همچنين هزينه ثابتي براي توليد هر‬
‫نوع از اين هواپيما در هر دوره وجود دارد‪ .‬سود مورد انتظار و هزينه ثابت‪ ،‬در جدول زير‬
‫نشان داده شده است‪:‬‬
‫‪95‬‬
‫‪Setup‬‬
‫‪Profit‬‬
‫‪Plane‬‬
‫‪35‬‬
‫‪30‬‬
‫‪Rocket‬‬
‫‪20‬‬
‫‪45‬‬
‫‪Meteor‬‬
‫‪60‬‬
‫‪24‬‬
‫‪Streak‬‬
‫‪70‬‬
‫‪26‬‬
‫‪Comet‬‬
‫‪75‬‬
‫‪24‬‬
‫‪Jet‬‬
‫‪30‬‬
‫‪30‬‬
‫‪Biplane‬‬
‫در توليد هر محصول‪ ،‬از شش ماده خام استفاده مي شود‪steel, copper, :‬‬
‫‪ .plastic, rubber, glass, paint‬اطالعات مربوطه به مقدار هر يک از اين‬
‫مواد خام مورد نياز براي توليد هر هواپيما‪ ،‬به همراه کل ظرفيت موجود آنها‪ ،‬در جدول زير‬
‫فهرست شده است‪:‬‬
‫‪96‬‬
‫‪Available‬‬
‫‪Biplane‬‬
‫‪Jet‬‬
‫‪Comet‬‬
‫‪Streak‬‬
‫‪Meteor‬‬
‫‪Rocket‬‬
‫‪800‬‬
‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪0‬‬
‫‪4‬‬
‫‪1‬‬
‫‪steel‬‬
‫‪1160‬‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪copper‬‬
‫‪1780‬‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪8‬‬
‫‪3‬‬
‫‪0‬‬
‫‪plastic‬‬
‫‪1050‬‬
‫‪5‬‬
‫‪1‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪2‬‬
‫‪rubber‬‬
‫‪1360‬‬
‫‪4‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪4‬‬
‫‪2‬‬
‫‪Glass‬‬
‫‪1240‬‬
‫‪4‬‬
‫‪3‬‬
‫‪4‬‬
‫‪1‬‬
‫‪4‬‬
‫‪1‬‬
‫‪Paint‬‬
‫مساله عبارت است از تعيين ترکيب نهايي محصوالت توليدي‪ ،‬به گونه اي که سود کل‬
‫(تفاضل هزينه ثابت از سود ناخالص) به حداکثر مقدار ممکن برسد‪ ،‬در عين اينکه از‬
‫مقدار موجودي در دسترس هيچ کدام از مواد خام تجاوز نکنيم‪ .‬محصول ‪Meteor‬‬
‫شما‪ ،‬باالترين سود را به ازاي هر واحد داشته و هزينه راه اندازي آن نيز‪ ،‬بين اين شش‬
‫محصول پايينترين است‪ .‬با اين اوصاف آيا مي توان فقط ‪ Meteor‬توليد کرد؟‬
‫‪97‬‬
‫فرض کنيد مسئول يکي از نمايندگي هاي هات داگ مشهور ‪ Pluto Dogs‬هستيد که‬
‫هفت روز هفته باز مي باشد‪ .‬مي خواهيد کارکناني استخدام کنيد تا هر يک از آنها پنج روز‬
‫هفته را کار کنند و دو روز متوالي تعطيل باشند‪ .‬هريک از اين کارکنان‪ ،‬حقوق هفتگي‬
‫يکساني دريافت مي کنند‪ .‬بعض ي از روزهاي هفته از ديگر روزها شلوغتر است و بر اساس‬
‫تجربه قبلي مي دانيد در يک روز هفته چه تعداد کارگر مورد نياز است‪ .‬پيش بيني حداقل‬
‫تعداد کارکنان مورد نياز در هر روز‪:‬‬
‫‪1‬شنبه‬
‫شنبه‬
‫جمعه‬
‫‪5‬شنبه‬
‫‪4‬شنبه‬
‫‪3‬شنبه‬
‫‪2‬شنبه‬
‫روز‬
‫‪12‬‬
‫‪14‬‬
‫‪19‬‬
‫‪13‬‬
‫‪13‬‬
‫‪16‬‬
‫‪20‬‬
‫تعداد کارکنان مورد نياز‬
‫هدف پيدا کردن تعداد کارکناني است که در هر روز هفته آغاز به کار کنند‪ ،‬به گونه اي که‬
‫مجموع تعداد کارکنان در هر هفته حداقل شود(که متعاقب آن هزينه کل دستمزد آنان نيز‬
‫حداقل خواهد شد‪ ،‬چرا که همه کارکنان دستمزد يکساني دريافت مي کنند‪).‬‬
‫‪98‬‬
‫شرکتي آجيل هايي با چها نشان تجاري به بازار عرضه مي کند‪ .‬اين چهار نشان ‪Pawn,‬‬
‫‪ Knight, Bishop, King‬ناميده مي شوند‪ .‬هر نشان نسبت معيني از بادام زميني‬
‫(‪ )Peanut‬و بادام هندي )‪ (Cashew‬دارد‪ .‬در جدول زير‪ ،‬مقادير اين دو نوع آجيل در هر‬
‫پوند هر نشان تجاري برحسب اونس و نيز قيمتي که شرکت به ازاي هر پوند‪ ،‬در هر نشان دريافت‬
‫مي کند آورده شده است‪:‬‬
‫‪King‬‬
‫‪Bishop‬‬
‫‪Pawn Knight‬‬
‫‪2‬‬
‫‪6‬‬
‫‪10‬‬
‫‪15‬‬
‫بادام زميني(اونس)‬
‫‪14‬‬
‫‪10‬‬
‫‪6‬‬
‫‪1‬‬
‫بادام هندي(اونس)‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫قيمت فروش‬
‫اين شرکت قراردادي با تامين کنندگان دارد تا روزانه ‪ 750‬پوند بادام زميني و ‪ 250‬پوند بادام هندي‬
‫دريافت کند‪ .‬مسئله تعيين مقدار پوند توليدي از هر نوع محصول در هر روز است‪ ،‬تا درآمد کل‬
‫بدون نياز به افزايش عرضه آجيل ها ماکسيمم شود‪.‬‬
‫‪99‬‬
‫تصور کنيد مديريت بخش برنامه ريزي استراتژيک شرکتي که در آن مشغول به کار هستيد بر‬
‫عهده شماست‪ .‬در کل ‪ 8‬نفر کارشناس در اين بخش داريد‪ .‬عالوه بر اين تصميم به نقل‬
‫مکان به محل ديگري براي دپارتمان گرفته ايد که در آن ‪ 4‬دفتر وجود دارد‪ .‬مي خواهيد‬
‫کارشناسان را با يکديگر جفت کنيد تا هر دو نفر در يک دفتر کار کنند‪ .‬بر حسب سوابق‬
‫قبلي مي دانيم بعض ي کارشناسان با يکديگر بهتر کار مي کنند تا با ديگران‪ .‬براي دستيابي به‬
‫حداقل تعارض ميان کارشناسان‪ ،‬به هر زوج ممکن از آنها‪ ،‬يک عدد بين ‪ 1‬تا ‪ 10‬برحسب‬
‫شدت هماهنگي و سازگاري با يکديگر تخصيص مي دهيم‪ .‬عدد ‪ 1‬به معني حداکثر همکاري‬
‫و سازگاري و عدد ‪ 10‬به معني حداکثر برخورد و ناسازگاري است‪ ،‬تا حدي که حتي ممکن‬
‫است قرارگرفتن اين دو کارشناس در يک دفتر‪ ،‬به ضرب و شتم آن دو با يکديگر بينجامد‪.‬‬
‫اين رتبه بندي در جدول زير نشان داده شده است‪.‬‬
‫‪10‬‬
‫‪0‬‬
‫‪10‬‬
‫‪1‬‬
‫کارشناس‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪1‬‬
‫‪-‬‬
‫‪9‬‬
‫‪3‬‬
‫‪4‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪6‬‬
‫‪2‬‬
‫‪-‬‬
‫‪-‬‬
‫‪1‬‬
‫‪7‬‬
‫‪3‬‬
‫‪5‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪4‬‬
‫‪4‬‬
‫‪2‬‬
‫‪9‬‬
‫‪2‬‬
‫‪4‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪1‬‬
‫‪5‬‬
‫‪5‬‬
‫‪2‬‬
‫‪5‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪8‬‬
‫‪7‬‬
‫‪6‬‬
‫‪6‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪2‬‬
‫‪3‬‬
‫‪7‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪-‬‬
‫‪4‬‬
‫شاد و موفق باشيد‬
www.iranmodiran.com
10
2