Anzeige
Archiv - Navigation
1676to1680
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Teilsummenproblem

Teilsummenproblem
26.02.2019 13:42:11
Sven
Hallo zusammen,
ich bin auf der Suche nach einer Excel-Lösung des Teilsummenproblems:
In Spalte A meines Tabellenblattes habe ich 100 (oder auch mal mehr) Buchungsbeträge (zwischen 0,1 und 100 EUR). Jetzt möchte ich alle infrage kommenden Kombinationen ausgegeben haben, die sich zum Zielbetrag (steht in B1) zusammensetzen lassen. Wie würdet Ihr das angehen?
Die Krönung wäre, wenn ich noch die maximale und minimale Anzahl an Summanden und eine Toleranz zum Zielwert (+- 5% bspw.) angeben könnte.
Schöne Grüße
Sven

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ohne Solver
26.02.2019 15:03:13
Sven
Moin Werner,
danke für den Vorschlag. Das wäre eine Möglichkeit. Allerdings findet der Solver immer nur eine - und auch bei mehreren Anwendungen immer die gleiche - Lösung. Ich hätte gerne alle Möglichkeiten. Lässt sich das durch den Solver Lösen?
Unabhängig davon wäre eine eigene VBA-Lösung natürlich super. Hat da noch jemand eine Idee?
AW: ohne Solver
27.02.2019 08:49:08
EtoPHG
Hallo Sven,
Hast du schon mal ausgerechnet wieviele Kombinationen es mit n Summanden zu k möglichen Summen gibt?
Du wirst schnell feststellen, dass das riesige Zahlen ergbit. In der Archivrecherche gibt es x Beiträge zu diesem Thema!
Gruess Hansueli
Anzeige
AW: ohne Solver
27.02.2019 14:16:13
Sven
Hallo Hansueli,
ja, klar. Der Solver kommt aber mit der ANzahl ganz gut zurecht und ich dachte, vielleicht kann man ihn ja zur Darstellung aller gefundenen Lösungen zwingen.
AW: ohne Solver
27.02.2019 09:46:00
PeterK
Hallo
Anbei ein kleines Beispiel für eine rekursive VBA Lösung. Die Procedure bricht nach 10.000.000 Durchläufen (ca. 1 Minute) ab. Wie in einem anderen Beitrag bereits erwähnt "explotieren" die Anzahl der Durchläufe mit der Anzahl der Beträge (realistisch: max 20-25). Oder ein anderer möglicher Weg: zuerst aufsteigend sortieren, dadurch ein Ergebnis mit den "kleinen" Beträgen, danach absteigend sortieren, dadurch ein mögliches Ergebnis mit den großen Beträegen. Wenn Du die Anzahl der Durchläufe zu hoch einstellst, kann Excel komplett blockieren, daher bevor Du mit diversen Tests beginnst, immmer speichern und schliess alle anderen Excel Workbooks (damit kannst Du Notfalls Excel über den Taskmangaer "abschiessen")
https://www.herber.de/bbs/user/127964.xlsm
Anzeige
AW: ohne Solver
27.02.2019 14:14:59
Sven
Danke!
AW: Teilsummenproblem
27.02.2019 16:09:19
Sven
Hallo Leute,
über die Suche dieses Forums habe ich diesen Beitrag gefunden:
https://www.herber.de/forum/archiv/1028to1032/1031475_Welche_Kombinationen_ergeben_Summe.html
Den Code finde ich super, er funktioniert. Aber: Ich verstehe ihn nicht ganz. Leider verstehe ich das Forum hier zu wenig, um eine Möglichkeit des Antwortens auf Erich G.s Beitrag zu verfassen.
Kann mir jemand von Euch sagen, wie die Boolean-Werte (pro Summand im Array) und zusätzlich "umsch" funktionieren?
Ich habe den Code schon ordentlich reduziert und ihn um "Schönheiten", wie die Zeitberechnungen etc. bereinigt, aber dennoch blicke ich das Konzept nicht ganz.
Option Explicit
Sub Summanden_ermitteln()
Dim intAnzSummanden As Integer
Dim i As Long
Dim j As Long
Dim k As Long
Dim Atst As Double
Dim Amax As Double
Dim dblZielsumme As Double
Dim erg As String
Dim umsch As Boolean
Dim arrB() As Boolean
intAnzSummanden = Cells(Rows.Count, 1).End(xlUp).Row - 1
dblZielsumme = Cells(1, 5)
ReDim arrB(1 To intAnzSummanden)
k = 1
Columns("G:H").ClearContents
Cells(1, 7) = "Treffer"
Cells(1, 8) = Time
Debug.Print "Durchgänge: " & 2 ^ intAnzSummanden - 1
For i = 1 To 2 ^ intAnzSummanden - 1
Atst = 0
erg = ""
umsch = True                                'Schalter für An/Aus-Wechsel
For j = intAnzSummanden To 1 Step -1
If umsch Then                           'bis ein Element "Aus" war
'(Schalter auf False ist)
arrB(j) = Not arrB(j)               '"An/Aus" umschalten
If arrB(j) Then umsch = False       'wenn "An"geschaltet, aufhören
End If
Atst = Atst - arrB(j) * Cells(j + 1, 1) 'addieren Spalte A, Zeilen mit "An"
If Atst > dblZielsumme Then Exit For
erg = IIf(arrB(j), "1", "0") & erg      'Einsen ("An") und Nullen ("Aus") verketten
Next j
If Atst = Amax Then
If Atst > Amax Then Amax = Atst
Cells(3, 5) = erg
If Amax = dblZielsumme Then
k = k + 1
DoEvents
Cells(k, 7) = erg
Cells(k, 8) = Time
End If
End If
Next i
Cells(3, 5).Select
End Sub

Grüße
Sven
Anzeige
AW: Teilsummenproblem
28.02.2019 09:00:42
PeterK
Hallo Sven
Der Code macht mehr oder minder das Selbe wie meine rekursive Prrocedure. Ich hab ihn mir nicht im Detail angesehen, aber auch diese Variante hat ein exponentielles Zeitverhalten, d.h. mit jeder Erhöhung der Anzahl der Beträge verdoppelt sich die Verarbeeitungszeit. In meinem Beispiel stoppe ich nach 10.000.000 Durchläufen was ca. 24 Beträgen entspricht (runnd 16 Mio Durchläufe wären erforderlich). Die Dauer hierfür war rund 1 Minute. Erhöhst Du jetzt die Anzaahl der Beträge auf 25 so verdoppelt sich die Zeit (=2 Minuten), bei 26 sind es 4 Minuuten, bei 27 sind es 8 Minuten, ..., bei 30 sind es bereits 64 Minuten! Für einen Durchlauf über 100 Beiträge ist Dein irdisches Leben zu kurz ;-)
Anzeige
AW: Teilsummenproblem
28.02.2019 09:36:31
Sven
Moin Peter,
klar, das war auch nicht für meine 100 Beträge gedacht. Es war nur ein Fundstück im Rahmen meiner Recherche, dass ich interessant finde aber nicht ganz verstehe. Mir ging es nur um den Algorithmus.
Grüße

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige