NP-полнота задачи о рюкзаке — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Формулы --- принудительно png)
(стилистические изменения)
Строка 1: Строка 1:
 
==Формулировка задачи==
 
==Формулировка задачи==
В '''Задаче о рюкзаке''' (Knapsack problem) входными данными являются набор <math>n</math> пар целых чисел <math>\{w_{i}\}</math> - вес и <math>\{v_{i}\}</math> - стоимость, а также два целых числа <math>c</math> - максимальный вес и <math>p</math> - минимальная стоимость. Требуется определить, можно ли выбрать такое подмножество пар, что их суммарная стоимость больше либо равна <math>p</math>, а вес меньше или равен <math>c</math>:
+
В '''задаче о рюкзаке''' (Knapsack problem) входными данными являются набор <math>n</math> пар целых чисел <math>P = \{(w_{i},v_{i})\}^{n}_{i=1}</math>, где <math>w_{i}</math> - вес i-го предмета, а <math>v_{i}</math> - стоимость, и также два целых числа <math>c</math> - максимальный вес и <math>p</math> - минимальная стоимость. Требуется определить, можно ли выбрать такой набор предметов, что их суммарная стоимость больше либо равна <math>p</math>, а вес меньше или равен <math>c</math>:
  
 
<p style="text-align:center;">
 
<p style="text-align:center;">
<math>\exist \{k_{j}\} \subseteq (1..n): (\sum_{i \in k_{j}}{v_{i}} \geq p) \wedge (\sum_{i \in k_{j}}{w_{i}} \leq c)</math>
+
<math>\exist P' \subseteq P: (\sum_{(w_{i},v_{i}) \in P'}{v_{i}} \geq p) \wedge (\sum_{(w_{i},v_{i}) \in P'}{w_{i}} \leq c)</math>
 
</p>
 
</p>
 
==Доказательство NP-полноты==
 
==Доказательство NP-полноты==
Для доказательства того, что <math>\mbox{Knapsack problem} \in NPC</math> необходимо доказать два факта:
+
Для доказательства того, что Knapsack problem <math>\in</math> [[NPC]], необходимо доказать два факта:
*<math>\mbox{Knapsack problem} \in</math> [[NP|<math>NP</math>]]  
+
*Knapsack problem <math>\in</math> [[NP]]  
*<math>\mbox{Knapsack problem} \in</math> [[NPH|<math>NPH</math>]]  
+
*Knapsack problem <math>\in</math> [[NPH]]  
 
===Доказательство принадлежности к NP===
 
===Доказательство принадлежности к NP===
В качестве сертификата возьмем удовлетворяющее условию задачи подмножество пар <math>\{k_{j}\}</math>. Очевидно, оно удовлетворяет всем требованиям,
+
В качестве сертификата возьмем удовлетворяющее условию задачи подмножество пар <math>P'</math> с суммарным весом, не большим <math>c</math> и стоимостью не меньше <math>p</math>. Очевидно, оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция строится очевидным образом и работает за полиномиальное от размера входа время.
налагаемым на сертификат.
 
 
===Доказательство принадлежности к NPH===
 
===Доказательство принадлежности к NPH===
Сведем [[NP-полнота задачи о сумме подмножества|задачу о сумме подмножества]] к задаче о рюкзаке. Пусть <math>f\!\!:(\{s_{i}\},s) \to (\{w_{i}\},\{v_{i}\},c,p)</math> - функция, осуществляющее сведение. Она будет устроена так:   
+
Сведем [[NP-полнота задачи о сумме подмножества|задачу о сумме подмножества]] к задаче о рюкзаке. Пусть <math>f\!\!:(S,s) \to (P,c,p)</math> - функция, осуществляющее сведение. Она будет устроена так:   
  
 
<p style="text-align:center;">
 
<p style="text-align:center;">
<math>f(\{s_{i}\},s) = (\{s_{i}\},\{s_{i}\},s,s) \,</math>
+
<math>f(S,s) = ((S,S),s,s) \,</math>
 
</p>
 
</p>
Очевидно, <math>f~</math> работает за полиномиальное от длины входа время. И удовлетворяет условиям [[Сводимость по Карпу|сводимости по Карпу]].
+
*Очевидно, <math>f~</math> работает за полиномиальное от длины входа время.
 +
*Если исходная [[NP-полнота задачи о сумме подмножества|задача о сумме подмножества]] имела решение <math>S'</math>, то набор пар <math>P'</math> с весами, равными числам из <math>S'</math>, будет решением задачи о рюкзаке.
 +
*В обратную сторону - аналогично.

Версия 09:11, 10 марта 2010

Формулировка задачи

В задаче о рюкзаке (Knapsack problem) входными данными являются набор [math]n[/math] пар целых чисел [math]P = \{(w_{i},v_{i})\}^{n}_{i=1}[/math], где [math]w_{i}[/math] - вес i-го предмета, а [math]v_{i}[/math] - стоимость, и также два целых числа [math]c[/math] - максимальный вес и [math]p[/math] - минимальная стоимость. Требуется определить, можно ли выбрать такой набор предметов, что их суммарная стоимость больше либо равна [math]p[/math], а вес меньше или равен [math]c[/math]:

[math]\exist P' \subseteq P: (\sum_{(w_{i},v_{i}) \in P'}{v_{i}} \geq p) \wedge (\sum_{(w_{i},v_{i}) \in P'}{w_{i}} \leq c)[/math]

Доказательство NP-полноты

Для доказательства того, что Knapsack problem [math]\in[/math] NPC, необходимо доказать два факта:

  • Knapsack problem [math]\in[/math] NP
  • Knapsack problem [math]\in[/math] NPH

Доказательство принадлежности к NP

В качестве сертификата возьмем удовлетворяющее условию задачи подмножество пар [math]P'[/math] с суммарным весом, не большим [math]c[/math] и стоимостью не меньше [math]p[/math]. Очевидно, оно удовлетворяет всем требованиям, налагаемым на сертификат. Проверяющая функция строится очевидным образом и работает за полиномиальное от размера входа время.

Доказательство принадлежности к NPH

Сведем задачу о сумме подмножества к задаче о рюкзаке. Пусть [math]f\!\!:(S,s) \to (P,c,p)[/math] - функция, осуществляющее сведение. Она будет устроена так:

[math]f(S,s) = ((S,S),s,s) \,[/math]

  • Очевидно, [math]f~[/math] работает за полиномиальное от длины входа время.
  • Если исходная задача о сумме подмножества имела решение [math]S'[/math], то набор пар [math]P'[/math] с весами, равными числам из [math]S'[/math], будет решением задачи о рюкзаке.
  • В обратную сторону - аналогично.