مسئله کولهپشتی
![]() | پیشنهاد شدهاست که کولهپشتی ۰ و ۱ در این مقاله ادغام شود. (بحث) پیشنهاد شده از فوریه ۲۰۱۳. |

(راه حل: اگر هر تعداد دلخواهی از جعبهها در دسترس باشد، ۳ جعبهٔ زرد و ۳ جعبهٔ خاکستری پاسخاند. اما اگر مطابق شکل باشد، یعنی از هر جعبه فقط یکی داشته باشیم، تمامی جعبهها به جز جعبهٔ سبز را انتخاب میکنیم)
مسئله کوله پشتی که با عنوانهای Knapsack یا Rucksack مطرح میشود، مسئلهای در بهینهسازی ترکیبیاتی است. فرض کنید مجموعهای از اشیا، که هر کدام داری وزن و ارزش خاصی هستند در اختیار دارید. به هر شی تعدادی را تخصیص دهید بهطوریکه وزن اشیا انتخاب شده کوچکتر یا مساوی حدی از پیش تعیین شده، و ارزش آنها بیشینه شود. علت نامگذاری این مسئله، جهانگردی است که کوله پشتی ای با اندازهٔ محدود دارد و باید آن را با مفیدترین صورت ممکن از اشیا پر کند.
معمولاً در تخصیص منابع با محدودیتهای مالی، با این مسئله روبرو هستیم. همچنین مسائلی از این قبیل در ترکیبیات، نظریه پیچیدگی محاسباتی، رمزنگاری و ریاضیات کاربردی به چشم میخورد.
نسخهٔ مسئله تصمیم برای مسئلهٔ کوله پشتی، این سؤال است: "آیا ارزش V با انتخاب اشیایی با مجموع وزن کمتر یا مساوی W، قابل دستیابی است؟"
محتویات
- ۱ تعریف
- ۲ پیچیدگی محاسباتی
- ۳ راه حل برنامهنویسی پویا
- ۴ الگوریتم تقریبی حریصانه
- ۵ روابط پوشانندگی در مسئلهٔ کوله پشتی بیکران
- ۶ الگوریتم کوله پشتی با استفاده از روش حریصانه
- ۷ شبه کد عقبگرد برای مسئله کوله پشتی ۰و۱
- ۸ کاربردها
- ۹ یک مثال از مسئله کوله پشتی
- ۱۰ تاریخچه
- ۱۱ برای مطالعه
- ۱۲ یادداشتها
- ۱۳ منابع
- ۱۴ پیوند به بیرون
تعریف[ویرایش]
مسئله کوله پشتی چیست؟ فرض کنید که جهانگردی میخواهدکوله پشتی خود را با انتخاب حالتهای ممکن از بین وسائل گوناگونی که بیشترین راحتی را برایش فراهم میسازند پر کند. این مسئله میتواند با شمارهگذاری این وسائل از ۱ تا n و تعریف برداری از متغیرهای دودویی(Binary) (j = ۱٬۲,۳…n) به صورت ریاضی فرمول بندی شود. به این معنی که: اگر شیء j ام انتخاب شود در غیر اینصورت وقتی میزان راحتی باشد که وسیله j ا م فراهم میآورد و وزن آن و c اندازه کوله پشتی باشد. مسئله ما انتخاب برداری از بین بردارهای دودویی x است، که محدودیت را برآورده کند. بطوریکه تابع هدف ماکزیمم مقدار خود را بگیرد به عنوان نمونهای از مسائلی که میتوانند به صورت مسئله کوله پشتی فرمول بندی شوند، مسئله زیر را در نظر بگیرید: فرض کنید که شما مایل به سرمایهگذاری همه یا قسمتی ازسرمایهتان باشید. اگر مبلغی که برای سرمایهگذاری در نظر گرفتید c دلار باشد و n مورد برای سرمایهگذاری ممکن باشد، اجازه دهیدکه سود حاصل از سرمایهگذاری j ام و مقدار دلارهایی باشد که آن سرمایهگذاری لازم دارد. بدین ترتیب جواب بهینه مسئله کوله پشتی که تعریف کردیم به ما این امکان را می دهدکه بهترین حالت ممکن را از بین حالتهای مختلف سرمایهگذاری انتخاب کنیم. در این رابطه باید روشی برای حل این مسئله پیدا کرد. یک روش ابتدایی که در نگاه اول توجه ما را به خود جلب میکند، عبارت از برنامهنویسی برای کامپیوتر به منظور امتحان کردن تمامی بردارهای دودویی ممکن x است، تا از بین بردارهایی که محدودیت مسئله را ارضاء میکنند بهترین را انتخاب کند. متأسفانه تعداد چنین بردارهایی است. بطوریکه یک کامپیوتر فرضی که میتواند یک بیلیون بردار را در یک ثانیه امتحان کند؛ برای n = ۶۰ بیش از ۳۰ سال وقت لازم دارد و بیش از ۶۰ سال برای n = ۶۱ و دهها قرن برای n = ۶۵ والی آخر. با این وجود، با استفاده از الگوریتمهایی خاص میتوان در بسیاری موارد مسئلهای با n = ۱۰۰ ۰۰۰ را در عرض چند ثانیه روی یک کامپیوترکوچک حل کرد __________________
فرض کنید جسم داریم که از تا شمارهگذاری شدهاند. جسم ام ارزشی معادل و وزنی برابر با دارد. معمولاً فرض میشود که وزنها و ارزشها نامنفیاند. برای سادهتر شدن نمایش، بدون کم شدن از کلیت مسئله میتوان فرض کرد اشیا به ترتیب صعودی بر حسب وزنشان مرتب شدهاند. بیشترین وزنی که میتوان در کوله پشتی حمل کرد، است.
معروفترین نوع از این مسئله، مسئلهٔ کوله پشتی ۰ و ۱ است. یعنی تعداد از هر شی، یا ۰ است (آن شی را انتخاب نمیکنیم) یا ۱ (آن شی انتخاب میشود). مسئلهٔ کوله پشتی ۰ و ۱ را میتوان به این صورت، به زبان ریاضی بیان کرد:
- مقدار را بیشینه کنید.
- بهطوریکه
مسئلهٔ کوله پشتی کران دار، نسخهٔ دیگری از این سؤال است که در آن تعداد اشیا () عددی صحیح و نامنفی و حد اکثر برابر با است. به بیان ریاضی:
- مقدار را بیشینه کنید.
- بهطوری که
مسئلهٔ کوله پشتی بیکران (UKP)، هیچ محدودیتی روی تعداد اشیا قائل نمیشود. یعنی از هر شی، به هر تعداد دلخواهی میتوان انتخاب کرد. نسخهای ازین سؤال که بیش از همه مورد توجه قرار میگیرد، دارای ویژگیهای زیر است:
- یک مسئله تصمیم است.
- مسئله ۰ و ۱ است.
- برای هر شی، وزن و ارزش آن برابرند. یعنی.
دقت کنید که در این مورد خاص، این مسئله هم ارز است با: " مجموعهای از اعداد صحیح نا منفی داده شدهاست. آیا زیر مجموعهای از آن وجود دارد که جمع اعضایش دقیقاً شود؟" و چنانچه وزنهای منفی هم قابل قبول باشند، و برابر با در نظر گرفته شود، مسئله عبارت است از: " مجموعهای از اعداد صحیح داده شدهاست. آیا زیر مجموعهای غیر تهی از آن هست که جمع اعضایش شود؟" این مسئله خاص، مسئله جمع زیرمجموعهها نامیده میشود. در رمزنگاری، هر گاه از مسئله کوله پشتی نام برده میشود، منظور مسئله جمع زیرمجموعهها است.
چنانچه چند کوله پشتی داشته باشیم، مسئله تبدیل به سؤال bin packing میشود.
پیچیدگی محاسباتی[ویرایش]
از دید علوم کامپیوتر، مسئلهٔ کوله پشتی شایان توجه است زیرا:
- الگوریتمی با زمان اجرای شبه چندجملهای با استفاده از برنامهنویسی پویا دارد.
- الگوریتمی تقریبی با زمان چندجملهای دارد که از الگوریتمهای با زمان شبه چندجملهای به عنوان یک زیر-برنامه استفاده میکند.
- حل دقیق این سؤال، مسئلهای از نوع NP-complete است؛ بنابراین پیشبینی شده که راه حلی که هم درست و هم سریع باشد (با زمان اجرای چندجملهای) برای هر ورودی دلخواه، ندارد.
مسئله جمع زیر مجموعهها که نسخهای از مسئلهٔ کلی کوله پشتی است، به عنوان یکی از 21 مسئلهٔ NP-کاملِ Karp مطرح است.
تلاشهایی برای استفاده از مسئلهٔ جمع زیر مجموعهها به عنوان اصل در سیستمهای رمزنگاری کلید عمومی، مانند سیستم رمزنگاری کوله پشتی مرکل-هلمن انجام شد. در این روشها، معمولاً از گروههایی به جز اعداد صحیح استفاده میشد. Merkle-Hellman و الگوریتمهای مشابه دیگر بعداً با شکست روبرو شدند، زیرا مسائل خاصی که تولید میکردند در زمان چندجملهای قابل حل بودند.
در خیلی از تحقیقات سعی میشود به این سؤال پاسخ داده شود که نمونههای سخت مسئلهٔ کوله پشتی چه هستند؟[۱][۲] یا از دید دیگر، چه ویژگیهایی از مثالهای مسئلهٔ کوله پشتی، باعث میشود در زمانی معقولتر نسبت به آنچه در صورت کلی NP-completeِ سؤال مطرح است، حل شوند. .[۳] الگوریتمهای زیادی بر پایه ی: برنامهنویسی پویا،[۴] روش تقسیم و حد،[۵] یا ترکیبی از هر دو روش[۳][۶][۷][۸] برای این مسئله وجود دارند.
راه حل برنامهنویسی پویا[ویرایش]
مسئلهٔ کوله پشتی بیکران[ویرایش]
اگر تمام وزنها () اعداد صحیح نامنفی باشند، مسئلهٔ کوله پشتی در زمانی شبه چندجملهای با استفاده از برنامهنویسی پویا قابل حل است.
برای سادگی فرض کنید تمام وزنها اکیداً مثبت اند (). میخواهیم جمع ارزش کالاهای انتخاب شده را بیشینه کنیم با این فرض که مجموع وزن آنها حداکثر شود. حال برای هر ، مقدار را بیشترین ارزش قابل دستیابی تعریف کنید بهطوریکه جمع وزن اشیا انتخاب شده حد اکثر شود. بدیهی است که پاسخ مورد نظر است.
دقت کنید که ویژگیهای زیر را دارد:
- (جمع اعضای مجموعهٔ تهی ۰ است)
- که ارزش شی i ام است.
بیشترین ارزش قابل دستیابی از مجموعهٔ تهی، ۰ است. برای محاسبهٔ هر کدام از ها، باید شی را بررسی کرد. همچنین آرایهٔ ، عنصر دارد. بنابراین زمان اجرای این الگوریتم است. بدیهی است با تقسیم کردن بر بزرگترین مقسوم علیه مشترک شان، میتوان زمان اجرای الگوریتم را بهینه کرد.
پیچیدگی زمانی تناقضی با NP-complete بودن مسئلهٔ کوله پشتی ندارد. زیرا برخلاف ، برحسب ورودی چندجملهای نیست. طول ِ ورودی، متناسب با تعداد بیتهای لازم برای نمایش ، یعنی است، نه خود .
مسئلهٔ کوله پشتی ۰ و ۱[ویرایش]
روش مشابهی با استفاده از برنامهسازی پویا برای حل مسئله کوله پشتی ۰ و ۱ با پیچیدگی زمانی شبه چندجملهای وجود دارد. مانند بالا، فرض کنید ها اعداد صحیح اکیداً مثبتی هستند. را بیشترین ارزش قابل دستیابی، با استفاده از اشیای ۱ تا با حد اکثر وزن تعریف کنید.
را میتوان بهطور بازگشتی، مطابق زیر تعریف کرد:
- اگر
- اگر .
پاسخ با محاسبهٔ بدست میآید. برای کارآمد شدن راه حل، میتوان از جدولی برای نگهداری نتایج محاسبات قبلی استفاده کرد؛ بنابراین پیچیدگی زمانی آن و حافظه خواهد شد. همچنین میتوان حجم حافظه را به کاهش داد. به این ترتیب که آرایهٔ یک بعدی، ارزش بهینه تا کنون را نشان میدهد. از شروع کرده، آرایه را پر میکنیم. سپس با حرکت بر روی ، مقدار را با افزدون یک شی جدید به انتخابها، به روز آوری میکنیم.
الگوریتم دیگری برای مسئله کوله پشتی ۰ و ۱، در سال ۱۹۷۴ ارائه شد[۹] که گاهی «رویارویی در میانه» نیز نامیده میشود. این الگوریتم نسبت به تعداد اشیا نمایی است. (این اسم، از الگوریتمی مشابه در رمزنگاری نشات گرفتهاست). هنگامی که نسبت به بسیار بزرگتر باشد (یعنی از هم بزرگتر باشد)، این الگوریتم نسبت به روش پویا از نظر زمانی بهینه تر است. برای مثال فرض کنید ها نامنفی باشند، اما صحیح نباشند. در اینجا نیز میتوان از روش پویا استفاده کرد: اگر عددها رقم بعد از اعشار داشته باشند، کافی است آنها را در ضرب و سپس رند کرد (با استفاده از محاسبات ممیز ثابت). روش پویا با این تغییرات، از مرتبهٔ زمانی و حافظهٔ خواهد بود.
الگوریتم «رویارویی در میانه» به صورت زیر است:
- مجموعهٔ را به دو مجموعهٔ و با اندازهٔ نسبتاً برابر تقسیم کنید.
- ارزشها و وزنهای هر زیر مجموعه از هریک از و را بدست آورید.
- برای هر زیرمجموعه از ، بهترین مکمل را از زیر مجموعههایش انتخاب کنید: به عبارتی زیر مجموعهای از با بیشترین جمع ارزش کالاها، به نحوی که جمع وزنهای دو زیر مجموعه، از بیشتر نشود. بیشترین ارزش بدست آمده را ذخیره کنید.
این الگوریتم از مرتبهٔ حافظهٔ است و با پیادهسازی بهینه گام ۳، از مرتبهٔ زمانی میشود. (برای مثال با مرتب کردن زیرمجموعههای بر حسب وزن، چشم پوشی از زیر مجموعههایی از که وزنی بیشتر از سایر زیر مجموعهها با ارزش بزرگتر/مساوی دارند و استفاده از جستجوی دودویی برای یافتن بهترین تطابق). مانند روش رویارویی در میانه در رمز نگاری، استفاده از این الگوریتم با هزینه کردن حافظه (مرتبهٔ نمایی به جای مقدار ثابت) باعث بهینه شدن زمان اجرا میشود. میدانیم چنانچه بخواهیم تمام زیر مجموعههای {1...n} را به روش brute force بررسی کنیم، مرتبهٔ زمانی خواهد شد اما با این الگوریتم آن را بهینه کردیم.
الگوریتم تقریبی حریصانه[ویرایش]
George Dantzig الگوریتمی تقریبی از نوع حریصانه برای حل مسئله کوله پشتی بیکران ارائه داد.[۱۰]
به این ترتیب که اشیا را به ترتیب نزولی بر حسب ارزش به واحد وزن مرتب میکند () سپس از شی شماره ۱ شروع میکند. بیشترین تعداد ممکن از آن را در کوله پشتی قرار میدهد، تا زمانی که دیگر جای خالی ای برای آن نوع باقی نماند. آنگاه سراغ شی بعدی میرود. (دقت کنید که در این نسخه از سؤال، محدودیتی برای تعداد اشیا نداریم) اگر بیشینه ارزش اشیایی باشد که در کوله پشتی جا میشوند، این الگوریتم حداقل به مقدار دست مییابد. اما اگر تعداد مجاز از هر شی محدود باشد، ممکن است خروجی این الگوریتم از پاسخ بهینه بسیار دور باشد.
روابط پوشانندگی در مسئلهٔ کوله پشتی بیکران[ویرایش]
در حل مسئلهٔ کوله پشتی بیکران، با کنار گذاشتن اشیایی که هیچوقت مورد استفاده قرار نمیگیرند، میتوان مسئله را سادهتر کرد. برای مثال، فرض کنید برای شی ای مانند i، میتوان زیر مجموعه از اشیا به نام J یافت طوریکه ارزش مجموع آنها بزرگتر از ارزش i و وزن مجموع آنها کمتر از وزن i باشد؛ بنابراین، i نمیتواند در جواب بهینه بیاید. در این هنگام مجموعهٔ J را پوشاننده ی i میگوییم. (توجه کنید این استدلال برای مسئلهٔ کوله پشتی کراندار نمیتواند مورد استفاده قرار گیرد. زیرا ممکن است قبلاً از اشیا سازندهٔ مجموعهٔ J استفاده کرده باشیم و تمام شده باشند)
پیدا کردن روابط پوشانندگی، به ما کمک میکند تا تا حجم فضای جستجو را در حد قابل توجهی کاهش دهیم. انواع مختلفی از روابط پوشانندگی وجود دارند،[۳] که همگی در نامساوی زیر صدق میکنند:
, and for some
که: و . و تعداد انتخابهای شی نوع j را نشان میدهد. (دقت کنید این jها، اعضای مجموعهٔ J هستند)
پوشانندگی انتخابی[ویرایش]
شی ام، بهطور انتخابی توسط پوشانده شده، اگر جمع وزن تعدادی از اعضای مجموعهٔ ، کمتر از باشد و جمع ارزش آنها بیشتر از . به بیان ریاضی:
و درصورتی که که .
بررسی این نوع پوشانندگی، از لحاظ پیچیدگی محاسباتی چندان ساده نیست، بنابراین از بهترین روشها، راه حل پویاست. در واقع این مسئله، یک مسئله کوله پشتی، اما با پارامترهای کوچکتر، مطابق زیر است:
، و اشیا محدود به مجموعهٔ هستند.
نماد ریاضی پوشانندگی انتخابی به صورت است.
پوشانندگی حدی[ویرایش]
شی ام، بهطور حدی توسط پوشانده شده، اگر تعدادی از اشیا نوع توسط پوشانده شوند. به بیان ریاضی:
و در صورتی که و .
این نوع پوشانندگی، نمایش کلی تری از پوشانندگی انتخابی نیست که برای اولین بار در[۴] معرفی شد و در الگوریتم EDUK مورد استفاده قرار گرفت. کوچکترین ممکن، حد نامیده میشود. به بیان ریاضی: . در این هنگام، پاسخ بهینه حد اکثر میتواند به تعداد شی، از نوع را شامل شود.
پوشانندگی چندگانه[ویرایش]
شی ، بهطور چندگانه توسط شی پوشانده شده، اگر توسط تعدادی از شی نوع پوشانده شود. (یعنی شی ، فقط توسط تعدادی شی از نوع پوشانده شود و نیازی به استفاده از اشیا دیگر نباشد). به بیان ریاضی:
و برای
که .
این پوشانندگی میتواند برای بهینه کردن پروسهٔ حل مورد استفاده قرار گیرد، زیرا تشخیص روابط پوشانندگی از این نوع، به محاسبات زیادی نیاز ندارد و نسبتاً ساده است.
نماد ریاضی پوشانندگی انتخابی به صورت است.
پوشانندگی ماژولار[ویرایش]
فرض کنیم بهترین شی باشد، یعنی برای تمام ها، . شی ای با بیشترین چگالی است.
شی ام، بهطور ماژولار توسط شی پوشانده شده، اگر توسط و تعدادی شی از نوع پوشانده شود. (یعنی شی ، فقط توسط و تعدادی شی از نوع پوشانده شود و نیازی به استفاده از اشیا دیگر نباشد) به بیان ریاضی:
و
که .
نماد ریاضی پوشانندگی ماژولار به صورت است.
الگوریتم کوله پشتی با استفاده از روش حریصانه[ویرایش]
void Greedy Knapsack(w,n)
{
//W is the knapsack and the n objects
sort (p,w)//Pi/Wi>=Pi+1/Wi+1
for(i=0;i<n;i++)
x[i]=۰
U=W
for(i=0;i<n;i++)
if(W[i]>u);
break ;
[
x[i]=1;
u=u-[wi]
}
if(i<n)
x[i]=u/w
}
شبه کد عقبگرد برای مسئله کوله پشتی ۰و۱[ویرایش]
از انجاییکه این مسئله بهینهسازی است، ما رد بهترین مجموعه کنونی کالاها و مجموع ارزش آنها را نگه میداریم که اینکار توسط ارائه bestset و و یک متغیر maxprofit انجام میشود. این مسئله را برای یافتن اولین جواب بهینه مطرح میکنیم
مسئله:n کالا داریم که هر کدام از آنها دارای ارزشی و وزنی دارند. ارزشها و وزن ها، اعدادی صحیح و مثبت هستند. مجموعهای از کالاها با حداکثر مجموع ارزش را طوری تعیین کنید که مجموع اوزان آنها بیش از عدد صحیح مثبت w نشود
ورودی:اعداد صحیح مثبت nوw,ارایههای wوpکه از ۱ تاn شاخص دهی شده و هر یک شامل اعداد صحیح و مثبتی هستند که بترتیب غیر نزولی بر اساس مقادیر [p[i]/w[i مرتب شدهاند
خروجی:مقدار صحیح maxprofit که ماکزیمم ارزش است، ارائه bestset که از ۱ تا n شاخص دهی شده و در مقادیر bestsetو "yes"است اگر کالای iام در مجموعه بهینه قرار داشته باشد در غیر اینصورت مقدار ان "no" میباشد
* void knapsack (index I , * int profit , int weight) * { * if (weight<=W && profit>maxprofit){ * maxprofit=profit; * numbest=i; * bestset=include; * } * if(promising(i)){ * include[i+1]=”yes”; * knapsack(i+1,profit+p[i+1],weight+w[i+1]); * include[i+1]=”no” * knapsack(i+1,profit,weight); * } * } * bool promising(index i) * { * index j,k; * int totweight; * float bound; * if(weight>=W) * return false; * else { * j=i+1; * bound=profit; * totweight=weight; * while(j<=n && totweight + w[j]<=W){ * totweight=totweight+w[j]; * bound=bound+p[j]; * j++; * } * k=j; * if(k<=n) * bound=bound+(W-totweight)*p[k]/w[k]; * return bound>maxprofit; * } * }
طبق قرار دادn,w,p,W ,numbest , bestset , include , maxprofit ورودیهای روتین نیستند. اگر این متغیرهای را به صورت سراسری تعریف میکردیم، شبه کد زیر ماکزیمم ارزش و مجموعه دارای این ارزش را تولید میکرد:
* numbest=0; * maxprofit = 0 ; * knapsack(0,0,0); * cout <<maxprofit; // نوشتن ماکزیمم ارزش * for (j=i ; j<=numbest ; j++) //نمایش مجموعه بهینه کالاها * cout<<bestset[i];
کاربردها[ویرایش]
مسئلهٔ کوله پشتی میتواند در تصمیمگیریهایی که در دنیای واقعی با آنها روبرو هستیم، مورد استفاده قرار گیرد. مانند بریدن کالا بهطوریکه کمترین مقدار به هدر رود،[۱۱] انتخاب سرمایهگذاریها و سبد سهام،[۱۲] انتخاب داراییها برای مسئلهٔ امنیت داراییهای قبلی[۱۳] و ساختن کلیدها برای سیستم رمزنگاری کوله پشتیِ مرکل-هلمن.[۱۴]
== یکی از کاربردهای اولیهٔ مسئلهٔ کوله پشتی، طراحی و بارم بندی آزمون است به نحوی که آزمون دهنده در پاسخگویی به سؤالات حق انتخاب داشته باشد. چنانچه بارم بندی سؤالات همگن باشد، مسئله بسیار ساده خواهد شد. برای مثال، اگر آزمون دارای 12 سؤال، هر سؤال به ارزش 10 نمره باشد، آزمون دهنده باید فقط 10 سؤال را پاسخ دهد تا به بیشینه نمره ممکنِ 100 برسد. اما برای آزمونهایی با بارم بندی نایکسان، مسئله کمی سختتر میشود. Feuerman و Weiss سیستمی ارائه دادند که در آن دانش آموزان با آزمونی با بارم بندی ناهمگن، با جمع بارم 125 روبرو هستند. از دانش آموزان خواسته میشود با توجه به تواناییهای خود به سؤالات پاسخ دهند. در اینجا با مسئلهٔ کوله پشتی روبرو هستیم. چه زیر مجموعههایی، جمع نمرهای برابر با 100 خواهند داشت؟ برای هر دانش آموز، پاسخ گویی به کدام زیر مجموعه از سؤالات، نمرهٔ بیشتری را به ارمغان میآورد؟[۱۵]
یک مثال از مسئله کوله پشتی[ویرایش]
صورت مسئله: دزدی قصد سرقت از مغازهای را دارد و حداکثر وزن w از اجناس را که میتواند بدزد در این مغازه n نوع جنس وجود دارد. اگر وزن جنس iام wi و قیمت آن vi باشد بیشینه سودی که بدست میآورد چقدر است؟
این مسئله به دو صورت تعریف میشود: 1- صفر و یک در حالت صفر و یک مسئله به این صورت تعریف میشود که دزد یا یک جنس را برمیدارد یا برنمیدارد و حق برداشتن تکهای از یک جنس را ندارد. برای این مسئله راه حل حریصانهای وجود ندارد و به ارائه یک راه حل پویا خواهیم پرداخت.
ایده حل این مسئله در حالت پویا یه ابن صورت هست که دزد یا جنس iام را برمیدارد یا برنمیدارد و براساس این دو حالت سود زیرمسئله ایجاد شده محاسبه میشود و از مسیری که جواب بیشینه را داده پیش خواهیم رفت. به عبارتی:
کد c[i,w] = c[i-1, w]
if wi ≥ 0 max [vi + c[i-1, w-wi], c[i-1, w]} if i>0 and w ≥ wi
شبه کد Dynamic-0-1-knapsack (v, w, n, W)
for w = 0 to W do c[0, w] = 0 for i = 1 to n do c[i, 0] = 0 for w = 1 to W do if wi ≤ w then if vi + c[i-1, w-wi] then c[i, w] = vi + c[i-1, w-wi] else c[i, w] = c[i-1, w] else c[i, w] = c[i-1, w]
۲-کسری در این حالت از مسئه دزد میتواند قسمتی از یک جنس را بردارد و مثل حالت قبل ۰ و ۱ی نمیباشد. برای این مسئله راه حال حریصانه وجود داره و به این شکل هست که دزد تا میتواند جنس پرارزش تر را برداشته و درصورتی که نتوانست بیشترین کسر ممکن آن را برمیدارد.
تاریخچه[ویرایش]
مسئلهٔ کوله پشتی بیش از یک قرن مورد مطالعه قرار گرفته و اولین بررسی در سال ۱۸۹۷ انجام گرفتهاست.[۱۶] هر چند اولین دادههای ثبت شده در این مورد، به کارهای ریاضیدانی به نام (1884–1956) Tobias Dantzig برمی گردد، چیزی با عنوان مسئلهٔ کوله پشتی قبلاً در میان عامهٔ مردم وجود داشتهاست.[۱۷]
مسئلهٔ کوله پشتی درجه دوم، اولین بار توسط Hammer، Gallo و Simeone در سال ۱۹۶۰ مطرح شد.[۱۸]
در سال ۱۹۸۸، تحقیقی از دانشگاه استونی بروک بر روی مجموعهای از الگوریتمها، نشان داد که از میان ۷۵ مسئلهٔ الگوریتمی، مسئلهٔ کوله پشتی، ۱۸ امین مسئلهٔ معروف و ۴ امین مسئلهٔ پرکاربرد بعد از درخت کی دی، درخت پیشوندی و bin packing problem است.[۱۹]
برای مطالعه[ویرایش]
یادداشتها[ویرایش]
- ↑ Pisinger, D. 2003. Where are the hard knapsack problems? Technical Report 2003/08, Department of Computer Science, University of Copenhagen, Copenhagen, Denmark.
- ↑ L. Caccetta, A. Kulanoot, Computational Aspects of Hard Knapsack Problems, Nonlinear Analysis 47 (2001) 5547–5558.
- ↑ ۳٫۰ ۳٫۱ ۳٫۲ Vincent Poirriez, Nicola Yanev, Rumen Andonov (2009) A Hybrid Algorithm for the Unbounded Knapsack Problem Discrete Optimization http://dx.doi.org/10.1016/j.disopt.2008.09.004 خطای یادکرد: برچسب
<ref>
نامعتبر؛ نام «poirriez et all 2009» چندین بار با محتوای متفاوت تعریف شدهاست. (صفحهٔ راهنما را مطالعه کنید.). - ↑ ۴٫۰ ۴٫۱ Rumen Andonov, Vincent Poirriez, Sanjay Rajopadhye (2000) Unbounded Knapsack Problem: dynamic programming revisited European Journal of Operational Research 123: 2. 168–181 http://dx.doi.org/10.1016/S0377-2217(99)00265-9
- ↑ S. Martello, P. Toth, Knapsack Problems: Algorithms and Computer Implementation, John Wiley and Sons, 1990
- ↑ S. Martello, D. Pisinger, P. Toth, Dynamic programming and strong bounds for the 0-1 knapsack problem , Manag. Sci. , 45:414–424, 1999.
- ↑ G. Plateau, M. Elkihel, A hybrid algorithm for the 0-1 knapsack problem, Methods of Oper. Res. , 49:277–293, 1985.
- ↑ S. Martello, P. Toth, A mixture of dynamic programming and branch-and-bound for the subset-sum problem, Manag. Sci. , 30:765–771
- ↑ Horowitz, Ellis; Sahni, Sartaj (1974), "Computing partitions with applications to the knapsack problem", Journal of the Association for Computing Machinery, 21: 277–292, doi:10.1145/321812.321823 Unknown parameter
|:en:mr=
ignored (help) - ↑ George B. Dantzig, Discrete-Variable Extremum Problems, Operations Research Vol. 5, No. 2, April 1957, pp. 266–288, DOI: http://dx.doi.org/10.1287/opre.5.2.266
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 449
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 461
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 465
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 472
- ↑ Feuerman, Martin; Weiss, Harvey (April 1973). "A Mathematical Programming Model for Test Construction and Scoring". Management Science. 19 (8): 961–966. Unknown parameter
|:en:jstor=
ignored (help) - ↑ Mathews, G. B. (25 June 1897). "On the partition of numbers" (PDF). Proceedings of the London Mathematical Society. 28: 486–490.
- ↑ Kellerer, Pferschy, and Pisinger 2004, p. 3
- ↑ Gallo, G. ; Hammer, P. L. ; Simeone, B. (1980). "Quadratic knapsack problems". Mathematical Programming Studies. 12: 132–149. doi:10.1007/BFb0120892.
- ↑ Skiena, S. S. (September 1999). "Who is Interested in Algorithms and Why? Lessons from the Stony Brook Algorithm Repository" (PDF). AGM SIGACT News. 30 (3): 65–74. ISSN 0163-5700.
منابع[ویرایش]
- Garey, Michael R. (1979). Computers and Intractability: A Guide to the Theory of NP-Completeness. W.H. Freeman. ISBN 0-7167-1045-5. Unknown parameter
|coauthors=
ignored (|author=
suggested) (help) A6: MP9, pg.247. - Kellerer, Hans; Pferschy, Ulrich; Pisinger, David (2004). Knapsack Problems. Springer. ISBN 3-540-40286-1. Unknown parameter
|:en:mr=
ignored (help) - Martello, Silvano; Toth, Paolo (1990). Knapsack problems: Algorithms and computer interpretations. Wiley-Interscience. ISBN 0-471-92420-2. Unknown parameter
|:en:mr=
ignored (help)
پیوند به بیرون[ویرایش]
- Lecture slides on the knapsack problem
- PYAsUKP: Yet Another solver for the Unbounded Knapsack Problem, with code taking advantage of the dominance relations in an hybride algorithm, benchmarks and downloadable copies of some papers.
- Home page of David Pisinger with downloadable copies of some papers on the publication list (including "Where are the hard knapsack problems?")
- [ http://www.rosettacode.org/wiki/Knapsack_Problem Knapsack Problem solutions in many languages] at Rosetta Code
- Dynamic Programming algorithm to 0/1 Knapsack problem
- 0-1 Knapsack Problem in Python
- Interactive JavaScript branch-and-bound solver
- Solving 0-1-KNAPSACK with Genetic Algorithms in Ruby