زمان‌بندی مغازه کارها

**مسئلهٔ زمان‌بندی کار کارگاهی**  یک مسئلهٔ بهینه‌سازی در مهندسی صنایع و تحقیق در عملیات است که در آن کارها به منابع در زمان‌های خاصی نسبت داده می‌شوند. صورت اصلی آن در ادامه آمده است:

در این مسئله n کار j1, j2, …, jn با اندازه‌های متفاوت که باید روی m ماشین یکسان زمان‌بندی شوند در تلاشند تا زمان کل(makespan) را به حداقل برسانند. زمان خالی مجموع زمان لازم برای انجام همهٔ کارهاست (که همهٔ کارها تمام شده‌اند).

امروزه، این مسئله به عنوان یک مسئلهٔ پویا(dynamic scheduling) مطرح می‌شود، که با ارائه شدن هر کار، الگوریتم پویا باید با اطلاعات موجود تصمیم‌گیری کند قبل از اینکه کار بعدی مطرح شود.

این مسئله یکی از مشهورترین مسائل پویاست، و اولین مسئله‌ای بود که برای آن تحلیل رقابتی(competitive analysis) به وسیلهٔ Graham در سال ۱۹۶۶ مطرح شد. بهترین نمونه‌های مسئله برای مدل پایه با هدف بهینه‌سازی زمان کل به وسیلهٔ Taillard مطرح شد.

## گونه‌های مختلف مسئله
* ماشین‌ها می‌توانند وابسته، مستقل یا یکسان باشند.
* ماشین‌ها می‌توانند بین شغل‌ها زمان مشخصی فاصله بیندازند یا اینکه بدون فاصله شغل‌ها را انجام دهند.
* ماشین‌ها می‌توانند به صورت وابسته به دنباله (sequence-dependent) برنامه‌ریزی شوند.
* هدف مسئله می‌تواند عملکردهای مختلفی چون کم کردن زمان کل، نرم Lp، تأخیر ورود، بیشترین تأخیر درانجام کارها و غیره باشد. *همچنین می‌تواند یک مسئلهٔ بهینه‌سازی چند هدفه باشد.
* شغل‌ها می‌توانند محدودیت داشته باشند، برای مثال، شغل i باید قبل از شروع شغل j تمام شود.
* شغل‌ها و ماشین‌ها محدودیت‌های مشترک داشته باشند، برای مثال، شغل‌های مشخصی فقط بتوانند روی برخی ماشین‌ها اجرا شوند.
* مجموعه‌ای از شغل‌ها بتوانند به مجموعهٔ متفاوتی از ماشین‌ها مرتبط باشند.
* زمان پردازش قطعی (deterministic) یا احتمالی(probabilistic).
* ممکن است محدودیت‌های دیگری نیز وجود داشته باشد.

## تاریخچه
این مسئله حداقل هفتاد سال قدمت دارد.

## نمایش مسئله
گراف منفصل(disjunctive graph) یکی از بهترین مدل‌های مورد استفاده برای تشریح‌کردن سامانه‌های مختلف این مسئله است.

لیست الگوریتم‌های زمان‌بندی موجود در سال ۱۹۶۶ را گراهام از قبل آماده کرده بود، که تمامی آن‌ها (2-1/m)رقابتی بوده‌اند. منظور از m در این‌جا تعداد ماشین‌ها است. همچنین این امر که زمان‌بندی لیست، راه حل بهینه برای مسئلهٔ آنلاین ۲ یا ۳ ماشین است اثبات شده بود. الگوریتم Coffman-Graham در سال ۹۲ برای مشاغل یکسان طول، برای ۲ ماشین نیز بهینه و (2-2/m) رقابتی است. در سال ۱۹۹۲، بارتال، فیات، کارلفت و وهرا الگوریتمی ۱٫۹۸۶-رقابتی ارائه کردند. در سال ۱۹۹۴، کارگر، فیلیپس و تورنگ یک الگوریتم ۱٫۹۴۵ رقابتی ارائه دادند. در سال ۱۹۹۲، آلبرز یک الگوریتم جدید که ۱٫۹۲۳-رقابتی بود ارائه داد. در حال حاضر، بهترین پاسخ موجود، الگوریتمی از فلیشر و وهل می‌باشد که یک راه حل ۱٫۹۲۰رقابتی است.

یک حد پایین ۱٫۸۵۲-رقابتی نیز توسط آلبرز ارائه داده شد. نمونه‌های Taillard نقش مهمی در ایجاد زمان‌بندی مغازهٔ کار با اهداف مدت ایجاد(makespan objectives) ایفا می‌کنند.

در سال ۱۹۷۶ گری، اثبات کرد که این مسئله برای nهای بزرگ‌تر از ۲ یک مسئلهٔ ان‌پی کامل است، به این معنا که برای بیش از ۳ ماشین، نمی‌توان راه‌حلی از زمان چندجمله ای برای حل این مسئله ارائه داد.

## بهینه‌سازی آفلاین (برون خطی) بازهٔ زمانی تولید
ساده‌ترین حالت مسئله حداقل‌کردن offline makespan برای مشاغل اتومیک می‌باشد، که در این مشاغل اتومیک، مشاغلی هستند که شغل قابلیت تقسیم‌شدن به مشاغل کوچکتر را ندارد. برای مثال، این مفهوم مشابه بسته‌بندی کردن چندین تکه با حجم‌های متفاوت درون تعداد ثابتی از صندوق‌ها، به گونه‌ای که بزرگ‌ترین حجم صندوق مورد نیاز، در کمترین حد ممکن باشد. (در صورتی که حالت برعکس این مورد، یعنی کمینه کردن تعداد صندوق‌ها و ثابت‌بودن سایز هر صندوق مد نظر باشد، این مسئله تبدیل به مسئلهٔ دیگری به نام مسئلهٔ دسته‌بندی صندوق‌ها می‌شود).

هاشبوم و اشمویز یک شمای تخمینی از زمان چند جمله‌ای را در سال ۱۹۸۷ ارائه دادند که یک راه حل تخمینی برای مسئله را با هر درجه‌ای از دقت که مد نظر باشد به دست می‌آورد.

## مشاغلی که از چندین عملیات تشکیل شده‌اند
حالت ابتدایی از زمان‌بندی کردن مشاغل با چندین عملیات(M)، بر روی چندین ماشین (M)، به گونه‌ای که تمامی عملیات اول باید روی ماشین اول اجرا شوند، تمامی عملیات دوم روی ماشین دوم و …. و چند شغل نمی‌توانند به صورت موازی اجرا شوند، به عنوان مسئله زمان‌بندی مغازهٔ باز شناخته می‌شوند. الگوریتم‌های مختلفی برای این سؤال موجود است، از جمله الگوریتم‌های ژنتیک.

## الگوریتم جانسون
برای حل حالتی از این مسئله که در آن ۲ ماشین وN شغل متفاوت موجود است و تمامی مشاغل باید به ترتیب مورد پردازش قرارگیرند، می‌توان از یک الگوریتم مکاشفه‌ای که توسط S.M. Johnson ایجاد شده است، استفاده کرد. قدم‌های مختلف این الگوریتم به صورت زیر است:

شغل Pi دارای دو عمل است، طول هرکدام از این عمل‌ها pi۱ و pi۲ است، که روی ماشین‌های M۱ و M۲ به همان ترتیب اجرا می‌شوند.
* قدم ۱: لیست A = list L2 = {}, List L1 = {},{۱، ۲، ۳، …, N}
* قدم ۲: از بین تمامی مدت عمل‌های ممکن، مدت کمینه را انتخاب نمایید.

در صورتی که کمینه به Pk۱ تعلق داشته باشد، K را از لیست A حذف کنید، K را به انتهای لیست L۱ اضافه نمایید.

در صورتی که مقدار کمینه به Pk۲ تعلق داشته باشد،
* قدم ۳: قدم ۲ را تکرار کنید تا زمانی که List A خالی شود.
* قدم ۴: List L۱ و List L۲ را با هم مخلوط کنید. این دنباله بهینه می‌باشد.

روش جانسون، تنها در حالتی که دو ماشین داشته باشیم به صورت بهینه کار می‌کند. اما از آن جهت که این روش، روشی بهینه و ساده برای محاسبه است، بعضی از پژوهشگران در جهت تعمیم این الگوریتم به حالت M ماشین تلاش کرده‌اند.

ایده مورد نظر به صورت زیر است:

تصور کنید که هر شغل، نیاز به M عمل مختلف دنبال هم، روی M1, M2, M3, …, Mm دارد. ما به این گونه عمل می‌کنیم که m/۲ ماشین اول را به یک ماشین بزرگ (موهومی) تبدیل می‌کنیم و آن را MC۱ می‌نامیم. ماشین‌های باقی‌مانده دیگر را نیز به یک ماشین بزرگ دیگر به نام MC۲ تبدیل می‌کنیم.

در این صورت، زمان پردازش نهایی برای شغل P روی MC۱ برابر است با مجموع زمان عمل‌ها روی m/۲ ماشین اول و زمان پردازش نهایی شغل p روی MC۲ برابر با مجموع زمان عمل‌ها روی m/۲ ماشین آخر است.

در این صورت، ما توانستیم این مسئلهٔ m-machine را به یک مسئلهٔ برنامه‌ریزی ۲-machine کاهش دهیم. حال می‌توانیم با استفاده از الگوریتم جانسون، این مسئله را حل کنیم.

این‌جا یک مثال از مسئله زمان‌بندی مغازهٔ کارها که به صورت AMPL به عنوان یک مسئلهٔ mixed-integer programming محدودیت‌های نشانگر آورده شده است.

param N_JOBS;

param N_MACHINES;

set JOBS ordered = 1..N_JOBS;

set MACHINES ordered = 1..N_MACHINES;

param ProcessingTime{JOBS, MACHINES}> 0;

param CumulativeTime{i in JOBS, j in MACHINES} = sum {jj in MACHINES: ord(jj)  i2} = max {j in MACHINES}(CumulativeTime[i1,j] - CumulativeTime[i2,j] + ProcessingTime[i2,j]);

var end>= ۰;

var start{JOBS}>= ۰;

var precedes{i1 in JOBS, i2 in JOBS: ord(i1) = start[i] + sum{j in MACHINES} ProcessingTime[i,j];

subj to no12_conflict{i1 in JOBS, i2 in JOBS: ord(i1)  start[i2]>= start[i1] + TimeOffset[i1,i2];

subj to no21_conflict{i1 in JOBS, i2 in JOBS: ord(i1)  start[i1]>= start[i2] + TimeOffset[i2,i1];

data;

param N_JOBS := ۴;

param N_MACHINES := ۳;

param ProcessingTime:

۱ ۲ ۳ :=
۱ ۴ ۲ ۱

۲ ۳ ۶ ۲

۳ ۷ ۲ ۳

۴ ۱ ۵ ۸;

## منابع

## پیوند به بیرون
* Job shop scheduling

رده:بهینه‌سازی ترکیبیاتی
رده:بهینه‌سازی ریاضی
رده:تحقیق در عملیات
رده:روش‌های بهینه‌سازی
رده:زمان‌بندی (رایانه)
رده:مقاله‌های ایجادشده توسط ایجادگر