Задача о рюкзаке — различия между версиями
Skipor (обсуждение | вклад) (→Другие задачи семейства) |
|||
Строка 137: | Строка 137: | ||
Задача выбрать число <tex>x_i</tex> предметов каждого типа так, чтобы | Задача выбрать число <tex>x_i</tex> предметов каждого типа так, чтобы | ||
− | максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> | + | * максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> |
− | выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> | + | * выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> |
− | + | <tex> x_i \in (0,1,...,b_i)</tex> для всех <tex> i= 1,2,...,N</tex> | |
===Варианты решения=== | ===Варианты решения=== | ||
При небольших <tex>b_i</tex> решается сведением к классической задаче о рюкзаке. В иных случаях: | При небольших <tex>b_i</tex> решается сведением к классической задаче о рюкзаке. В иных случаях: | ||
− | * Методом ветвей и границ | + | * Методом ветвей и границ. |
− | * Методом динамического программирования | + | * Методом динамического программирования. |
===Метод динамического программирования=== | ===Метод динамического программирования=== | ||
Строка 155: | Строка 155: | ||
Тогда меняя i от 1 до <tex>N</tex>, расчитаем на каждом шаге <tex>d(i,c)</tex>, для <tex>c</tex> от 0 до <tex>W</tex>, по рекурентной формуле: | Тогда меняя i от 1 до <tex>N</tex>, расчитаем на каждом шаге <tex>d(i,c)</tex>, для <tex>c</tex> от 0 до <tex>W</tex>, по рекурентной формуле: | ||
− | <tex>d(i,c) = max(d(i - 1, c - lw_i) + lp_i | + | <tex>d(i,c) = max(d(i - 1, c - lw_i) + lp_i) </tex> по всем целым <tex> l </tex> из промежутка <tex> 0 \le l \le min(b_i,\lfloor c/w_i \rfloor)</tex> |
Если не нужно востанавливать ответ, то можно использовать одномерный массив <tex>d(c)</tex> вместо двумерного. | Если не нужно востанавливать ответ, то можно использовать одномерный массив <tex>d(c)</tex> вместо двумерного. | ||
Строка 164: | Строка 164: | ||
=== Реализация === | === Реализация === | ||
for i = 0..W // база | for i = 0..W // база | ||
− | d[0][i] = 0 | + | d[0][i] = 0; |
− | for i = 1..N | + | for i = 1..N |
for c = 0..W //Перебираем для каждого i, все вместисмости | for c = 0..W //Перебираем для каждого i, все вместисмости | ||
− | d[i][c] = d[i - 1][c] | + | d[i][c] = d[i - 1][c]; |
for l = min(b[i], c / w[i]) .. 1 // ищем l для которого выполняется максимум | for l = min(b[i], c / w[i]) .. 1 // ищем l для которого выполняется максимум | ||
− | d[i][c] = max(d[i][c], d[i - 1][c - l * w[i]] + p[i] * l) | + | d[i][c] = max(d[i][c], d[i - 1][c - l * w[i]] + p[i] * l); |
− | == | + | ==Неограниченный рюкзак== |
− | ''' | + | '''Неограниченный рюкзак''' (англ.''Unbounded Knapsack Proble'') - обобщение ограниченого рюкзака, в котором любой предмет может быть выбран любое количество раз. |
'''Пример:''' перекупщик закупается на оптовой базе. Он может увезти ограниченное количество товара, количество товара каждого типа на базе не ограниченно. Нужно увезти товара на максимальную сумму. | '''Пример:''' перекупщик закупается на оптовой базе. Он может увезти ограниченное количество товара, количество товара каждого типа на базе не ограниченно. Нужно увезти товара на максимальную сумму. | ||
Строка 179: | Строка 179: | ||
Задача выбрать количество <tex>x_i</tex> предметов каждого типа так, чтобы | Задача выбрать количество <tex>x_i</tex> предметов каждого типа так, чтобы | ||
− | максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> | + | *максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> |
− | выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> | + | *выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> |
<tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | <tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | ||
Строка 187: | Строка 187: | ||
===Варианты решения=== | ===Варианты решения=== | ||
Самые распространенные методы точного решения это: | Самые распространенные методы точного решения это: | ||
− | * Метод ветвей и границ | + | * Метод ветвей и границ. |
− | * Метод динамического программирования | + | * Метод динамического программирования. |
===Метод динамического программирования=== | ===Метод динамического программирования=== | ||
Строка 210: | Строка 210: | ||
<tex> d(c) = max(d(c), d(c - w_i) + p_i) </tex> | <tex> d(c) = max(d(c), d(c - w_i) + p_i) </tex> | ||
− | |||
Строка 222: | Строка 221: | ||
Задача выбрать часть <tex>x_i</tex> каждого предмета так, чтобы | Задача выбрать часть <tex>x_i</tex> каждого предмета так, чтобы | ||
− | максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> | + | *максимизировать общую стоимость: <tex>\sum_{i=1}^N p_ix_i</tex> |
− | выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> | + | *выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> |
<tex> 0 \le x_i \le 1</tex> дробное, для всех <tex> i= 1,2,...,N</tex> | <tex> 0 \le x_i \le 1</tex> дробное, для всех <tex> i= 1,2,...,N</tex> | ||
===Варианты решения=== | ===Варианты решения=== | ||
− | + | Возможность брать любую часть от предмета сильно упрощает задачу. Жадный алгоритм дает оптимальное решение в данном случае. | |
=== Реализация === | === Реализация === | ||
− | sort() // сортируем в порядке убывания удельной стоимости. | + | sort(); // сортируем в порядке убывания удельной стоимости. |
for i = 1..N // идем по предметам | for i = 1..N // идем по предметам | ||
if W >= w[i] //если помещается - берем | if W >= w[i] //если помещается - берем | ||
− | summ += p[i] | + | summ += p[i]; |
− | W -= w[i] | + | W -= w[i]; |
else | else | ||
− | summ += W / w[i] * p[i] // иначе берем сколько можно и выходим | + | summ += W / w[i] * p[i];// иначе берем сколько можно и выходим |
− | + | break; | |
==Задача о суммах подмножеств== | ==Задача о суммах подмножеств== | ||
Строка 248: | Строка 247: | ||
Нужно выбрать подмножество так, чтобы сумма ближе всего к <tex>W</tex>, но не превысила его. Более формально, нужно найти набор бинарных величин <tex>x_i</tex>, так чтобы | Нужно выбрать подмножество так, чтобы сумма ближе всего к <tex>W</tex>, но не превысила его. Более формально, нужно найти набор бинарных величин <tex>x_i</tex>, так чтобы | ||
− | максимизировать общую стоимость: <tex>\sum_{i=1}^N w_ix_i</tex> | + | *максимизировать общую стоимость: <tex>\sum_{i=1}^N w_ix_i</tex> |
− | выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> | + | *выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_i \le W</tex> |
<tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | <tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | ||
Строка 256: | Строка 255: | ||
===Варианты решения=== | ===Варианты решения=== | ||
Для решения пригодны любые методы для классической задачи, однако специализированые алгоритмы, обычно более оптимальны по параметрам. Используется: | Для решения пригодны любые методы для классической задачи, однако специализированые алгоритмы, обычно более оптимальны по параметрам. Используется: | ||
− | * Метод динамического программирования | + | * Метод динамического программирования. |
− | * Гибридный метод на основе динамического программирования и поиска по дереву. <tex> | + | * Гибридный метод на основе динамического программирования и поиска по дереву. |
+ | |||
+ | Существуют алгоритмы основанные на этом методе со сложностью <tex>min(2\log_{10}max(w_j), 0.7n) </tex> и <tex>min(2,5\log_{10}(max(w_j), 0.8n)</tex>. | ||
===Метод динамического программирования=== | ===Метод динамического программирования=== | ||
Строка 286: | Строка 287: | ||
Задача выбрать количество <tex>x_i</tex> предметов каждого типа так, чтобы | Задача выбрать количество <tex>x_i</tex> предметов каждого типа так, чтобы | ||
− | минимизировать количество взятых предметов: <tex>\sum_{i=1}^N x_i</tex> | + | *минимизировать количество взятых предметов: <tex>\sum_{i=1}^N x_i</tex> |
− | сумма весов выбранных предметов равнялась вместимости рюкзака: <tex>\sum_{i=1}^N w_ix_i = W</tex> | + | *сумма весов выбранных предметов равнялась вместимости рюкзака: <tex>\sum_{i=1}^N w_ix_i = W</tex> |
<tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | <tex> x_i \ge 0 </tex> целое, для всех <tex> i= 1,2,...,N</tex> | ||
===Варианты решения=== | ===Варианты решения=== | ||
Самые распространенные методы точного решения это: | Самые распространенные методы точного решения это: | ||
− | * Метод ветвей и границ | + | * Метод ветвей и границ. |
− | * Метод динамического программирования | + | * Метод динамического программирования. |
===Метод динамического программирования=== | ===Метод динамического программирования=== | ||
Строка 326: | Строка 327: | ||
Математически задачу можно представить так: | Математически задачу можно представить так: | ||
− | минимизировать количество рюкзаков: <tex>\sum_{i=1}^N y_i</tex> | + | *минимизировать количество рюкзаков: <tex>\sum_{i=1}^N y_i</tex> |
− | так чтобы выполнялось условие на совместность: | + | *так чтобы выполнялось условие на совместность: <tex>\sum_{i=1}^N w_ix_{ij} \le Wy_j \qquad j \in {1, ..., N}</tex> |
− | <tex>\sum_{i=1}^N w_ix_{ij} \le Wy_j \qquad j \in {1, ..., N}</tex> | ||
<tex> | <tex> | ||
Строка 354: | Строка 354: | ||
'''Пример:''' У транспортной компании есть парк машин разной грузоподъемности. Нужно перевезти товара на максимальную сумму с одного склада на другой единовременно. | '''Пример:''' У транспортной компании есть парк машин разной грузоподъемности. Нужно перевезти товара на максимальную сумму с одного склада на другой единовременно. | ||
===Формулировка Задачи=== | ===Формулировка Задачи=== | ||
− | + | Максимизировать <tex>\sum_{i=1}^M \sum_{j=1}^{N} p_jx_{ij}</tex> | |
− | так чтобы <tex>\sum_{i=1}^N w_jx_{ij} \le W_i</tex> выполнялось для всех <tex> i= 1,2,...,N</tex> | + | так, чтобы <tex>\sum_{i=1}^N w_jx_{ij} \le W_i</tex> выполнялось для всех <tex> i= 1,2,...,N</tex>. |
<tex>\sum_{j=1}^{M}x_{ij}=1</tex> для всех <tex> i= 1,2,...,N</tex> | <tex>\sum_{j=1}^{M}x_{ij}=1</tex> для всех <tex> i= 1,2,...,N</tex> | ||
Строка 376: | Строка 376: | ||
===Формулировка Задачи=== | ===Формулировка Задачи=== | ||
− | + | Максимизировать стоимость выбранных предметов <tex>\sum_{i=1}^M\sum_{j=1}^N p_{ij} x_{ij}</tex>, | |
− | + | ||
− | + | при выполнении условия совместности <tex>\sum_{j=1}^N w_{ij} x_{ij} \le W_i \qquad i=1, \ldots, M</tex>. | |
− | + | ||
+ | <tex> \sum_{i=1}^M x_{ij} \leq 1 \qquad j=1, \ldots, N</tex>; | ||
+ | |||
+ | <tex> x_{ij} \in \{0,1\} \qquad i=1, \ldots, N, \quad j=1, \ldots, N</tex>; | ||
===Варианты решения=== | ===Варианты решения=== |
Версия 12:04, 13 января 2013
Задача о рюкзаке(англ. Knapsack problem) — дано
предметов, предмет имеет массу и стоимость . Необходимо выбрать из этих предметов такой набор, чтобы суммарная масса не превосходила заданной величины (вместимость рюкзака), а суммарная стоимость была максимальна.Содержание
- 1 Формулировка задачи
- 2 Варианты решения
- 3 Метод динамического программирования
- 4 Реализация
- 5 Пример
- 6 Другие задачи семейства
- 7 Литература
Формулировка задачи
Дано
предметов, - вместимость рюкзака, — соответствующий ему набор положительных целых весов, — соответствующий ему набор положительных целых стоимостей. Нужно найти набор бинарных величин , где , если предмет включен в набор, , если предмет не включен, и такой что:- максимальна.
Варианты решения
Задачу о рюкзаке можно решить несколькими способами:
- Перебирать все подмножества набора из N предметов. Сложность такого решения .
- Методом Meet-in-the-middle. Сложность решения
- Метод динамического программирования. Сложность - .
Метод динамического программирования
Пусть
есть максимальная стоимости предметов, которые можно уложить в рюкзак вместимости , если можно использовать только первые предметов, то есть , назовем этот набор допустимых предметов для .
Найдем
. Возможны 2 варианта:- Если предмет не попал в рюкзак. Тогда равно максимальной стоимости рюкзака с такой же вместимостью и набором допустимых предметов , то есть
- Если попал в рюкзак. Тогда равно максимальной стоимости рюкзака, где вес уменьшаем на вес -ого предмета и набор допустимых предметов плюс стоимость , то есть
То есть:
Выберем из этих двух значений максимальное:
Стоимость искомого набора равна
, так как нужно найти максимальную стоимость рюкзака, где все предметы допустимы и вместимость рюкзака .Восстановим набор предметов, входящих в рюкзак
Будем определять, входит ли
предмет в искомый набор. Начинаем с элемента , где , . Для этого сравниваем со следующими значениями:- Максимальная стоимость рюкзака с такой же вместимостью и набором допустимых предметов , то есть
- Максимальная стоимость рюкзака с вместимостью на меньше и набором допустимых предметов плюс стоимость , то есть
Заметим, что при построении
мы выбирали максимум из этих значений и записывали в . Тогда будем сравнивать c , если равны, тогда не входит в искомый набор, иначе входит.Реализация
Сначала генерируем
.for i = 0..W A[0][i] = 0; for i = 0..N A[i][0] = 0; //Первые элементы приравниваем к 0 for k = 1..N for s = 0..W //Перебираем для каждого k все вместисмости if s >= w[k] //Если текущий предмет вмещается в рюкзак A[k][s] = max(A[k-1][s], A[k-1][s-w[k]]+p[k]); //выбираем класть его или нет else A[k][s] = A[k-1][s]; //иначе, не кладем
Затем найдем набор
предметов, входящих в рюкзак, рекурсивной функцией:findAns(k, s) if A[k][s] == 0 return; if A[k-1][s] == A[k][s] findAns(k-1, s); else findAns(k-1, s - w[k]); ans.push(k);
Сложность алгоритма
Пример
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | |
k = 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
k = 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
k = 2 | 0 | 0 | 0 | 1 | 6 | 6 | 6 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
k = 3 | 0 | 0 | 0 | 1 | 6 | 6 | 6 | 7 | 7 | 10 | 10 | 10 | 11 | 11 |
k = 4 | 0 | 0 | 0 | 1 | 6 | 6 | 6 | 7 | 7 | 10 | 10 | 10 | 13 | 13 |
k = 5 | 0 | 0 | 0 | 1 | 6 | 6 | 6 | 7 | 7 | 10 | 10 | 10 | 13 | 13 |
Числа от 0 до 13 в первой строчке обозначают вместимость рюкзака.
В первой строке как только вместимость рюкзака
, добавляем в рюкзак 1 предмет.Рассмотрим
, при каждом так как сравниваем и и записываем в стоимость либо рюкзака без третьего предмета, но с таким же весом, либо с третьим предметом, тогда стоимость равна стоимости третьего предмета плюс стоимость рюкзака с вместимостью на меньше.Максимальная стоимость рюкзака находится в
.Восстановление набора предметов, из которых состоит максимально дорогой рюкзак.
Начиная с
восстанавливаем ответ.Таким образом, в набор входит
и предмет.Стоимость рюкзака
Вес рюкзака
Другие задачи семейства
Ограниченный рюкзак
Ограниченный рюкзак (англ. Bounded Knapsack Problem) - обобщение классической задачи, когда любой предмет может быть взят некоторое количество раз.
Пример: Вор грабит склад. Он может унести ограниченный вес, каждый товар на складе содержится в определенном ограниченном количестве. Нужно унести предметов на максимальную сумму.
Формулировка Задачи
Каждый предмет может быть выбран ограниченное
число раз. Задача выбрать число предметов каждого типа так, чтобы- максимизировать общую стоимость:
- выполнялось условие на совместность:
для всех
Варианты решения
При небольших
решается сведением к классической задаче о рюкзаке. В иных случаях:- Методом ветвей и границ.
- Методом динамического программирования.
Метод динамического программирования
Пусть
максимальная стоимость любого возможного числа предметов типов от 1 до , суммарным весом до .Заполним
нулями.Тогда меняя i от 1 до
, расчитаем на каждом шаге , для от 0 до , по рекурентной формуле:по всем целым из промежутка
Если не нужно востанавливать ответ, то можно использовать одномерный массив
вместо двумерного.После выполнения в
будет лежать максимальная стоимость предметов, помещающихся в рюкзак.Сложность алгоритма
.Реализация
for i = 0..W // база d[0][i] = 0; for i = 1..N for c = 0..W //Перебираем для каждого i, все вместисмости d[i][c] = d[i - 1][c]; for l = min(b[i], c / w[i]) .. 1 // ищем l для которого выполняется максимум d[i][c] = max(d[i][c], d[i - 1][c - l * w[i]] + p[i] * l);
Неограниченный рюкзак
Неограниченный рюкзак (англ.Unbounded Knapsack Proble) - обобщение ограниченого рюкзака, в котором любой предмет может быть выбран любое количество раз.
Пример: перекупщик закупается на оптовой базе. Он может увезти ограниченное количество товара, количество товара каждого типа на базе не ограниченно. Нужно увезти товара на максимальную сумму.
Формулировка Задачи
Каждый предмет может быть выбран любое число раз. Задача выбрать количество
предметов каждого типа так, чтобы- максимизировать общую стоимость:
- выполнялось условие на совместность:
целое, для всех
Варианты решения
Самые распространенные методы точного решения это:
- Метод ветвей и границ.
- Метод динамического программирования.
Метод динамического программирования
Пусть
максимальная стоимость любого количества вещей типов от 1 до , суммарным весом до включительно.Заполним
нулями.Тогда меняя i от 1 до
, расчитаем на каждом шаге , для от 0 до , по рекурентной формуле:
После выполнения в
будет лежать максимальная стоимость предметов, помещающихся в рюкзак.Если не нужно востанавливать ответ, то можно использовать одномерный массив
вместо двумерного, и использовать формулу:
Сложность алгоритма .
Непрерывный рюкзак
Непрерывный рюкзак (англ. Continuous knapsack problem) - вариант задачи, в котором возможно брать любою дробную часть от предмета, при этом удельная стоимость сохраняется.
Пример: Вор грабит мясника. Суммарно он может унести ограниченный вес товаров. Вор может резать товары без ущерба к удельной стоимости. Нужно унести товара на максимальную сумму.
Формулировка Задачи
Задача выбрать часть
каждого предмета так, чтобы- максимизировать общую стоимость:
- выполнялось условие на совместность:
дробное, для всех
Варианты решения
Возможность брать любую часть от предмета сильно упрощает задачу. Жадный алгоритм дает оптимальное решение в данном случае.
Реализация
sort(); // сортируем в порядке убывания удельной стоимости. for i = 1..N // идем по предметам if W >= w[i] //если помещается - берем summ += p[i]; W -= w[i]; else summ += W / w[i] * p[i];// иначе берем сколько можно и выходим break;
Задача о суммах подмножеств
Задача о суммах подмножеств (англ. Subset-sum problem, Value Independent Knapsack Problem) - задача из семейства, в которой стоимость предмета совпадает с его весом.
Пример: В машина может увезти определенное количество груза. Нужно увезти как можно больше крупного неделимого мусора за раз.
Формулировка Задачи
Нужно выбрать подмножество так, чтобы сумма ближе всего к
, но не превысила его. Более формально, нужно найти набор бинарных величин , так чтобы- максимизировать общую стоимость:
- выполнялось условие на совместность:
целое, для всех
Варианты решения
Для решения пригодны любые методы для классической задачи, однако специализированые алгоритмы, обычно более оптимальны по параметрам. Используется:
- Метод динамического программирования.
- Гибридный метод на основе динамического программирования и поиска по дереву.
Существуют алгоритмы основанные на этом методе со сложностью
и .Метод динамического программирования
Пусть
максимальная сумма , подмножества взятого из элементов.Заполним
нулями.Тогда меняя i от 1 до
, расчитаем на каждом шаге , для от 0 до , по рекурентной формуле:
После выполнения в
будет лежать максимальная сумма подмножества, не превышающая заданное значение.Сложность алгоритма
.Задача о размене
Задача о размене (англ. Change-Making problem) - имеются
не исчерпаемых типов предметов с весами . Нужно наполнить рюкзак предметами с суммарным весом .Часто задачу ставят как, дать сдачу наименьшим количеством монет.
Формулировка Задачи
Каждый предмет может быть выбран любое число раз. Задача выбрать количество
предметов каждого типа так, чтобы- минимизировать количество взятых предметов:
- сумма весов выбранных предметов равнялась вместимости рюкзака:
целое, для всех
Варианты решения
Самые распространенные методы точного решения это:
- Метод ветвей и границ.
- Метод динамического программирования.
Метод динамического программирования
Пусть
минимальное число премдетов, типов от 1 до , необходимое, чтобы заполнить рюкзак вместимостью .Пусть
, а для всех .Тогда меняя i от 1 до
, расчитаем на каждом шаге , для от 0 до , по рекурентной формуле:
После выполнения в
будет лежать максимальная стоимость предметов, помещающихся в рюкзак.Если не нужно востанавливать ответ, то можно использовать одномерный массив
вместо двумерного, и использовать формулу:
Сложность алгоритма
.Задача об упаковке
Задача об упаковке (англ. Bin Packing Problem) - имеются
рюкзаков вместимости и столько же предметов с весами . Нужно распределить все предметы, задействовав минимальное количество рюкзаков.Пример: нужно вывезти из шахты все куски руды, используя наименьшее количество вагонеток.
Формулировка Задачи
Математически задачу можно представить так:
- минимизировать количество рюкзаков:
- так чтобы выполнялось условие на совместность:
Варианты решения
Применение Динамического программирования нецелесообразно.
Мультипликативный рюкзак
Мультипликативный рюкзак (англ. Multiple Knapsack Problem) - есть
предметов и рюкзаков ( ). У каждого рюкзака своя вместимость . Задача: выбрать не пересекающихся множеств, назначить соответствие рюкзакам так, чтобы суммарная стоимость была максимальна, а вес предметов в каждом рюкзаке не превышал его вместимость.Пример: У транспортной компании есть парк машин разной грузоподъемности. Нужно перевезти товара на максимальную сумму с одного склада на другой единовременно.
Формулировка Задачи
Максимизировать
так, чтобы
выполнялось для всех .для всех
Варианты решения
Применение Динамического программирования, для задач данного типа нецелесообразно. Используются вариации метода ветвей и границ.
Задача о назначении
Задача о назначении (англ. Generalized Assignment Problem) - Наиболее общая задача семейства. Отличается от мультипликативного рюкзака тем, что каждый предмет имеет различные характеристики, в зависимости от рюкзака куда его помещают. Есть
предметов и рюкзаков ( ). У каждого рюкзака своя вместимость , у предмета стоимость и вес,при помещении его в рюкзак, равны и соответвенно. Задача: выбрать не пересекающихся множеств, назначить соответствие рюкзакам так, чтобы суммарная стоимость была максимальна, а вес предметов в каждом рюкзаке не превышал его вместимость. Весьма важная задача, так как она моделирует оптимальное распределение различных задач, между вычислительными блоками.Формулировка Задачи
Максимизировать стоимость выбранных предметов
,при выполнении условия совместности
.;
;
Варианты решения
Применение Динамического программирования нецелесообразно.
Литература
- Дистанционная подготовка по информатике
- Код для нескольких задач семейства на всевозможных языках
- David Pisinger Knapsack problems. — 1995
- Knapsack Problems: Algorithms and Computer Implementations. Silvano Martello, Paolo Toth.