整数のリストを使用して、特定の合計に最も近い解を見つけるためにどのアルゴリズムを使用するかは何ですか?

cs.stackexchange https://cs.stackexchange.com/questions/127658

質問

私の問題はこれです:

整形体の任意のリストがあるとしましょう[2013,54,3,32 1,23 ...]

私が与えられた数に等しいか最も近い値を持っているべきどちらの数字のどれが一緒に追加されるべきかを見つけるための最良の戦略は何ですか?

明らかに常にブルート力の方法がありますが、私はより最適化されたものがあるかどうかを知っていることに興味があります。

役に立ちましたか?

解決

荷物を車に梱包するときは、最初に最大のアイテムを入れてから、それらの周囲の小さいアイテムに合います。アナロジーによって、あなたの問題へのヒューリスティックなアプローチはあなたのセットのメンバーからあなたのターゲットよりも小さい間、できるだけ大きいものと始めることです。次に、現在の合計とターゲットの違いについてプロセスを繰り返します。これは貪欲アルゴリズム

セットが $ \ {2,3,5,8,13,21,34 \} $ の場合は、 $ 32 $ 、から始めてください。 $ 32 $より小さい値を追加 $ 8 $ を追加します(これは $ 32-21= 11 $ <です。 / Span>)を追加 $ 3 $

貪欲なアルゴリズムは迅速かつ簡単ですが、必ずしもあなたに最良の解決策を与えません。たとえば、セットが $ \ {1,5,23,26 \} $ の場合は $ 30 $ は、 $ 26 + 1= 27 $ を与えますが、最良の解決策は $ 23 + 5 + 1です。= 29 $

他のヒント

問題はNP完成ですが、特定の数の値の多項式で、非常に低い多項式の程度です。関与する数が大きい場合は難しいだけです。

最小から最大への並べ替え、数フィットがなくなるまで追加されないので、それはあまり賢くなくなるまで追加しており、希望の合計に近づくことはありません。最大から最小まで並べ替え、最初に最大の数字を追加するのはずっと良いです。

Sum CLOSE のアイテムがある場合は、これを改善しようとすることができます。たとえば、合計が117が小さすぎるが、未使用の項目が317である場合は、リストにアイテムXがある場合は、yはXより約200小さいリストに含まれていない項目Yを試してみましょう。 - Xに対してXをスワップし、サイズ317の項目を追加します。単純なアルゴリズムでさえも、優れた改善点を見つけるでしょう。

まったく異なる方法:希望の合計を非常に大きいS(多数の根のように)とします。それからあなたは約1,000,000を言って、すべての数字を掛け、1,000,000の合計でアイテムを見つけてから元のアイテムを選ぶことができます。 1,000,000に近い数の合計を試してください。

@YUVALのコメントのおかげで、私は私が探していたものであるナップザック問題につながった。

ウィキペディアでこのNP完全な問題に提案されている解決策の大部分はわかりませんでしたが、私は迅速だが完全に信頼できないアプローチを考えました:

利用可能な整数のリストを最小から最大に並べ替えて、目的の条件が満たされるまでそれらを追加し始めます。

整数セットの2人のメンバー間のすべての違いが多大な場合、このアプローチはおそらく最高の解決策を与えることになるでしょう。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top