مسئله کوله پشتی که با عنوانهای Knapsack یا Rucksack مطرح میشود، مسئلهای در بهینهسازی ترکیبیاتی است. فرض کنید مجموعهای از اشیا، که هر کدام داری وزن و ارزش خاصی هستند در اختیار دارید. به هر شی تعدادی را تخصیص دهید بهطوریکه وزن اشیا انتخاب شده کوچکتر یا مساوی حدی از پیش تعیین شده، و ارزش آنها بیشینه شود. علت نامگذاری این مسئله، جهانگردی است که کوله پشتی ای با اندازهٔ محدود دارد و باید آن را با مفیدترین صورت ممکن از اشیا پر کند.
معمولاً در تخصیص منابع با محدودیتهای مالی، با این مسئله روبرو هستیم. همچنین مسائلی از این قبیل در ترکیبیات، نظریه پیچیدگی محاسباتی،رمزنگاری و ریاضیات کاربردی به چشم میخورد.
نسخهٔ مسئله تصمیم برای مسئلهٔ کوله پشتی، این سؤال است: “آیا ارزش V با انتخاب اشیایی با مجموع وزن کمتر یا مساوی W، قابل دستیابی است؟”
تعریف
فرض کنید جسم داریم که از تا شمارهگذاری شدهاند. جسم ام ارزشی معادل و وزنی برابر با دارد. معمولاً فرض میشود که وزنها و ارزشها نامنفیاند. برای سادهتر شدن نمایش، بدون کم شدن از کلیت مسئله میتوان فرض کرد اشیا به ترتیب صعودی بر حسب وزنشان مرتب شدهاند. بیشترین وزنی که میتوان در کوله پشتی حمل کرد، است.
معروفترین نوع از این مسئله، مسئلهٔ کوله پشتی ۰ و ۱ است. یعنی تعداد از هر شی، یا ۰ است (آن شی را انتخاب نمیکنیم) یا ۱ (آن شی انتخاب میشود). مسئلهٔ کوله پشتی ۰ و ۱ را میتوان به این صورت، به زبان ریاضی بیان کرد:
- مقدار را بیشینه کنید.
- بهطوریکه
مسئلهٔ کوله پشتی کران دار، نسخهٔ دیگری از این سؤال است که در آن تعداد اشیا () عددی صحیح و نامنفی و حد اکثر برابر با است. به بیان ریاضی:
- مقدار را بیشینه کنید.
- بهطوری که
مسئلهٔ کوله پشتی بیکران (UKP)، هیچ محدودیتی روی تعداد اشیا قائل نمیشود. یعنی از هر شی، به هر تعداد دلخواهی میتوان انتخاب کرد. نسخهای ازین سؤال که بیش از همه مورد توجه قرار میگیرد، دارای ویژگیهای زیر است:
- یک مسئله تصمیم است.
- مسئله ۰ و ۱ است.
- برای هر شی، وزن و ارزش آن برابرند. یعنی.
دقت کنید که در این مورد خاص، این مسئله هم ارز است با: ” مجموعهای از اعداد صحیح نا منفی داده شدهاست. آیا زیر مجموعهای از آن وجود دارد که جمع اعضایش دقیقاً شود؟” و چنانچه وزنهای منفی هم قابل قبول باشند، و برابر با در نظر گرفته شود، مسئله عبارت است از: ” مجموعهای از اعداد صحیح داده شدهاست. آیا زیر مجموعهای غیر تهی از آن هست که جمع اعضایش شود؟” این مسئله خاص، مسئله جمع زیرمجموعهها نامیده میشود. در رمزنگاری، هر گاه از مسئله کوله پشتی نام برده میشود، منظور مسئله جمع زیرمجموعهها است.
چنانچه چند کوله پشتی داشته باشیم، مسئله تبدیل به سؤال bin packing میشود.
پیچیدگی محاسباتی
از دید علوم کامپیوتر، مسئلهٔ کوله پشتی شایان توجه است زیرا:
- الگوریتمی با زمان اجرای شبه چندجملهای با استفاده از برنامهنویسی پویا دارد.
- الگوریتمی تقریبی با زمان چندجملهای دارد که از الگوریتمهای با زمان شبه چندجملهای به عنوان یک زیر-برنامه استفاده میکند.
- حل دقیق این سؤال، مسئلهای از نوع NP-complete است؛ بنابراین پیشبینی شده که راه حلی که هم درست و هم سریع باشد (با زمان اجرای چندجملهای) برای هر ورودی دلخواه، ندارد.
مسئله جمع زیر مجموعهها که نسخهای از مسئلهٔ کلی کوله پشتی است، به عنوان یکی از 21 مسئلهٔ NP-کاملِ Karp مطرح است.
تلاشهایی برای استفاده از مسئلهٔ جمع زیر مجموعهها به عنوان اصل در سیستمهای رمزنگاری کلید عمومی، مانند سیستم رمزنگاری کوله پشتی مرکل-هلمن انجام شد. در این روشها، معمولاً ازگروههایی به جز اعداد صحیح استفاده میشد. Merkle-Hellman و الگوریتمهای مشابه دیگر بعداً با شکست روبرو شدند، زیرا مسائل خاصی که تولید میکردند در زمان چندجملهای قابل حل بودند.
در خیلی از تحقیقات سعی میشود به این سؤال پاسخ داده شود که نمونههای سخت مسئلهٔ کوله پشتی چه هستند؟ یا از دید دیگر، چه ویژگیهایی از مثالهای مسئلهٔ کوله پشتی، باعث میشود در زمانی معقولتر نسبت به آنچه در صورت کلی NP-completeِ سؤال مطرح است، حل شوند. . الگوریتمهای زیادی بر پایه ی: برنامهنویسی پویا، روش تقسیم و حد، یا ترکیبی از هر دو روش برای این مسئله وجود دارند.
راه حل برنامهنویسی پویا
مسئلهٔ کوله پشتی بیکران
اگر تمام وزنها () اعداد صحیح نامنفی باشند، مسئلهٔ کوله پشتی در زمانی شبه چندجملهای با استفاده از برنامهنویسی پویا قابل حل است.
برای سادگی فرض کنید تمام وزنها اکیداً مثبت اند (). میخواهیم جمع ارزش کالاهای انتخاب شده را بیشینه کنیم با این فرض که مجموع وزن آنها حداکثر شود. حال برای هر ، مقدار را بیشترین ارزش قابل دستیابی تعریف کنید بهطوریکه جمع وزن اشیا انتخاب شده حد اکثر شود. بدیهی است که پاسخ مورد نظر است.
دقت کنید که ویژگیهای زیر را دارد:
- (جمع اعضای مجموعهٔ تهی ۰ است)
- که ارزش شی i ام است.
بیشترین ارزش قابل دستیابی از مجموعهٔ تهی، ۰ است. برای محاسبهٔ هر کدام از ها، باید شی را بررسی کرد. همچنین آرایهٔ ، عنصر دارد. بنابراین زمان اجرای این الگوریتم است. بدیهی است با تقسیم کردن بر بزرگترین مقسوم علیه مشترک شان، میتوان زمان اجرای الگوریتم را بهینه کرد.
پیچیدگی زمانی تناقضی با NP-complete بودن مسئلهٔ کوله پشتی ندارد. زیرا برخلاف ، برحسب ورودی چندجملهای نیست. طول ِ ورودی، متناسب با تعداد بیتهای لازم برای نمایش ، یعنی است، نه خود .
مسئلهٔ کوله پشتی ۰ و ۱
روش مشابهی با استفاده از برنامهسازی پویا برای حل مسئله کوله پشتی ۰ و ۱ با پیچیدگی زمانی شبه چندجملهای وجود دارد. مانند بالا، فرض کنید ها اعداد صحیح اکیداً مثبتی هستند. را بیشترین ارزش قابل دستیابی، با استفاده از اشیای ۱ تا با حد اکثر وزن تعریف کنید.
را میتوان بهطور بازگشتی، مطابق زیر تعریف کرد:
- اگر
- اگر .
پاسخ با محاسبهٔ بدست میآید. برای کارآمد شدن راه حل، میتوان از جدولی برای نگهداری نتایج محاسبات قبلی استفاده کرد؛ بنابراین پیچیدگی زمانی آن و حافظه خواهد شد. همچنین میتوان حجم حافظه را به کاهش داد. به این ترتیب که آرایهٔ یک بعدی، ارزش بهینه تا کنون را نشان میدهد. از شروع کرده، آرایه را پر میکنیم. سپس با حرکت بر روی ، مقدار را با افزدون یک شی جدید به انتخابها، به روز آوری میکنیم.
الگوریتم دیگری برای مسئله کوله پشتی ۰ و ۱، در سال ۱۹۷۴ ارائه شد که گاهی «رویارویی در میانه» نیز نامیده میشود. این الگوریتم نسبت به تعداد اشیا نمایی است. (این اسم، از الگوریتمی مشابه در رمزنگاری نشات گرفتهاست). هنگامی که نسبت به بسیار بزرگتر باشد (یعنی از هم بزرگتر باشد)، این الگوریتم نسبت به روش پویا از نظر زمانی بهینه تر است. برای مثال فرض کنیدها نامنفی باشند، اما صحیح نباشند. در اینجا نیز میتوان از روش پویا استفاده کرد: اگر عددها رقم بعد از اعشار داشته باشند، کافی است آنها را در ضرب و سپس رند کرد (با استفاده از محاسبات ممیز ثابت). روش پویا با این تغییرات، از مرتبهٔ زمانی و حافظهٔ خواهد بود.
الگوریتم «رویارویی در میانه» به صورت زیر است:
- مجموعهٔ را به دو مجموعهٔ و با اندازهٔ نسبتاً برابر تقسیم کنید.
- ارزشها و وزنهای هر زیر مجموعه از هریک از و را بدست آورید.
- برای هر زیرمجموعه از ، بهترین مکمل را از زیر مجموعههایش انتخاب کنید: به عبارتی زیر مجموعهای از با بیشترین جمع ارزش کالاها، به نحوی که جمع وزنهای دو زیر مجموعه، از بیشتر نشود. بیشترین ارزش بدست آمده را ذخیره کنید.
این الگوریتم از مرتبهٔ حافظهٔ است و با پیادهسازی بهینه گام ۳، از مرتبهٔ زمانی میشود. (برای مثال با مرتب کردن زیرمجموعههای بر حسب وزن، چشم پوشی از زیر مجموعههایی از که وزنی بیشتر از سایر زیر مجموعهها با ارزش بزرگتر/مساوی دارند و استفاده از جستجوی دودویی برای یافتن بهترین تطابق). مانند روش رویارویی در میانه در رمز نگاری، استفاده از این الگوریتم با هزینه کردن حافظه (مرتبهٔ نمایی به جای مقدار ثابت) باعث بهینه شدن زمان اجرا میشود. میدانیم چنانچه بخواهیم تمام زیر مجموعههای {1…n} را به روش brute force بررسی کنیم، مرتبهٔ زمانی خواهد شد اما با این الگوریتم آن را بهینه کردیم.
الگوریتم تقریبی حریصانه
George Dantzig الگوریتمی تقریبی از نوع حریصانه برای حل مسئله کوله پشتی بیکران ارائه داد.
به این ترتیب که اشیا را به ترتیب نزولی بر حسب ارزش به واحد وزن مرتب میکند () سپس از شی شماره ۱ شروع میکند. بیشترین تعداد ممکن از آن را در کوله پشتی قرار میدهد، تا زمانی که دیگر جای خالی ای برای آن نوع باقی نماند. آنگاه سراغ شی بعدی میرود. (دقت کنید که در این نسخه از سؤال، محدودیتی برای تعداد اشیا نداریم) اگر بیشینه ارزش اشیایی باشد که در کوله پشتی جا میشوند، این الگوریتم حداقل به مقدار دست مییابد. اما اگر تعداد مجاز از هر شی محدود باشد، ممکن است خروجی این الگوریتم از پاسخ بهینه بسیار دور باشد.