knapsack problem

Üdvözlöm, Ön a knapsack problem szó jelentését keresi. A DICTIOUS-ban nem csak a knapsack problem szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a knapsack problem szót egyes és többes számban mondani. Minden, amit a knapsack problem szóról tudni kell, itt található. A knapsack problem szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Aknapsack problem és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

knapsack problem (tsz. knapsack problems)

  1. (informatika) hátizsák-probléma

A hátizsák probléma (angolul Knapsack Problem) egy klasszikus kombinatorikus optimalizálási probléma, amely gyakran előfordul az informatikában, műveletek kutatásában, gazdaságban és más alkalmazott tudományokban. A probléma lényege, hogy adott egy hátizsák, amelynek adott a teherbírása (kapacitása), és több különböző tárgy, amelyeknek van súlya és értéke. A cél az, hogy a tárgyak egy részét úgy válasszuk ki, hogy a hátizsák kapacitását ne lépjük túl, és az összérték maximális legyen.



2. Probléma megfogalmazása (formális definíció)

Legyen:

  • : a tárgyak száma.
  • : az -edik tárgy súlya.
  • : az -edik tárgy értéke.
  • : a hátizsák kapacitása (összsúly, amit elbír).
  • : döntésváltozó, amely 1, ha az -edik tárgyat kiválasztjuk, 0, ha nem.

Célfüggvény:

Korlátozás:

Ez az ún. 0-1 hátizsák probléma, mivel minden tárgyból csak egy példány választható (nem darabolható).



3. Variánsok

A hátizsák problémának több változata is ismert:

  • 0-1 hátizsák probléma: minden tárgy vagy teljes egészében bekerül, vagy nem.
  • Többszörös hátizsák probléma: több hátizsák áll rendelkezésre.
  • Több példányos (unbounded) hátizsák probléma: egyes tárgyakból több is választható.
  • Frakcionált hátizsák probléma (fractional knapsack): a tárgyak darabolhatók (pl. ömlesztett áru).
  • Multidimenzionális hátizsák: többféle korlát (pl. térfogat és súly).



4. Példa

Tegyük fel, hogy van egy 10 kg kapacitású hátizsákod, és az alábbi tárgyak közül választhatsz:

Tárgy Súly (kg) Érték (Ft)
A 2 3000
B 3 3500
C 5 8000
D 4 4500

A cél: olyan kombinációt találni, amely nem haladja meg a 10 kg-ot, és az összérték maximális.



5. Megoldási módszerek

5.1. Brute-force (kimerítő keresés)

Az összes kombinációt kipróbáljuk. Ez kis -re működik, de nagy számú tárgy esetén exponenciális idejű és gyakorlatilag használhatatlan.

5.2. Dinamikus programozás

Hatékony módszer 0-1 hátizsák problémára. Egy kétdimenziós táblát használunk: jelenti a maximális értéket az első tárgyból választva, ha a hátizsák kapacitása .

Rekurzió:

Időkomplexitás:

5.3. Greedy algoritmus (frakcionált probléma)

Frakcionált esetben (amikor a tárgyak darabolhatók), a válogató módszer (greedy) a legjobb.

Lépések:

  1. Rendezés csökkenő szerint.
  2. Legnagyobb arányút vesszük először, amíg van hely.
  3. Ha egy tárgy már nem fér el, csak egy részét vesszük be.

Ez a módszer optimális frakcionált esetben, de nem működik 0-1 esetben!

5.4. Branch and Bound

A döntési fa mentén végigjárjuk a lehetőségeket, de visszalépünk (cut), ha már nem lehet jobb eredményt elérni. Ez okos keresés kimerítő próbálkozás helyett.

5.5. Heurisztikus / metaheurisztikus módszerek

Nagy méretű problémákhoz:

  • Genetikus algoritmus
  • Szimulált lehűlés (simulated annealing)
  • Tabu keresés
  • Méhraj optimalizálás (swarm intelligence)

Ezek nem garantálnak optimális megoldást, de nagy problémákra jó közelítő megoldást adnak gyorsan.



6. C++-os példa (dinamikus programozással)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int knapsack(int C, vector<int>& weights, vector<int>& values, int n) {
    vector<vector<int>> dp(n+1, vector<int>(C+1, 0));
    for (int i = 1; i <= n; ++i) {
        for (int w = 0; w <= C; ++w) {
            if (weights > w)
                dp = dp;
            else
                dp = max(dp, dp] + values);
        }
    }
    return dp;
}

int main() {
    vector<int> weights = {2, 3, 5, 4};
    vector<int> values = {3000, 3500, 8000, 4500};
    int capacity = 10;
    int n = weights.size();

    cout << "Max érték: " << knapsack(capacity, weights, values, n) << " Ft" << endl;
}

7. Alkalmazási területek

  • Erőforrás-allokáció: pl. idő, pénz, memória optimalizálása.
  • Tőzsdei döntések: korlátozott tőkéből a legértékesebb befektetések kiválasztása.
  • Tartalomválogatás: pl. hírportálokon, korlátozott helyen a legjobb cikkek megjelenítése.
  • Adatkompresszió: bizonyos algoritmusok belső mechanizmusa is kapcsolódik a hátizsák elvhez.



8. Összefoglalás

A hátizsák probléma egy NP-teljes probléma, azaz nincs ismert polinomiális idejű algoritmus, amely minden esetben garantáltan megoldja. Ugyanakkor kis méretű példákra dinamikus programozás, míg nagyobb esetekben metaheurisztikus módszerek alkalmazhatók. A probléma nemcsak elméletileg izgalmas, hanem rendkívül gyakorlati jelentőséggel is bír.