DAA - Knapsack Pecahan

Algoritma Greedy dapat dipahami dengan sangat baik dengan masalah yang terkenal disebut sebagai masalah Knapsack. Meskipun masalah yang sama dapat dipecahkan dengan menggunakan pendekatan algoritmik lainnya, pendekatan Greedy memecahkan masalah Fractional Knapsack secara wajar dalam waktu yang tepat. Mari kita bahas masalah Knapsack secara detail.

Masalah Knapsack

Dengan mempertimbangkan satu set item, masing-masing dengan bobot dan nilai, tentukan subset item untuk dimasukkan ke dalam koleksi sehingga bobot totalnya kurang dari atau sama dengan batas yang diberikan dan nilai totalnya menjadi sebesar mungkin.

Masalah knapsack terletak pada masalah optimasi kombinatorial. Ini muncul sebagai subproblem dalam banyak model matematika yang lebih kompleks dari masalah dunia nyata. Salah satu pendekatan umum untuk masalah sulit adalah dengan mengidentifikasi kendala yang paling membatasi, mengabaikan yang lain, memecahkan masalah ransel, dan entah bagaimana menyesuaikan solusi untuk memenuhi kendala yang diabaikan.

Aplikasi

Dalam banyak kasus alokasi sumber daya bersama dengan beberapa kendala, masalah dapat diturunkan dengan cara yang mirip dengan masalah Knapsack. Berikut ini adalah sekumpulan contoh.

  • Menemukan cara paling tidak boros untuk memotong bahan mentah
  • pengoptimalan portofolio
  • Memotong masalah stok

Skenario Masalah

Seorang pencuri merampok sebuah toko dan dapat membawa barang seberat maksimal Wke ranselnya. Ada n item yang tersedia di toko dan beratith item adalah wi dan keuntungannya pi. Barang apa yang harus diambil pencuri?

Dalam konteks ini, barang-barang tersebut harus dipilih sedemikian rupa sehingga pencuri akan membawa barang-barang tersebut sehingga dia akan memperoleh keuntungan maksimal. Karenanya, tujuan pencuri adalah untuk memaksimalkan keuntungan.

Berdasarkan sifat itemnya, masalah Knapsack dikategorikan sebagai

  • Knapsack pecahan
  • Knapsack

Knapsack pecahan

Dalam hal ini, barang dapat dipecah menjadi potongan-potongan kecil, oleh karena itu pencuri dapat memilih pecahan barang.

Menurut pernyataan masalah,

  • Ada n item di toko

  • Berat ith item $ w_ {i}> 0 $

  • Untung untuk ith item $ p_ {i}> 0 $ dan

  • Kapasitas Knapsack adalah W

Dalam masalah Knapsack versi ini, item dapat dipecah menjadi potongan-potongan kecil. Jadi, pencuri hanya mengambil sebagian kecilxi dari ith barang.

$$ 0 \ leqslant x_ {i} \ leqslant 1 $$

Itu ith item memberikan kontribusi bobot $ x_ {i} .w_ {i} $ ke total bobot di ransel dan keuntungan $ x_ {i} .p_ {i} $ ke total keuntungan.

Oleh karena itu, tujuan dari algoritma ini adalah untuk

$$ maksimalkan \: \ displaystyle \ sum \ limit_ {n = 1} ^ n (x_ {i} .p _ {} i) $$

tunduk pada kendala,

$$ \ displaystyle \ jumlah \ batas_ {n = 1} ^ n (x_ {i} .w _ {} i) \ leqslant W $$

Jelas bahwa solusi optimal harus mengisi ransel dengan tepat, jika tidak, kita dapat menambahkan sebagian kecil dari salah satu item yang tersisa dan meningkatkan keuntungan secara keseluruhan.

Dengan demikian, solusi optimal dapat diperoleh

$$ \ displaystyle \ jumlah \ batas_ {n = 1} ^ n (x_ {i} .w _ {} i) = W $$

Dalam konteks ini, pertama-tama kita perlu mengurutkan item tersebut sesuai dengan nilai $ \ frac {p_ {i}} {w_ {i}} $, sehingga $ \ frac {p_ {i} +1} {w_ {i } +1} $ ≤ $ \ frac {p_ {i}} {w_ {i}} $. Sini,x adalah larik untuk menyimpan pecahan item.

Algorithm: Greedy-Fractional-Knapsack (w[1..n], p[1..n], W) 
for i = 1 to n 
   do x[i] = 0 
weight = 0 
for i = 1 to n 
   if weight + w[i] ≤ W then  
      x[i] = 1 
      weight = weight + w[i] 
   else 
      x[i] = (W - weight) / w[i] 
      weight = W 
      break 
return x

Analisis

Jika item yang disediakan sudah disortir menjadi urutan menurun $ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $, maka whileloop membutuhkan waktu O(n); Oleh karena itu, total waktu termasuk pengurutan masukO(n logn).

Contoh

Mari kita pertimbangkan kapasitas ransel itu W = 60 dan daftar item yang disediakan ditunjukkan pada tabel berikut -

Barang SEBUAH B C D
Keuntungan 280 100 120 120
Bobot 40 10 20 24
Rasio $ (\ frac {p_ {i}} {w_ {i}}) $ 7 10 6 5

Karena item yang disediakan tidak diurutkan berdasarkan $ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $. Setelah diurutkan, item-item tersebut akan ditampilkan pada tabel berikut.

Barang B SEBUAH C D
Keuntungan 100 280 120 120
Bobot 10 40 20 24
Rasio $ (\ frac {p_ {i}} {w_ {i}}) $ 10 7 6 5

Larutan

Setelah menyortir semua item menurut $ \ frac {p_ {i}} {w_ {i}} $. Pertama-tamaB dipilih sebagai bobot Bkurang dari kapasitas ransel. Selanjutnya, itemA dipilih, karena kapasitas ransel yang tersedia lebih besar daripada beratnya A. Sekarang,Cdipilih sebagai item berikutnya. Namun, seluruh barang tidak dapat dipilih karena sisa kapasitas ransel kurang dari beratnyaC.

Karenanya, fraksi C (yaitu (60 - 50) / 20) dipilih.

Sekarang, kapasitas Knapsack sama dengan item yang dipilih. Karenanya, tidak ada lagi item yang dapat dipilih.

Berat total item yang dipilih adalah 10 + 40 + 20 * (10/20) = 60

Dan total keuntungannya 100 + 280 + 120 * (10/20) = 380 + 60 = 440

Ini adalah solusi optimal. Kami tidak dapat memperoleh lebih banyak keuntungan dengan memilih kombinasi item yang berbeda.