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

چیزی که در تمام نسخه‌های این مسئله مشترک است، وجود مجموعه‌ای با n عضو است، که هر عضو با اندیس j که {\displaystyle 1\leq j\leq n}، یک ارزش {\displaystyle p\_{j}} و وزن {\displaystyle w\_{j}} دارد. متغیر دودویی تصمیم x\_{j} برای انتخاب کردن اشیا به کار میرود. هدف برداشتن تعدادی از اعضا است، به طوری که ارزش کلشان بیشینه شود و در عین حال بیشینه مجموع وزن اشیا انتخاب‌شده از W تجاوز نکند. در حالت کلی، این ضرایب در عددی ضرب می‌شوند (مقیاس می‌شوند) تا به اعداد صحیح تبدیل شوند و همیشه فرض می‌شود که این ضرایب عدد طبیعی هستند.

**مسئله کوله‌پشتی** در ساده‌ترین شکل به صورت زیر است:

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}} را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}\leq W}،{\displaystyle x\_{j}\in \{0,1\}}،{\displaystyle \forall j\in \{1,\ldots ,n\}}.

کلی‌سازی مستقیم
---------------

یک شکل رایج این مسئله این است که هر عضو بتواند چندین بار انتخاب شود. **مسئله کوله‌پشتی محدود** برای هر عضو j، یک کران بالای {\displaystyle u\_{j}} (که می‌تواند یک عدد صحیح مثبت یا بی‌نهایت باشد.) که تعداد دفعاتی است که عضو jام انتخاب شده‌است را مشخص می‌کند:

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}} را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}\leq W}، {\displaystyle u\_{j}\geq x\_{j}\geq 0} و
x\_{j} برای هر j عددی صحیح است.

**مسئله کوله‌پشتی نامحدود** (که گاهی اوقات مسئله **کوله‌پشتی صحیح** نیز خوانده می‌شود) برای تعداد تکرارهای یک عضو کران بالایی قرار نمی‌دهد:

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}} را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}\leq W} و {\displaystyle x\_{j}\geq 0}، {\displaystyle x\_{j}} برای هر j عددی صحیح است.

در سال 1975 لوکر ثابت کرد که نوع نامحدود مسئله ان‌پی کامل است. هر دو نوع محدود و نامحدود این مسئله یک FPTAS دارند (در اصل شبیه به همان است که در مسئله کوله‌پشتی 0-1 استفاده شد).

اگر اعضا در *k* دسته که با {\displaystyle N\_{i}} نشان داده می‌شوند طبقه بندی شوند، و دقیقاً از هر کلاس یک عضو انتخاب شود آنگاه با **مسئله کوله‌پشتی چند گزینه ای** روبرو هستیم:

{\displaystyle \sum \_{i=1}^{k}\sum \_{j\in N\_{i}}p\_{ij}x\_{ij}}
را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{i=1}^{k}\sum \_{j\in N\_{i}}w\_{ij}x\_{ij}\leq W} ؛ {\displaystyle \sum \_{j\in N\_{i}}x\_{ij}=1}، برای هر {\displaystyle 1\leq i\leq k}
و {\displaystyle x\_{ij}\in \{0,1\}}، برای هر{\displaystyle 1\leq i\leq k} و هر {\displaystyle j\in N\_{i}}.

اگر برای هر عضو ارزش و وزنش یکسان باشند، با مسئله جمع زیرمجموعه ها روبرو هستیم (اغلب مسئله تصمیم که متناظر با آن است به جای آن داده می‌شود):

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}}
را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}\leq W}، {\displaystyle x\_{j}\in \{0,1\}}.

اگر *n* عضو و *m* کوله‌پشتی با ظرفیت {\displaystyle W\_{i}} داشته باشیم،با **مسئله کوله‌پشتی چندگانه** روبرو هستیم:

{\displaystyle \sum \_{i=1}^{m}\sum \_{j=1}^{n}p\_{j}x\_{ij}}
را بیشینه کنید، به طوریکه {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{ij}\leq W\_{i}}، برای هر {\displaystyle 1\leq i\leq m}

و {\displaystyle \sum \_{i=1}^{m}x\_{ij}\leq 1}، برای هر {\displaystyle 1\leq j\leq n}

و {\displaystyle x\_{ij}\in \{0,1\}}، برای هر {\displaystyle 1\leq j\leq n} و هر {\displaystyle 1\leq i\leq m}.

به عنوان یک حالت خاصِ مسئله کوله‌پشتی چندگانه، هنگامی که ارزش‌ها با وزن‌ها برابر و همه صندوق‌ها حجم برابر داشته باشند، با **مسئله حاصل جمع زیرمجموعه‌های چندگانه** روبرو هستیم:

**مسئله کوله‌پشتی درجه دوم**:

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}+\sum \_{i=1}^{n-1}\sum \_{j=i+1}^{n}p\_{ij}x\_{i}x\_{j}} را بیشینه کنید، به طوری‌که {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}\leq W}،
{\displaystyle x\_{j}\in \{0,1\}}
برای هر
{\displaystyle 1\leq j\leq n}.

**مسئله کوله‌پشتی مجموعه-اجتماع(SUKP)**:

SUKP توسط Kellerer و همکارانش ( در صفحه 423) همانطور که در ادامه آمده تعریف شده‌است:

> 
> مجموعه {\displaystyle N=\{1,\ldots ,n\}} شامل n عضو و {\displaystyle P=\{1,\ldots ,m\}} شامل m عضو داده شده است، هر عضو j به یک زیرمجموعه {\displaystyle P\_{j}} از مجموعه P مربوط میشود. برای هر{\displaystyle j=1,\ldots ,n} ، عضو jام ارزش نامنفی {\displaystyle p\_{j}} دارد، و برای هر {\displaystyle i=1,\ldots ,m} ، عضو i ام وزن نامنفی w\_i دارد. وزن کلی یک مجموعه از اعضا برابر با مجموع وزن اعضای متناظر آن در مجموعه است. هدف پیدا کردن زیرمجموعه ای از عضوها است که وزن کلی آن از حجم کوله‌پشتی بیشتر نشود و ارزش بیشینه را داشته باشد.
> 
>

محدودیت چندگانه
---------------

اگر بیشتر از یک محدودیت وجود داشته‌باشد (برای مثال هم محدودیت حجمی و هم محدودیت وزنی داشته‌باشیم، در حالی‌که حجم و وزن هر شی هیچ رابطه‌ای با یکدیگر ندارند)، به **مسئلهٔ کوله‌پشتی با شرایط چندگانه**، **مسئله کوله‌پشتی چند بعدی**، یا **مسئله کوله‌پشتی m- بعدی** می‌رسیم (توجه کنید که "بُعد" در این‌جا هیچ ارتباطی به شکل اشیا ندارد). این مسئله انواع 0-1، محدود و نامحدود دارد که نوع نامحدود آن در زیر نشان داده شده‌است:

{\displaystyle \sum \_{j=1}^{n}p\_{j}x\_{j}}
را بیشینه کنید، به طوریکه
{\displaystyle \sum \_{j=1}^{n}w\_{ij}x\_{j}\leq W\_{i}}
، برای هر
{\displaystyle 1\leq i\leq m}

{\displaystyle x\_{j}\geq 0}، x\_{j} برای هر {\displaystyle 1\leq j\leq n} عددی صحیح باشد.

در حدود سال 1980 نشان داده شد که نوع 0-1 مسئله (برای هر {\displaystyle m\geq 2} ثابت) ان‌پی کامل است و به‌طور قویتر FPTAS ندارد مگر اینکه P = NP.

انواع محدود و نامحدود مسئله نیز (برای هر{\displaystyle m\geq 2} ثابت) درجه سختی مشابه دارند.

برای هر {\displaystyle m\geq 2} ثابت، این مسائل یک زمان اجرای شبه چندجمله‌ای (مشابه مسئله کوله‌پشتی اصلی) و یک PTAS دارند.

مسئله‌های مشابه کوله‌پشتی
-------------------------

اگر ارزش همهٔ اشیا یک باشد می‌توانیم تلاش کنیم تا تعداد اشیایی که کوله‌پشتی را کاملاً پر می‌کنند، کمینه کنیم:

{\displaystyle \sum \_{j=1}^{n}x\_{j}} را کمینه کنید، به طوریکه {\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}=W} و
{\displaystyle x\_{j}\in \{0,1\}}،
{\displaystyle \forall j\in \{1,\ldots ,n\}}.

اگر تعدادی جعبه (با سایز یکسان) داشته باشیم و هدف قرار دادن همهٔ n شی در حداقل تعداد جعبه ممکن باشد به مسللهٔ **bin packing** (بسته بندی جعبه ها) می‌رسیم که با متغیرهای شاخص مدل می‌شود و {\displaystyle y\_{i}=1} است اگر و تنها اگر جعبهٔ *i*م استفاده شود:

{\displaystyle \sum \_{i=1}^{n}y\_{i}}
را کمینه کنید، به طوریکه
{\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{ij}\leq Wy\_{i}}،
{\displaystyle \forall i\in \{1,\ldots ,n\}}

و {\displaystyle \sum \_{i=1}^{n}x\_{ij}=1}، {\displaystyle \forall j\in \{1,\ldots ,n\}}

و {\displaystyle y\_{i}\in \{0,1\}}، {\displaystyle \forall i\in \{1,\ldots ,n\}}

و {\displaystyle x\_{ij}\in \{0,1\}}، {\displaystyle \forall i\in \{1,\ldots ,n\}\wedge \forall j\in \{1,\ldots ,n\}}.

مسئلهٔ cutting stock مشابه مسئلهٔ bin packing است، اما از آن‌جا که نمونه‌های عملی انواع کمتری از اعضا دارند، اغلب از فرمول دیگری استفاده می‌شود. عضو *j*م {\displaystyle B\_{j}} مرتبه نیاز است، هر الگویی از اعضا که برای یک کوله‌پشتی مناسب باشد یک متغیر x\_i دارد(*m* الگو وجود دارد) و الگوی *i* عضو *j* را {\displaystyle b\_{ij}} بار استفاده می‌کند:

{\displaystyle \sum \_{i=1}^{m}x\_{i}}
را کمینه کنید، به طوریکه
{\displaystyle \sum \_{i=1}^{m}b\_{ij}x\_{i}\leq B\_{j}}
برای هر 
{\displaystyle 1\leq j\leq n}
و {\displaystyle x\_{i}\in \{0,1,\ldots ,n\}}
برای هر
{\displaystyle 1\leq i\leq m}.

اگر برای مسئله کوله‌پشتی چندگزینه‌ای که در آن‌ها چند انتخاب وجود دارد، این محدودیت که در آن سایز هر زیرمجموعه *n* باشد را اضافه کنیم و محدودیت بر روی وزن کلی را حذف کنیم، به مسئلهٔ **assignment** می‌رسیم که مسئلهٔ پیدا کردن یک جور سازی دوبخشی بیشینه نیز است:

{\displaystyle \sum \_{i=1}^{k}\sum \_{j=1}^{n}p\_{ij}x\_{ij}}
را بیشینه کنید، به طوریکه
{\displaystyle \sum \_{i=1}^{n}x\_{ij}=1}
برای هر 
{\displaystyle 1\leq j\leq n}

و {\displaystyle \sum \_{j=1}^{n}x\_{ij}=1}
برای هر
{\displaystyle 1\leq i\leq n}

و {\displaystyle x\_{ij}\in \{0,1\}}
برای هر {\displaystyle 1\leq i\leq k} و برای هر {\displaystyle j\in N\_{i}}.

در **مسئله کوله‌پشتی با چگالی بیشینه** وزن اولیه {\displaystyle W\_{0}} است و ما تراکم اشیای انتخابی را تا زمانی‌که با محدودیت‌های ظرفیت مغایرت نداشته باشد، زیاد می‌کنیم:

{\displaystyle {\frac {\sum \_{j=1}^{n}x\_{j}p\_{j}}{w\_{0}+\sum \_{j=1}^{n}x\_{j}w\_{j}}}}
را بیشینه کنید، به طوریکه
{\displaystyle \sum \_{j=1}^{n}w\_{j}x\_{j}\leq W} و {\displaystyle x\_{j}\in \{0,1\}}، {\displaystyle \forall j\in \{1,\ldots ,n\}}.

تعداد دیگری مسئله‌های مشابه کوله‌پشتی نیز وجود دارند که البته نسبت به مسئله‌های ذکرشده کمتر متداول هستند، شامل:

* مسئله کوله‌پشتی تو در تو
* مسئله کوله‌پشتی سقوط‌کننده
* مسئله کوله‌پشتی غیرخطی
* مسئله کوله‌پشتی معکوس پارامتری

سه مسئلهٔ آخر در مرجع کار Kellerer و همکارانش، Knapsack Problems، مورد بحث و بررسی قرار گرفته‌اند.

منابع و ماخذ
------------

1. ↑  Lueker, G.S. (1975). "Report No. 178, Computer Science Laboratory, Princeton". `{{cite journal}}`: Cite journal requires `|journal=` (help); `|contribution=` ignored (help)
2. 1 2 3  Kellerer, Hans and Pferschy, Ulrich and Pisinger, David (2004). *Knapsack Problems*. اشپرینگر ساینس+بیزینس مدیا. ISBN 3-540-40286-1. `{{cite book}}`: Unknown parameter `|unused_data=` ignored (help)نگهداری یادکرد:نام‌های متعدد:فهرست نویسندگان (link)
3. ↑  Gens, G. V. and Levner, E. V. (1979). "Complexity and Approximation Algorithms for Combinatorial Problems: A Survey". Central Economic and Mathematical Institute, Academy of Sciences of the USSR, Moscow.`{{cite news}}`: نگهداری یادکرد:استفاده از پارامتر نویسندگان (link)
4. ↑  "On the Existence of Fast Approximation Schemes". *Nonlinear Programming*. Academic Press. **4**: 415–437. 1980.
5. ↑  Magazine, M. J.; Chern, M.-S. (1984). "A Note on Approximation Schemes for Multidimensional Knapsack Problems". *Mathematics of Operations Research*. **9** (2): 244–247. doi:10.1287/moor.9.2.244.
6. ↑  Cohen, R. and Katzir, L. 2008. The Generalized Maximum Coverage Problem. *Inf. Process. Lett*. 108, 1 (Sep. 2008), 15-22.

* "Algorithms for Knapsack Problems", D. Pisinger. Ph.D. thesis, DIKU, University of Copenhagen, Report 95/1 (1995).