Ich habe das Problem bei der Arbeit an meinem Multiknapsack Solver festgestellt. Das Programm funktioniert gut auf einem Rucksack, aber wenn es um mehrere Knaps geht, gibt es einige Probleme.Multiknapsack-Algorithmus - außerhalb der Sammlung beim Versuch, Objekt zu entfernen
Problem: Die Artikel werden nicht aus der Sammlung entfernt. Ich weiß, dass ich brauche, dies zu tun, weil für den zweiten Tornister seiner wieder durch die gleichen Objekte laufen - so die maximierte val ist die gleiche ...
private void Knapsack()
{
List<Plecak> descendingKanps = _plecakList.OrderByDescending(o => o.W).ToList(); // List of configured Kanpsacks in descending order
List<Produkt> descendingProducts = _produktList.OrderByDescending(o => o.cena).ToList(); // List of products to pack in descending order
int N = descendingProducts.Count; //number of items in product list
double maxVal = 0; // accumulated value of one knapsack
foreach (Plecak p in descendingKanps) // for every knapsack...
{
double[,] V = new double[N + 1, (int)p.W + 1]; //array that stores best option (the value of item)
for (int c = 0; c <= p.W; c++) //since its a 0-1 MKP problem so initialize whole array with zeroes
{
V[0, c] = 0;
}
for (int r = 0; r <= N; r++)
{
V[r, 0] = 0;
}
for (int i = 1; i <= N; i++) // constraint of items count
{
for (int wt = 1; wt <= p.W; wt++) //the constraint of weight
{
if (descendingProducts[i - 1].waga < wt + 1) // if weight of the product is less than constraint, so it can be added...
V[i, wt] = Math.Max(descendingProducts[i - 1].cena + V[i - 1, wt - descendingProducts[i - 1].waga], V[i - 1, wt]); // find best solution and add the value to the Value array, comapre the value with the value form previous row
else
V[i, wt] = V[i - 1, wt]; // keep 0, or last best solution
maxVal = V[i, wt]; // assign to variable
}
}
summary.Items.Add("maximum val for knapsack: " + p.nazwa + " is: " + maxVal); // print out the value of knapsack
}
}
Ich wäre nett, den Zweck des Codes zu kennen. Können Sie Kommentare einfügen, die erklären, was alles tut? Wie setze ich die Werte der obersten Zeile und der ersten Spalte im Array 'V' auf 0 (am Anfang der foreach-Schleife)? Was mich am meisten verwirrt, sind die drei For-Loops in der unteren Hälfte. – MasterXD
Kommentare hinzugefügt :) – BFTA
Es tut mir leid, aber ich verstehe immer noch nicht den Code. Ich kann die Logik nicht verstehen. Wie soll ich das verstehen? – MasterXD