folgendes Problem: Habe 200 Werte und möchte diese gerne auf 4er Gruppen aufteilen. Dabei soll die Summe jeder Gruppe ungefähr gleich sein - Wenn möglich die optimale Lösung... Wobei jede Gruppe muss 4 Werte enthalten! Hat jemand eine Ahnung wie ich das machen kann? (ich möchte natürlich immer die 4 Zahlen wissen, die er zusammenfügt...)
Verlinkst du bitte deine Beiträge in unterschiedlichen Foren untereinander? Schließlich gibt es im Nachbarforum schon eine Antwort. Und die meisten Helfer mögen kein Crossposting ohne Querverweis.
Beste Grüße Günther
Excel-ist-sexy.de …schau doch mal rein! Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
folgendes Problem: Habe 200 Werte und möchte diese gerne auf 4er Gruppen aufteilen. Dabei soll die Summe jeder Gruppe ungefähr gleich sein - Wenn möglich die optimale Lösung... Wobei jede Gruppe muss 4 Werte enthalten! Hat jemand eine Ahnung wie ich das machen kann? (ich möchte natürlich immer die 4 Zahlen wissen, die er zusammenfügt...) http://www.office-fragen.de/index.php/to...975.0.html habe auch schon in einem anderen Forum um eine Lösung ersucht, aber bis jetzt keine gefunden....
Hier ein halb-manueller Ansatz, der vermutlich nicht das Optimum liefert, aber einige Schritte dahin.
Der Makro muss von Hand wiederholt ausgeführt werden, bis es in Spalte L keine Verbesserung mehr gibt.
Code:
Sub iStart() With Range("A1:D50") .Formula = "=int(rand()*1000)" .Value = .Value End With Range("F1:F50").Formula = "=sum(RC[-5]:RC[-2])" Range("H1") = "min" Range("H2") = "max" Range("I1").Formula = "=min(F1:F50)" Range("I2").Formula = "=max(F1:F50)" Range("J1").Formula = "=match(I1,F1:F50,0)" Range("J2").Formula = "=match(I2,F1:F50,0)" End Sub
Sub iFen() Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction Dim RMin As Range Dim RMax As Range lr = Cells(Rows.Count, "L").End(xlUp).Row + 1 Cells(lr, "L") = Cells(2, "I") - Cells(1, "I") Mn = Range("J1") Mx = Range("J2") Set RMin = Range(Cells(Mn, 1), Cells(Mn, 4)) Set RMax = Range(Cells(Mx, 1), Cells(Mx, 4)) Mi = WSF.Min(RMin) Ma = WSF.Max(RMax) Cl = WSF.Match(Mi, RMin, 0) Ch = WSF.Match(Ma, RMax, 0)
also habe das versucht und es klappt nicht wirklich - siehe Anhang... es müsste die erste Gruppe eigentlich: 272,1,1,1 sein und dann weiter... klappt leider nicht, aber danke für den Versuch!
(02.11.2017, 15:01)Fennek schrieb: mit der Formel von Lupo kam ich nicht zurecht.
Vermutlich, weil Du die Einschränkungen nicht gelesen hast. Mit einer Zahlenreihe 1 bis 200 klappt es punktgenau; die Summe ist immer (50 Mal) 402. Je mehr man von so einer Gleichverteilung der Zahlen wegkommt, desto dringender werden andere Lösungen.
noch ein Versuch (hoffentlich nicht zu nahe an Lupos Vorschlag)
Code:
Sub Start2() With Range("A1:A200") .Formula = "=int(rand()*1000)+1" .Value = .Value .Offset(, 10).Formula = "=sum(rc[-5]:rc[-2])" End With End Sub
Sub iFen2() Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction Dim RMin As Range Dim RMax As Range Dim r As Range Set r = Range("A1:A200") For i = 1 To 100 Step 2 Z = Z + 1 Cells(Z, 6) = WSF.Large(r, i) Cells(Z, 7) = WSF.Large(r, i + 1) Cells(Z, 8) = WSF.Small(r, i) Cells(Z, 9) = WSF.Small(r, i + 1) Next i Debug.Print Mi, Mir End Sub
Der Code erzeugt Paare, die sehr nahe am Sollwert sind, die Kombination zweier dieser Paare sollte der optimalen Lösung nahe kommen.
Code:
Sub Start2() With Range("A1:A200") .Formula = "=int(rand()*1000)+1" .Value = .Value .Copy Cells(1, 3) .Offset(, 10).Formula = "=sum(rc[-5]:rc[-2])" End With End Sub
Sub iFen4() Dim WSF As WorksheetFunction: Set WSF = Application.WorksheetFunction Dim Bo As Boolean: Bo = True Dim Ziel As Integer Ziel = WSF.Sum(Range("C1:C200")) / 100
Do While Bo i = i + 1 If Not IsEmpty(Cells(i, 3)) Then Top = 1000 For j = i + 1 To 200 If Not IsEmpty(Cells(j, 3)) Then If Abs(Cells(i, 3) + Cells(j, 3) - Ziel) < Top Then Top = Abs(Cells(i, 3) + Cells(j, 3) - Ziel) jj = j End If End If Next j r = r + 1 Cells(r, 6) = Cells(i, 3) Cells(r, 7) = Cells(jj, 3) Cells(jj, 3).Clear End If If i > 100 Then Bo = False Loop End Sub