ホームページ > バックエンド開発 > C++ > 最適なナップザック ソリューションに含まれる特定のアイテムを特定するにはどうすればよいでしょうか?

最適なナップザック ソリューションに含まれる特定のアイテムを特定するにはどうすればよいでしょうか?

Barbara Streisand
リリース: 2024-12-02 06:52:11
オリジナル
708 人が閲覧しました

How Can We Identify the Specific Items Included in an Optimal Knapsack Solution?

最適なナップザック解の要素の決定

NP ハード ビン パッキング問題の解であるナップザック アルゴリズムは、最適なナップサック アルゴリズムを計算します。限られた容量のアイテムのセットから得られる価値。ただし、ユーザーは、どの特定の項目がこの最適なソリューションに寄与するのか疑問に思うことがよくあります。

この問題に対処するには、最適化プロセス中に選択された要素を追跡するようにナップザック アルゴリズムを変更できます。これにより、ソリューションの値だけに依存するのではなく、最適なソリューションを構成する項目を特定する直接的な方法が提供されます。

アプローチ:

  1. 追加の行列が選択されています。ここで、selected[w][j] は、インデックス j-1 の要素が容量で選択されたかどうかを示しますw.
  2. 選択された行列を 0 に初期化します。
  3. ナップザック アルゴリズム中、dp[w][j] を更新するときに、items[ の場合は selected[w][j] も 1 に設定します。 j-1] が選択されます (dp[w][j] = dp[w - items[j-1].getWeight()][j-1] items[j-1].getWeight()) を使用して、この要素が選択されていることを示します。
  4. 最適な値を決定した後、選択された行列をトレースして、選択された特定の項目を識別します。

擬似コード:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート