#algorithm #dynamic-programming #knapsack-problem
#алгоритм #динамическое программирование #проблема с рюкзаком
Вопрос:
Я думал,
Я хотел сделать вариацию проблемы с рюкзаком.
Представьте исходную проблему с элементами с различными весами / значениями.
Моя версия, наряду с обычными весами / значениями, будет содержать значение «group».
например. Элемент1 [5 кг, 600 долларов США, электронный] Элемент2 [1 кг, 50 долларов США, еда]
Теперь, имея набор таких элементов, как этот, как бы я закодировал проблему с рюкзаком, чтобы убедиться, что выбрано не более 1 элемента из каждой «группы».
Примечания:
- Вам не нужно выбирать элемент из этой группы
- В каждой группе есть несколько элементов
- Вы по-прежнему минимизируете вес, максимизируя ценность
- Количество групп предопределено вместе с их значениями.
На данном этапе я просто пишу черновик кода, и я решил использовать динамический подход. Я понимаю идею динамического решения обычной проблемы с рюкзаком, как мне изменить это решение, чтобы включить эти «группы»?
KnapSackVariation(v,w,g,n,W)
{
for (w = 0 to W)
V[0,w] = 0;
for(i = 1 to n)
for(w = 0 to W)
if(w[i] <= w)
V[i,w] = max{V[i-1, w], v[i] V[i-1, w-w[i]]};
else
V[i,w] = V[i-1, w];
return V[n,W];
}
Это то, что у меня есть до сих пор, нужно добавить его так, чтобы он удалял все соответствующие элементы из группы, в которой он находится, каждый раз, когда он решает это.
Комментарии:
1. Добавьте элемент группы в состояние!
2. Как насчет ее решения как задачи комбинаторной оптимизации? Для каждого элемента вы выбираете либо элемент, либо нет элемента. Возможно, вы захотите использовать поиск по ветвям и границам для ее решения.
Ответ №1:
просто заметил, что ваш вопрос пытается найти ответ на мой собственный вопрос. Проблема, которую вы изложили, является хорошо известной и хорошо изученной проблемой, называемой проблемой рюкзака с множественным выбором. Если вы погуглите, вы найдете всевозможную информацию, и я также могу порекомендовать эту книгу: http://www.amazon.co.uk/Knapsack-Problems-Hans-Kellerer/dp/3642073115/ref=sr_1_1?ie=UTF8amp;qid=1318767496amp;sr=8-1 , который посвящает этой проблеме целую главу. В классической формулировке MCKP вы должны выбрать один элемент из каждой группы. Однако вы можете легко преобразовать эту версию задачи в свою версию, добавив фиктивный элемент в каждую группу с profit и weight = 0, и будут работать те же алгоритмы. Я бы предостерег вас от попыток адаптировать код для двоичной задачи о рюкзаке к MCKP с помощью нескольких настроек — этот подход, вероятно, приведет вас к решению, производительность которого неприемлемо снижается по мере увеличения количества элементов в каждой группе.
Ответ №2:
Предположим
, что c [i]: категория i-го элемента
V [i, w, S]: максимальное значение рюкзака, такое, что он содержит максимум один элемент из каждой категории в S
Recursive Formulation
V[i,w,S] = max(V[i-1,w,S],V[i,w-w[i],S-{c[i]}] v[i])
Base Case
V[0,w,S] = -`infinity if w!=0 or S != {}`