最適なナップザック解の要素の決定
NP ハード ビン パッキング問題の解であるナップザック アルゴリズムは、最適なナップサック アルゴリズムを計算します。限られた容量のアイテムのセットから得られる価値。ただし、ユーザーは、どの特定の項目がこの最適なソリューションに寄与するのか疑問に思うことがよくあります。
この問題に対処するには、最適化プロセス中に選択された要素を追跡するようにナップザック アルゴリズムを変更できます。これにより、ソリューションの値だけに依存するのではなく、最適なソリューションを構成する項目を特定する直接的な方法が提供されます。
アプローチ:
擬似コード:
int Knapsack::knapsack(std::vector<Item>& items, int W) { size_t n = items.size(); std::vector<std::vector<int>> dp(W + 1, std::vector<int>(n + 1, 0)); std::vector<std::vector<int>> selected(W + 1, std::vector<int>(n + 1, 0)); for (size_t j = 1; j <= n; j++) { for (int w = 1; w <= W; w++) { if (items[j-1].getWeight() <= w) { dp[w][j] = std::max(dp[w][j-1], dp[w - items[j-1].getWeight()][j-1] + items[j-1].getWeight()); selected[w][j] = (dp[w][j] != dp[w][j-1]); } else { dp[w][j] = dp[w][j - 1]; } } } // Identify selected items std::vector<int> takenItems; int line = W; int i = n; while (i > 0) { if (selected[line][i]) { takenItems.push_back(items[i-1].getIndex()); // Index of item taken line -= items[i-1].getWeight(); } i--; } return dp[W][n]; }
この強化されたナップザック アルゴリズムにより、最適な値だけでなく、その最適なソリューションに寄与する特定の要素も含まれます。
以上が最適なナップザック ソリューションに含まれる特定のアイテムを特定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。