تارا فایل

پاورپوینت کارگاه بهینه سازی با استفاده از نرم افزار Lingo



کارگاه بهینه سازی با استفاده از نرم افزار Lingo

بهینه سازی به شما کمک می کند که بهترین نتیجه، بالاترین سود، خروجی یا رضایتمندی را بدست آورده و یا به کمترین هزینه، یا ضایعات یا نارضایتی برسید.
اغلب این مسائل شامل استفاده موثر(به بهترین شکل ممکن) از منابع شامل پول، زمان، ماشین آلات، کارکنان، موجودی و … می باشد.
مسائل بهینه سازی، بسته به روابط بین متغیر ها در مسئله به دو صورت خطی و غیر خطی دسته بندی می شوند.
بهینه سازی

امروزه بسیاری از مدل های بهینه سازی تحقیق در عملیات اعم از مدل های خطی، غیر خطی و یا عدد صحیح به مدد نرم افزارهای کامپیوتری به سادگی قابل تجزیه و تحلیل می باشند. در این میان می توان از نرم افزارهایی چون GAMS، LINDO، LINGO، QSB و TORA نام برد.
نرم افزارهای بهینه سازی

ویژگیهای بارز لینگو
قابلیت مدل سازی بصورت کارا و صحیح؛
قابلیت بالای تحلیل مدل؛
دارا بودن توابع مختلف ریاضی، آماری و احتمالی؛
قابلیت خواندن اطلاعات از File ها و Worksheet های دیگر؛
کار کردن در محیط Windows.

نصب نرم افزار
نصب لینگو به راحتی انجام می گیرد و همانند بسیاری از نرم افزارهای تحت سیستم عامل Windows می باشد.
تنها نکته ای که در نصب می توان به آن اشاره کرد فضای مورد نیاز در روی دیسک سخت می باشد که 40MB است. برای دریافت نرم افزار می توانید به سایت لینگو مراجعه کنید.

اصول اولیه مدل نویسی در لینگو
در لینگو هر عبارت با یک “ ; ” پایان می یابد.
هرگاه بخواهیم یک عبارت توضیحی به متن برنامه بیافزاییم کافیست در ابتدای عبارت از علامت تعجب ( ! ) استفاده کنیم. این توضیحات نیز به “ ; ” ختم می شوند.
کلیه عبارات متنی که مابین ( ! ) و “ ; ” نوشته می شوند از سوی لینگو نادیده گرفته می شوند.
لینگو به بزرگ یا کوچک بودن حروف حساس نیست.
لغات کلیدی به صورت آبی رنگ می باشند.
توضیحات به صورت سبز رنگ می باشند.

می توانیم دو خط برنامه لینگو را در یک خط بیاوریم و یا یک خط آن را در دو سطر بیاوریم:
Max = 100 * X
+ 150 * Y;
یا
Y <= 100; X <= 120;

حتی می توانیم توضیحات را در وسط محدودیت ها بیاوریم:
X = Y + !Number of Products; Q + 2 * C;
( معادل X = Y + Q + 2 * C است )

عملگرهای ریاضی حتما فراموش نشود؛ ( مخصوصا عملگر ضرب “ * “ )
2X + 3Y <= 25 (اشتباه)
2 * X + 3 * Y <= 25 (درست)

اسامی متغیرها حتما با یک حرف شروع می شوند. بعد از آن می توان حرف، رقم یا زیر خط ( _ ) استفاده کرد. اسم متغیرها نمی تواند بیشتر از 32 کاراکتر باشد؛
از ارقام و 0-9 و “-“ می توان در تعریف نام متغیرها استفاده کرد.
استفاده از فاصله “ “ ( فاصله ) در اسم متغیر ها ممنوع است؛
علائم ساده ریاضی، توان ( ^ )، ضرب ( * )، تقسیم ( / )، جمع ( + ) و تفریق ( – ) با همین ترتیب اولویت معتبرند؛

هنگام حل مدل اگر ایرادی در آن وجود داشته باشد، نرم افزار پیغام خطا داده و مکان نما به اول سطری می رود که به نظر لینگو این خطا از آنجا ناشی شده است؛
Lingo مدل را با پسوند *.1g4 (به طور پیش فرض) و یا پسوندهای دیگر ذخیره می کند. همچنین از منوی File ◄Open برای باز کردن مدل های ذخیره شده استفاده می گردد.

محیط نرم افزار
نرم افزار لینگو از سه بخش کلی منوها، Toolbar و پنجره ی مدل نویسی تشکیل شده است.
منوهای نرم افزار به ترتیب زیر می باشد :
File; Edit; LINGO; Window; Help
منویی که بیشتر به چشم آمده و در واقع منوی اصلی نرم افزار می باشد منوی LINGO ست، با سایر منوها که در نرم افزارهای تحت سیستم عامل Windows عموماَ موجود می باشند پیشتر آشنا هستید.
Toolbar شامل ابزارهای Shortcut (میانبر) موجود در منوها می باشد.
پنجره ی مدل نویسی محل پیاده سازی مسئله ی بهینه سازی فرموله شده طبق قواعد لینگوست.

حل مدل

بعد از اینکه مدل در پنجره وارد شد آماده برای حل کردن می باشد. برای شروع حل مدل از منوی Lingo◄Solve استفاده می کنیم. همچنین می توان از آیکون در Toolbar و یا کلید میانبر Ctrl + S نیز استفاده نمود.
اگر بعد از زدن کلید Solve ، اشتباهی در نوشتن مدل صورت گرفته باشد ، پنجره خطا ظاهر می شود و محل خطا را مشخص می نماید.اگر خطایی در نوشتن مدل وجود نداشته باشد ، Lingo ، شروع به حل مدل می کند. در این لحظه پنجره ای ظاهر می گردد. این پنجره "پنجره وضعیت حل Lingo" نام دارد. در این پنجره می توان گزارشی مختصر از حل مدل را مشاهده نمود. این گزارش شامل تعداد متغیرهای غیر خطی ، صحیح ، وضعیت حل مدل ، مقدار بهینه تابع هدف و مدت زمان حل مدل و … می باشد. بعد از ظاهر شدن این پنجره می توان روی کلید “Close” کلیک کرده و گزارش حل نهایی مدل را ببینیم.
گزارش نهایی حل مدل در پنجره " گزارش حل " نمایش داده می شود. این پنجره شامل مقدار نهایی تابع هدف ، مقدار متغیرها ، قیمت های سایه ای ، هزینه های تقلیل یافته ، متغیرهای کمبود و … می باشد.

پنجره وضعیت حل

کادر وضعیت حل کننده(Solver status box)

دسته های مدل(Model Class Field)

جدول مدل های غیر خطی

کادر وضعیت حل توسعه

در Lingo ، مدل ها به دو صورت وارد می شوند :
1- حالت استاندارد
2- به زبان Lingo

پیاده سازی مدل در لینگو
توسعه ی یک مدل بهینه سازی
یک شرکت کامپیوتری، دو نوع کامپیوتر استاندارد و توربو تولید می کند. سود هر کامپیوتر استاندارد برای این شرکت $100 و هر دستگاه توربو برابر $150 است.
در شرکت، خط تولید کامپیوتر استاندارد حداکثر تا 100 دستگاه در روز می تواند تولید کند. همچنین حداکثر توان تولید خط توربو برابر 120 دستگاه در روز اعلام شده است.
شرکت نیروی کار محدود 160 نفر ساعت در هر روز در اختیار دارد. کامپیوترهای استاندارد یک ساعت نیروی کار لازم دارند در حالی که کامپیوترهای توربو 2 ساعت نیروی کار نیاز دارند.
مساله ای که شرکت با آن روبروست این است که ترکیبی از کامپیوترهای استاندارد و توربو را برای تولید انتخاب کند که سودش را بیشینه کند در حالی که از محدودیت های توان خطوط تولید و ظرفیت نیروی کار تجاوز نکند.

یک مدل بهینه سازی شامل موارد زیر است :

تابع هدف – فرمولی است که دقیقا آنچه را که می خواهید بهینه کنید، بیان می کند. در مدل های مربوط به کسب و کار این یک تابع سود است که می خواهید آن را بیشینه کنید و یا یک تابع هزینه است که می خواهید آن را کمینه کنید. در مثالی که داریم، تابع هدف، سود شرکت را به صورت تابعی از خروجی کامپیوترهای استاندارد و توربو محاسبه می کند.
مدل های OR یا از نوع Min و یا Max هستند که تابع هدف یا “Max=” و یا“Min=” شروع شده و در خط اول مدل ، وارد می گردد.

متغیرها – کمیت هایی هستند که تحت کنترل شما هستند و شما باید تصمیم بگیرید که بهترین مقادیر این متغیر ها کدامند. هدف بهینه سازی یافتن مقادیری برای متغیرهای مدل است که با توجه به همه شرایط محدود کننده که روی متغیرها اعمال می شوند، بهترین مقدار را برای تابع هدف تولید کنند. در این مثال ما دو متغیر تصمیم گیری یکی مربوط به تعداد کامپیوترهای استاندارد و دیگری مربوط به تعداد کامپیوترهای توربو داریم.

محدودیت ها – تقریبا بدون استثنا، برخی محدودیت ها برای مقادیری که متغیرها می توانند اتخاذ کنند خواهد بود. محدودیت ها به وسیله توابعی از متغیرهای مدل بیان می شوند. این فرمول ها به عنوان محدودیت شناخته می شود، چون مقادیری را که متغیرها می توانند بگیرند، محدود می کنند.

در این مثال ما برای هر خط تولید یک محدودیت و برای کل نیروی کار استفاده شده نیز یک محدودیت داریم.
متغیرهای Standard و Turbo را به عنوان تعداد کامپیوترهای استاندارد و توربو که شرکت می خواهد تولید کند در نظر می گیریم. هدف شرکت بیشینه کردن سود کل است که این سود برابر مجموع سود حاصل از کامپیوترهای استاندارد و توربو است :

Max = 100 * Standard + 150 * Turbo;

حال محدودیت مربوط به ظرفیت خطوط تولید را اعمال می کنیم :
Standard <= 100;
Turbo <= 120;
محدودیت مربوط به نیروی کار نیز بصورت زیر است :
! Our labor supply is limited;
Standard + 2 * Turbo <= 160;
علامت ≤ به صورت <= نوشته شود و
علامت ≤ به صورت >= نوشته شود.

مطالعه موردی
شرکتی ، تولید کننده میز تحریر، میز و صندلی است. تولید هر کدام از انواع مبلمان به الوار و دو نوع نیروی کار ماهر در دو زمینه نجاری و پرداخت نیاز دارد. انواع مبلمان به الوار و دو نوع نیروی کار ماهر در دو زمینه نجاری و پرداخت نیاز دارد. مقدار هر یک از منابع مورد نیاز برای تولید هر یک از انواع مبلمان در جدول ذیل آمده است :

در حال حاضر، 48 فوت تخته از الوارها، 20 ساعت زمان پرداخت و 8 ساعت زمان نجاری موجود است. هر میز تحریر 60 دلار، میز 30 دلار و صندلی 20 دلار به فروش می رسد. همچنین تولید بیش از 5 میز از لحاظ بازار یابی به صرفه نمی باشد. با فرض اینکه منابع در دسترس به تازگی تدارک دیده شده باشند، شرکت می خواهد کل سود خود را به حداکثر برساند.

متغیر های تصمیم بصورت ذیل تعریف شده اند :
Desk : تعداد میز تحریرهای تولید شده
Table : تعداد میزهای تولید شده
Chair : تعداد صندلی های تولید شده

شرکت به حل مدل خطی زیر نیاز دارد :

Max z = 60 Desk + 30 Table + 20 Chair
s.t 8 Desk + 6 Table + Chair <= 48 (محدیدیت الوار)
4 Desk + 2 Table + 1.5 Chair <= 20 (محدودیت پرداخت)
2 Desk + 1.5 Table + 0.5 Chair <= 8 (محدودیت نجاری)
Table <= 5 (محدودیت تقاضای میز)
Desk, Table, Chair >= 0

مدل فوق به زبان لینگو در قسمت Lingo Model وارد می شود :
max=60*desk+30*tabels+20*chairs;

!constranicts;
8*desk+6*tabels+chairs<=48;
4*desk+2*tabels+1.5*chairs<=20;
2*desk+1.5*tabels+.5*chairs<=8;
tabels<=5;

با استفاده از گزینه Solve جواب نهایی سیمپلکس بصورت زیر خواهد بود :

تحلیل خروجی
: Objective value مقدار بهینه تابع هدف 280 است.
Value : مقدار متغیر در جواب بهینه مدل خطی را می دهد. بنابراین جواب بهینه تولید 2 میز تحریر، صفر میز، و 8 صندلی است.
Reduced Cost : ضریب متغیر در سطر صفر جدول بهینه را می دهد (مسئله ماکزیمم سازی). همانگونه که می دانید باید هزینه کاهش یافته هر متغیر پایه برابر صفر باشد. برای یک متغیر غیر پایه xj، هزینه کاهش یافته مقداری است که اگر xj ، 1 واحد اضافه شود، به آن اندازه، جواب بهینه کاهش می یابد (درحالی که بقیه متغیرهای غیر پایه برابر صفر بمانند). در خروجی لینگو برای مسئله فوق، هزینه کاهش یافته میز برابر 5 است. این یعنی اگر شرکت بخواهد یک میز تولید کند، درآمد به اندازه 5 دلار کاهش خواهد یافت.

در قسمت بعدی از خروجی یا Report مشاهده می کنیم که هر خط مدل با شماره ای مشخص شده و در مقابل آن دو عبارت Slack or Surplus و Dual Price مشاهده می شود :

Slack or Surplus مقدار کمبود یا اضافی (مازاد) در جواب بهینه را نشان می دهد. بنابراین 24 فوت تخته الوار و 5 عدد میز به صورت مازاد وجود خواهد داشت.

Dual Price یا قیمت سایه مقداری است که اگر سمت راست محدودیت، یک واحد اضافه شود، به آن اندازه جواب بهینه، بهبود می یابد ( با فرض اینکه این تغییرات باعث از دست رفتن پایه بهینه فعلی نمی شوند ). اگر بعد از یک تغییر در طرف راست محدودیت، پایه فعلی دیگر بهینه نماند، قیمت های سایه محدودیت ها ممکن است تغییر کند.

تحلیل حساسیت
پس از حل مدل توسط Solve با استفاده از گزینه Range موجود در منوی LINGO گزارش خروجی تحلیل حساسیت مدل را مشاهده می کنیم، در صورت مشاهده خطا وارد LINGO Option شده و گزینه Dual Computations از قسمت General Solver را در حالت سوم قرار دهید.

تحلیل حساسیت نشان می دهد که ضرایب تابع تا چه میزان می توانند افزایش یا کاهش یابند بدون اینکه پایه بهینه مسئله (مجموعه متغیرهای غیر صفر) عوض شود.
تحلیل حساسیت شامل دو بخش است، یکی مربوط به تابع هدف و دیگری مربوط به محدودیت ها، که در هر کدام به تفکیک مقدار واقعی و مقادیر کاهش و افزایش قید شده است.

برنامه نویسی به زبان لینگو

یک برنامه در لینگو با کلمه “Model” آغاز و به کلمه “End” ختم می شود و معمولا از چهار بخش زیر تشکیل می شود :

بخش مجموعه ها؛
بخش داده ها؛
تابع هدف؛
بخش محدودیت ها؛

همچنین می توان در یک برنامه، تابع هدف را بعد از نوشتن محدودیت ها آورد.

مجموعه ها در لینگو
مجموعه ها در لینگو در واقع قالبی برای تعریف متغیرهای برنامه می باشند (این متغیرها می توانند متغیر تصمیم گیری و یا پارامترهای عددی مدل باشند). در لینگو دو نوع مجموعه داریم :

مجموعه های مستقل؛ Primitive Sets
مجموعه های وارث ؛ Derived Sets

مجموعه های مستقل برای تعریف متغیرهای آرایه ای یک بعدی و مجموعه های وارث برای تعریف آرایه های چند بعدی مورد استفاده قرار می گیرند.

مجموعه های مستقل

ساختار کلی تعریف مجموعه های مستقل در لینگو به صورت زیر می باشد :
نام متغیرها: / عناصر مجموعه / نام مجموعه ;
برای درک بهتر مطلب به مثال زیر که یک خط از یک برنامه است توجه کنید :
Factory /1 .. 3 /:Setup_Cost;

Factory و Setup_Cost معرف یک آرایه تک بعدی شامل 3 خانه اند، با این تفاوت که به خانه های Factory مقداردهی نمی کنیم و آنها را در عملیات ریاضی شرکت نمی دهیم.
برای مقداردهی به متغیر Setup_Cost باید در بخش مقداردهی سه عدد به آن نسبت داد که این اعداد به ترتیب در خانه های اول تا سوم آن قرار می گیرند.

SETS : برای تعریف یک مجموعه ، در شروع نوشته می شود.
Name : اسمی است که برای مجموعه مورد نظر خود در نظر می گیرید.
Members : عضوهای مجموعه هستند. نام این عضوها ممکن است مشخص باشند و یا نباشند. مثلاً مجموعه ای 3 عضو دارد و یا مجموعه ای دارای عضوهای x4 , x3 , x2 , x1 است.
Attribute : نام صفتهای یک مجموعه را مشخص می کند صفتها را با “ ,” از همدیگر جدا می کنیم.
SETS :
Name / members / : attribute :
ENDSETS

مجموعه های وارث
در لینگو نمی توان به صورت مستقیم ماتریس و آرایه های چند بعدی را تعریف کرد. برای تعریف آرایه های چند بعدی از مجموعه های وارث استفاده می کنیم.
ساختار کلی مجموعه های وارث بصورت زیر است :
Sets:
/ آرایه/ اسم مجموعه های وارث; (Set1)
Car/1..3/; مثال)
; متغیرها : ( Set1, Set2, Set3, … , Setn ) اسم مجموعه وارث
Demand (Car, City): Dim; مثال)
Endsets

برای درک بهتر به مثال های کلی زیر توجه کنید :
فرض کنید کارخانه ای سه نوع ماشین مختلف تولید می کند و مشتریان پنج شهر مختلف نیز سفارش های متفاوتی از هر نوع ماشین به کارخانه می دهند. حال زیر برنامه ی زیر را در نظر بگیرید:
Sets:
Car/1..3/;
City/1..5/;
Demand (Car, City): dim;
Endsets
این زیر برنامه مجموعه ای مستقل ار نوع Car به صورت آرایه تک بعدی 3 خانه ای و مجموعه ای مستقل از نوع City به صورت یک آرایه تک بعدی 5 خانه ای تولید می کند. (دقت کنید که متغیری از نوع Car یا City نداریم.)

در خط چهارم این زیر برنامه، مجموعه وارث Demand به صورت یک ماتریس 3*5 و ماتریس Dim از نوع Demand تعریف می شود؛ بنابراین در بخش مقداردهی، می بایست 15 عدد به متغیر Dim نسبت داد، که در این حالت مقدار تقاضای شهر j از ماشین iدر خانه ای واقع در سطر iام و ستون jام ماتریس Dim قرار می گیرد.
در قسمت داخل اسلش ها (اندیس هایی که با هم ارتباط دارند) می توانیم اندیس هایی را ذکر کنیم که ارتباطشان با هم تعریف شده است. در صورت حذف قسمت بین اسلش ها، فرض بر این است که ارتباط تمام اندیس ها در تمام بعد ها، با هم تعریف شده است و متغیرهای وابسته به مجموعه، با تمام اندیس های خود می توانند مقدار بگیرند.

فرض کنید مجموعه ای از 4 دانش آموز با دو مشخصه سن و جنس را می خواهیم تعریف کنیم.
SETS :
Students / 1..4 / : AGE , SEX ;
ENDSETS

حال اگر نام 4 دانش آموز مشخص باشد ، (Amir , Ali , Hasan , Reza) مجموعه بصورت زیر خواهد شد :
SETS :
Students / Amir , Ali , Hasan , Reza / : AGE , SEX ;
ENDSET

SETS:
TASK/A B C D E F G H I J K/: T;
PRO1 (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/;
PRO2 (TASK, STATION): X;
ENDSETS

در مثال فوق مجموعه TASK از 11 عضو تشکیل یافته است و مجموعه STATION از 4 عضو. با این وجود مجموعه PRO1 به جای 121=11*11 عضو تنها از 12 عضو مشخص شده، تشکیل شده در حالی که PRO2 شامل 48=4*11 عضو می باشد.

بخش داده ها
بخش داده ها به ما این امکان را می دهد که داده ها را از بقیه مدل جدا کنیم. این کار باعث می شود در هنگام تغییر و یا توسعه مدل راحت تر و کم اشتباه تر عمل کنیم. در بخش داده که مابین دو کلمه کلیدی DATA و ENDDATA است می توانیم مقادیر پارامترها و اسم عناصر مجموعه هایی را که در بخش قبلی تعریف شده اند مقداردهی کنیم.

پارامترهای 1*1 را می توان مستقیما در قسمت داده ها تعریف و مقداردهی کرد. مثلا :
DATA
INTEREST_RATE = .085;
ENDDATA
و یا
DATA
INTEREST_RATE, INC_RATE = .085, .03;
ENDDATA
INTEREST_RATE در هر دو مثال فوق برابر .085 و در مثال دوم INC_RATE برابر .03است.

در بخش داده ها اگر مقدار برخی از متغیرها وارد نشده باشد، آنها به صورت متغیرهای تصمیم در نظر گرفته می شوند نه اعداد ثابت. به مثال زیر توجه کنید :
SETS
YEARS / 1..5 /: CAPACITY;
ENDSETS
DATA
CAPACITY = 34, 34, , , ;
ENDDATA
در این مثال CAPACITY (1) و CAPACITY (2) برابر 34 در نظر گرفته می شوند و عناصر سوم تا پنجمCAPACITY متغیر به حساب می آیند.

توابع و عملگرها در لینگو
برای تسهیل مدل سازی، در لینگو توابع و عملگرهای متفاوتی وجود دارند. حتی اگر با شکل کلی استفاده از این توابع آشنایی نداشته باشید، لینگو این شکل کلی را در اختیار شما قرار می دهد. برای این منظور در منوی Edit گزینه Paste Function را انتخاب نمایید، ملاحظه می کنید که لیستی از انواع توابع برای شما نمایش داده می شود.

این لیست به شرح زیر می باشد :

External Files Function
Financial Function
Mathematical Function
Probability Function
Set Function
Variable Domain Function
Other Function

بررسی تک تک این توابع از سطح کار ما فراتر است؛ همچنین به خاطر عدم نیاز به توابع مالی و احتمالی در برنامه ریزی خطی در اینجا فقط به تشریح برخی توابع دسته پنجم و ششم می پردازیم.
(در صورتی که مایلید اطلاعات بیشتری در ارتباط با سایر توابع لینگو بدست آورید در منوی Help گزینه Help Topics را انتخاب نمایید و پنجره محاوره ای باز شده را در حالت Index قرار دهید؛ سپس کلمه Function را تایپ کنید، در این حالت لینگو اطلاعات مفید بسیاری در اختیار شما قرار می دهد.)

نکته :
قبل از معرفی توابع به این نکته مهم توجه کنید که در لینگو هنگام به کار بردن توابع، میبایست قبل از نام تابع از علامت @ استفاده کرد.

در اینجا به بررسی دو تابع FOR و SUM می پردازیم.

تابعFOR
این تابع در دسته Set Looping یعنی توابع حلقه ای قرار دارد و شکل کلی آن بصورت زیر می باشد :
@FOR( Set : expression);
در صورت استفاده از عبارات شرطی به صورت زیر عمل کنید :
@FOR( Set | condition: expression);
وجود تابع For در لینگو در واقع یکی از برتری های بارز این زبان می باشد. از این تابع برای نسبت دادن یک ویژگی به تمام یا بخشی از اعضای یک مجموعه استفاده می کنیم. به مثال های زیر توجه کنید :

فرض کنید انباری داریم که در آن هفت قلم کالای متفاوت نگهداری می کنیم:
SETS:
Items /1..7/: Capacity;
ENDSETS
حال فرض کنید ظرفیت انبار محدود بوده و حداکثر 12 واحد از هر قلم می توان در آن نگهداری کرد. برای وارد کردن این محدودیت به صورت زیر عمل می کنیم :
@For(Items (i): Capacity (i) <= 12);

این عبارت در واقع معادل عبارت زیر است :
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);

حال فرض کنید ظرفیت انبار فقط برای دو قلم کالای آخر (اقلام 6 و 7 ) محدودیت داشته باشد؛ برای وارد کردن این محدودیت از عبارات شرطی و عملگرهای منطقی استفاده می کنیم :
@For(Items (i) | i#GT#5: Capacity (i) <= 12);

تابعSUM
@SUM (Set: expression);
در صورت استفاده از عبارات شرطی به صورت زیر عمل کنید :
@SUM (Set | condition: expression);
از این تابع برای محاسبه حاصل جمع اعضای یک مجموعه یا عبارتی شامل اعضای یک مجموعه استفاده می کنیم.

فرض کنید 5 مشتری مختلف تقاضاهای متفاوتی از کالای X دارند؛ حال این زیر برنامه را در نظر بگیرید :
SETS:
Customers /1 2 3 4 5/: Demand, cost;
ENDSETS
DATA
Cost = 5 1 3 4 6;
ENDDATA
حال اگر بخواهیم مجموع تقاضاها برای کالای X را محاسبه نماییم، کافیست عبارت زیر را به برنامه بیافزاییم :
Total_Demand = @Sum (Customers (i): Demand (i));

در واقع این عبارت معادل عبارت زیر می باشد :
Total_Demand = Demand (1) + Demand (2) + Demand (3) + Demand (4) + Demand (5);
می توانستیم از عبارت خلاصه شده زیر نیز استفاده کنیم :
Total_Demand = @Sum (Customers: Demand);

متغیرها
متغیرها به طور پیش فرض غیر منفی و پیوسته هستند. اما در بعضی از مواقع لازم است که متغیرهای منفی تعریف شود یا ممکن است بخواهیم متغیرهایی با مقادیر صحیح تعریف کنیم و … به همین منظور از توابعی برای تعریف این نوع متغیرها استفاده می کنیم. Lingo برای تعریف این متغیرها از 4 نوع تابع استفاده می کند. این توابع عبارتند از :
@ GIN : با استفاده از این تابع متغیر فقط می تواند عدد صحیح بگیرد.
@ BIN : با استفاده از این تابع متغیر فقط می تواند مقدار 0 یا 1 بگیرد.
@ FREE : با استفاده از این تابع متغیر می تواند مقادیر منفی ، مثبت و صفر بگیرد. (محدودیت غیر منفی بودن برداشته می شود.)
@ BND : با استفاده از این تابع می توان حد بالا و پایین را برای متغیر تعریف کرد. مثلاً متغیر بین 6 تا 10 بتواند عدد بگیرد.

متغیرهای صحیح :
متغیر های صحیح ، متغیرهایی هستند که فقط می توانند مقادیر صحیح بگیرند. مثلاً تعداد ماشین آلات نمی تواند عدد 1.5 باشد. بنابراین اگر متغیر تعداد ماشین آلات باشد باید آن را عدد صحیح تعریف کرد. به این منظور از تابع @ Gin(Variable-name) استفاده می شود. در واقع استفاده از تابع @ Gin به معنی استفاده از یک محدودیت برای متغیر می باشد ، چون متغیر محدود به مقادیر خاص شده است.

متغیرهای صفر و یک :
این نوع متغیرها فقط می توانند مقادیر "صفر و یک" بگیرند. در واقع این متغیرها حالت خاصی از متغیرهای صحیح می باشند. متغیرهای صفر و یک به عنوان متغرهای تصمیم مورد استفاده قرار می گیرد. زیرا زمانی که بخواهیم متغیرهایی را با توجه به محدودیت های موجود انتخاب کنیم مجبور به استفاده از این نوع متغیرها می شویم. نمونه ای از کاربرد این متغیرها در مسائل تخصیص می باشد ، مثلاً وقتی بخواهیم بین چند پیمانکار پیمانکارانی را که کمترین هزینه را دارند انتخاب کنیم ، می بایست پیمانکاران (متغیرها) را به صورت صفر و یک تعریف کنیم. در این صورت اگر متغیری مقدار 1 گرفت به معنی انتخاب و اگر 0 شد ، به معنی عدم انتخاب است. برای تعریف این نوع متغیرها از تابع @ Bin(x) استفاده می کنیم.

متغیرهای آزاد :
همانطور که قبلاً نیز اشاره شده ، متغیرها به طور پیش فرض غیر منفی هستند ، یعنی می توانند مقادیر صفر و مثبت داشته باشند ، اما در بعضی از مواقع نیاز است متغیری تعریف شود که مقداری منفی داشته باشد. این نوع متغیرها "متغیرهای آزاد" نام دارند. برای تعریف متغیرهای آزاد از تابع @ Free(x) استفاده می کنیم.

متغیرهای حددار :
متغیرهای حددار فقط می توانند بین دو مقدار حدی باشند. مثلاً می خواهیم متغیری فقط مقداری بین عدد 3 و 10 بگیرد. استفاده از این نوع متغیرها معادل با محدودیتی به شکل "حد بالا
≥ نام متغیر ≥ حد پایین" می باشد. به این منظور از تابع @ BND استفاده می کنیم. حالت کلی این تابع به شکل زیر می باشد :
فرم کلی تابع :@ BND (حد بالا ، نام متغیر ، حد پایین ) @ BND

عملگرها

حالتهای خاص
جواب نامتناهی
UNBOUNDED SOLUTION

بدون فضای موجه
NO FEASIBLE SOLUTION
جواب بهینه چندگانه یا تبهگن
both zero slack and a zero dual price

نحوه نمایش متغیر هایی که فقط مقدار گرفته اند

نحوه خواندن داده از فایل Excel

r=@ole('F:EELINGO90Example.xls','test');

نحوه مقدار دهی به پارامترهای سه بعدی

@for(ijlink:@bin(x));

با تشکر


تعداد صفحات : 73 | فرمت فایل : .ppt

بلافاصله بعد از پرداخت لینک دانلود فعال می شود