Das ist allgemein gehaltener Demo-Code, dem man ein Wertearray
übergibt (values) und der alle Kombinationen von kstart bis kend
in die als Parameter gegebene Datei schreibt.
Für Deine Zwecke (Häufigkeit in Gruppen) muß eine Routine angepaßt werden.
Function NueberK_Output(values() As Integer, k%, kanal_out As Integer) As _
Boolean
'Liste aller Kombinationen der Werte in Values
'values: null-basiertes Array mit Werteliste n = ubound(values)+1)
'k: Anzahl der Werte in einer Kombination
'Ausgabe in den Output_kanal
On Error GoTo fehler
NueberK_Output = False
Dim indices%()
ReDim indices%(k - 1)
indices(0) = -1
Dim anz&
anz = CLng(NueberK(UBound(values) + 1, k))
If anz = -1 Then Exit Function
ReDim kombi(k - 1) As Integer
Dim i&, j%, l%, freq&
For i = 1 To anz
NextIndex indices, UBound(values) + 1
'aktuelle Kombination aus Indices ermitteln
For j = 0 To UBound(kombi)
kombi(j) = values(indices(j))
Next j
'Häufigkeit dieser Kombi in den Gruppen zählen
freq = 0
'Schleife über Wertelisten in den Gruppen
'Array: Kombis enthält Gruppen
For j = 1 To UBound(kombis)
If ContainsAll(kombis(j).V1, kombi) Then freq = freq + 1
Next j
If freq > 0 Then
'Kombination und Häufigkeit ausgeben
For j = 0 To k - 1
Print #kanal_out, values(indices(j));
Next j
Print #kanal_out, " F = " & CStr(freq)
End If
Next i
NueberK_Output = True
Exit Function
fehler:
End Function
Private Function ContainsAll(total() As Integer, kombi() As Integer) As Boolean
'Sind alle Kombi-Werte in Total enthalten ?
ContainsAll = False
Dim i%, k%, found As Boolean
For k = 0 To UBound(kombi)
found = False
For i = 1 To UBound(total)
If total(i) = kombi(k) Then found = True: Exit For
Next i
If Not found Then Exit Function
Next k
ContainsAll = True
End Function Der Code in der Hauptroutine "Form_Load" sieht dann so aus:
'Typen-Deklarationen wie bisher
'Daten-Liste lesen (wie bisher)
ReadLines "C:\Daten\input.txt"
'Liste der Gruppen erstellen (incl. Wertearray für jede Gruppe)
'wie bisher
SetLinesToKombis
Dim fn$: fn = "C:\daten\output_neu.txt"
'Werteliste erstellen (1-104, nullbasiert)
Dim values%(103), i%
For i = 0 To 103
values(i) = i + 1
Next i
'2er bis 4er Kombis durchgehen und Häufigkeit ausgeben
Wertekombinationen_ausgeben fn, values, 2, 4
'bisheriger rest entfällt
Beitrag wurde zuletzt am 23.02.15 um 10:10:08 editiert. |