DAA - Fractional Knapsack
Der Greedy-Algorithmus könnte mit einem bekannten Problem, das als Knapsack-Problem bezeichnet wird, sehr gut verstanden werden. Obwohl das gleiche Problem durch die Verwendung anderer algorithmischer Ansätze gelöst werden könnte, löst der Greedy-Ansatz das Fractional Knapsack-Problem in angemessener Zeit angemessen. Lassen Sie uns das Rucksackproblem im Detail diskutieren.
Rucksackproblem
Bestimmen Sie anhand einer Reihe von Elementen mit jeweils einem Gewicht und einem Wert eine Teilmenge von Elementen, die in eine Sammlung aufgenommen werden sollen, damit das Gesamtgewicht kleiner oder gleich einem bestimmten Grenzwert ist und der Gesamtwert so groß wie möglich ist.
Das Rucksackproblem liegt im kombinatorischen Optimierungsproblem. Es erscheint als Teilproblem in vielen, komplexeren mathematischen Modellen realer Probleme. Ein allgemeiner Ansatz für schwierige Probleme besteht darin, die restriktivste Einschränkung zu identifizieren, die anderen zu ignorieren, ein Rucksackproblem zu lösen und die Lösung irgendwie anzupassen, um die ignorierten Einschränkungen zu erfüllen.
Anwendungen
In vielen Fällen der Ressourcenzuweisung kann das Problem zusammen mit einigen Einschränkungen auf ähnliche Weise wie das Knapsack-Problem abgeleitet werden. Es folgt ein Beispiel.
- Den am wenigsten verschwenderischen Weg finden, um Rohstoffe zu schneiden
- Portfoliooptimierung
- Lagerprobleme schneiden
Problemszenario
Ein Dieb raubt ein Geschäft aus und kann ein maximales Gewicht von tragen Win seinen Rucksack. Es sind n Artikel im Geschäft verfügbar und das Gewicht vonith Artikel ist wi und sein Gewinn ist pi. Welche Gegenstände sollte der Dieb mitnehmen?
In diesem Zusammenhang sollten die Gegenstände so ausgewählt werden, dass der Dieb die Gegenstände trägt, für die er maximalen Gewinn erzielt. Daher ist das Ziel des Diebes, den Gewinn zu maximieren.
Aufgrund der Art der Artikel werden Rucksackprobleme als kategorisiert
- Fractional Knapsack
- Knapsack
Fractional Knapsack
In diesem Fall können Gegenstände in kleinere Teile zerlegt werden, daher kann der Dieb Bruchteile von Gegenständen auswählen.
Nach der Problemstellung,
Es gibt n Artikel im Laden
Gewicht von ith item $ w_ {i}> 0 $
Gewinn für ith item $ p_ {i}> 0 $ und
Kapazität des Rucksacks ist W
In dieser Version des Rucksackproblems können Gegenstände in kleinere Teile zerlegt werden. Der Dieb kann also nur einen Bruchteil nehmenxi von ith Artikel.
$$ 0 \ leqslant x_ {i} \ leqslant 1 $$
Das ith Artikel trägt das Gewicht $ x_ {i} .w_ {i} $ zum Gesamtgewicht im Rucksack und Gewinn $ x_ {i} .p_ {i} $ zum Gesamtgewinn bei.
Daher ist das Ziel dieses Algorithmus zu
$$ maximiere \: \ displaystyle \ sum \ limit_ {n = 1} ^ n (x_ {i} .p _ {} i) $$
vorbehaltlich Einschränkungen,
$$ \ displaystyle \ sum \ limit_ {n = 1} ^ n (x_ {i} .w _ {} i) \ leqslant W $$
Es ist klar, dass eine optimale Lösung den Rucksack genau füllen muss, sonst könnten wir einen Bruchteil eines der verbleibenden Gegenstände hinzufügen und den Gesamtgewinn steigern.
Somit kann eine optimale Lösung erhalten werden durch
$$ \ displaystyle \ sum \ limit_ {n = 1} ^ n (x_ {i} .w _ {} i) = W $$
In diesem Zusammenhang müssen wir zuerst diese Elemente nach dem Wert von $ \ frac {p_ {i}} {w_ {i}} $ sortieren, so dass $ \ frac {p_ {i} +1} {w_ {i } +1} $ ≤ $ \ frac {p_ {i}} {w_ {i}} $. Hier,x ist ein Array zum Speichern des Bruchteils von Elementen.
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
Analyse
Wenn die bereitgestellten Elemente bereits in absteigender Reihenfolge von $ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $ sortiert sind, benötigt der Whileloop eine Weile O(n);; Daher ist die Gesamtzeit einschließlich der Sortierung inO(n logn).
Beispiel
Betrachten wir die Kapazität des Rucksacks W = 60 und die Liste der bereitgestellten Elemente werden in der folgenden Tabelle angezeigt -
Artikel | EIN | B. | C. | D. |
---|---|---|---|---|
Profitieren | 280 | 100 | 120 | 120 |
Gewicht | 40 | 10 | 20 | 24 |
Verhältnis $ (\ frac {p_ {i}} {w_ {i}}) $ | 7 | 10 | 6 | 5 |
Da die bereitgestellten Elemente nicht nach $ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $ sortiert sind. Nach dem Sortieren sind die Elemente wie in der folgenden Tabelle gezeigt.
Artikel | B. | EIN | C. | D. |
---|---|---|---|---|
Profitieren | 100 | 280 | 120 | 120 |
Gewicht | 10 | 40 | 20 | 24 |
Verhältnis $ (\ frac {p_ {i}} {w_ {i}}) $ | 10 | 7 | 6 | 5 |
Lösung
Nach dem Sortieren aller Elemente nach $ \ frac {p_ {i}} {w_ {i}} $. Zuerst alles vonB wird als Gewicht von gewählt Bist geringer als die Kapazität des Rucksacks. Nächstes ObjektA wird gewählt, da die verfügbare Kapazität des Rucksacks größer ist als das Gewicht von A. Jetzt,Cwird als nächster Punkt ausgewählt. Der gesamte Artikel kann jedoch nicht ausgewählt werden, da die verbleibende Kapazität des Rucksacks geringer ist als das Gewicht vonC.
Daher Bruchteil von C (dh (60 - 50) / 20) wird gewählt.
Jetzt entspricht die Kapazität des Rucksacks den ausgewählten Gegenständen. Daher kann kein Element mehr ausgewählt werden.
Das Gesamtgewicht der ausgewählten Artikel beträgt 10 + 40 + 20 * (10/20) = 60
Und der Gesamtgewinn ist 100 + 280 + 120 * (10/20) = 380 + 60 = 440
Dies ist die optimale Lösung. Wir können nicht mehr Gewinn erzielen, wenn wir eine andere Kombination von Gegenständen auswählen.