Welchen Algorithmus sollte ich dazu verwenden, die nächstgelegene Lösung einer bestimmten Summe mit einer Liste der Ganzzahlen zu finden?

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

Frage

Mein Problem ist das:

sagen wir, ich habe eine willkürliche Liste der Ganzzahlen A [2013, 54, 3, 32 1, 23 ...]

Was ist die beste Strategie, um zu finden, welche dieser Zahlen ich zusammenbringen sollte, um eine Summe gleich oder am nächsten zu einer bestimmten Anzahl zu haben?

Natürlich gibt es immer die Brute Force-Methode, aber ich bin daran interessiert, zu wissen, ob es ein optimierteres ist.

War es hilfreich?

Lösung

Wenn Sie Gepäck in ein Auto verpacken, setzen Sie zunächst die größten Elemente und passen dann die kleineren Gegenstände um sie herum. Analogie ist ein heuristischer Ansatz Ihres Problems, mit dem Mitglied Ihres Sets zu beginnen, der so groß wie möglich ist und noch kleiner als Ihr Ziel ist. Wiederholen Sie dann den Prozess für den Unterschied zwischen Ihnen der aktuellen Summe und Ihrem Ziel und so weiter. Dies ist als gieriger Algorithmus .

Beispielsweise, wenn Ihr Set $ \ {2,3,58,13,21, 34 \} $ ist, und Ihr Ziel ist $ 32 $ , starten Sie mit $ 21 $ (der größte Wert weniger als $ 32 $ ), dann fügen Sie dann $ 8 $ (da dies der große Wert weniger ist, der weniger als $ 32-21= 11 $ ), und dann $ 3 $ hinzufügen.

Ein gieriger Algorithmus ist schnell und einfach, gibt Ihnen jedoch nicht immer die beste Lösung. Wenn beispielsweise Ihr Set $ \ {1, 5, 23, 26 \} $ ist, ist das Ziel $ 30 $ Dann gibt der gierige Algorithmus $ 26 + 1= 27 $ , während die beste Lösung ist $ 23 + 5 + 1= 29 $ .

Andere Tipps

Das Problem ist NP-komplett, aber Polynom im Wert der angegebenen Anzahl mit einem recht niedrigen Polynom-Grad. Es ist nur schwierig, wenn die beteiligten Zahlen groß sind.

Sortierung von kleinsten bis zum größten und Hinzufügen, bis keine Zahlen passt, ist nicht sehr klug, da es wahrscheinlich eine ziemlich große Zahl ist, die nicht passt, und Sie werden nicht in der Nähe der gewünschten Summe kommen. Viel besser, um von größten bis kleinsten zu sortieren und zuerst die größten Zahlen hinzuzufügen.

Jetzt, wenn Sie Artikel mit einer Summe close in S haben, können Sie versuchen, dies zu verbessern. Wenn Sie beispielsweise Ihre Summe bis 117 zu klein sind, aber der kleinste nicht verwendete Element ist, aber Sie würden versuchen, wenn Sie einen Artikel X in Ihrer Liste haben, und ein Artikel y nicht in der Liste, wobei y ca. 200 kleiner als x ist - Swap x gegen y, fügen Sie den Punkt der Größe 317 hinzu. Sogar ein einfacher Algorithmus findet Sie wahrscheinlich gute Verbesserungen.

Eine völlig andere Methode: Lassen Sie die gewünschte Summe s mit sehr großen S (wie viele Billionen) sein. Dann können Sie ein S 'Rund 1.000.000 wählen, alle von (s' / s) beteiligten Nummern multiplizieren, Elemente mit einer Summe in der Nähe von 1.000.000 suchen und dann die Originalelemente aussuchen. Versuchen Sie es für ein paar Summen, die nahe bei 1.000.000 liegen.

Dank @yuvals Kommentar wurde ich zum Rucksackproblem geführt, was genau das ist, wonach ich gesucht habe.

Obwohl ich nicht viel von den in diesem NP-vollständigen Problem in Wikipedia vorgeschlagen hatte, dachte ich an einen schnellen, aber völlig unzuverlässigen Ansatz:

Sortieren Sie einfach die Liste der verfügbaren Ganzzahlen von kleinsten bis zum größten und fangen Sie an, bis der gewünschte Bedingung erfüllt ist.

Ich denke, wenn alle Unterschiede zwischen zwei Mitgliedern des Ganzzahlsatzes nicht viel variieren, dann wird dieser Ansatz wahrscheinlich die beste und einzige Lösung geben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top