Letztens gab es mal wieder eine Aufgabe die grundlegend mit Kombinatorik gelöst werden konnte.
Dabei ist mir mal wieder bewusst geworden, dass die beiden Kombinatorik-Funktionen in der Array.au3 _ArrayCombinations und _ArrayPermute offensichtlich ziemlich willkürlich rausgepickt wurden.
Ebenso wichtige Spielarten der Kombinatorik wie Kombination mit Zurücklegen oder Variationen mit und ohne Zurücklegen werden davon überhaupt nicht abgedeckt.
Darüber hinaus sind sie auch meiner Meinung nach wahnsinnig beknackt realisiert, denn die einzige Möglichkeit für deren Rückgabewert ist ein zusammengepappter String für jede Gruppe wo man dann selbst zusehen kann wie man wieder an die Einzelelemente kommt.
Kurz - es war Zeit eine eigene UDF hierfür zu schreiben.
Diese beinhaltet folgende Funktionen:
_comb_Combinations - ermittelt k Kombinationen aus n Elementen ohne Zurücklegen
_comb_Combinations_Repetition - ermittelt k Kombinationen aus n Elementen mit Zurücklegen
_comb_Combinations_Repetition_All - ermittelt 1..k Kombinationen aus n Elementen mit Zurücklegen
_comb_Permute - ermittelt alle Permutationen aus n Elementen ohne Zurücklegen
_comb_Variations - ermittelt k Variationen aus n Elementen ohne Zurücklegen
_comb_Variations_Repetition - ermittelt k Variationen aus n Elementen mit Zurücklegen
_comb_ArrayInArrayTo2D - Hilfsfunktion um Array-In-Array-Konstrukte in ein 2D-Array zu konvertieren
__comb_binomialcoefficient - berechnet den Binomialkoeffizienten "n über k"
__comb_factorial - berechnet die Fakultät "x!"
_comb_Permute_restricted - Spezialfall der Permutation bei der für jedes Element angegeben wird wo es stehen darf (Bsp: https://autoit.de/thread/87422-beschreibung-von-punkten-und-ihren-kanten-zu-anderen-punkten/?postID=704373#post704373)
Beispiel zur Benutzung
#include "ArrayCombinations.au3"
; Das Elemente-Array:
Global $aA[] = ["A", "B", "C", "D", "E", "F"]
; Größe der zu ziehenden Stichprobe:
Global $k = 3
; Permutation (=Variation aller Elemente)
$aPermutations = _comb_Permute($aA)
_ArrayDisplay($aPermutations, "Alle Permutationen", "", 64)
; Kombinationen von k Elementen ohne Zurücklegen
$aCombs = _comb_Combinations($aA, $k)
_ArrayDisplay($aCombs, $k & "er-Kombinationen ohne Zurücklegen", "", 64)
; Kombinationen von k Elementen mit Zurücklegen
$aCombsRep = _comb_Combinations_Repetition($aA, $k)
_ArrayDisplay($aCombsRep, $k & "er-Kombinationen mit Zurücklegen", "", 64)
; Alle Kombinationen mit Stichprobengröße 1 bis k
$aCombsRepAll = _comb_Combinations_Repetition_All($aA, $k)
$aCombsRepAll2D = _comb_ArrayInArrayTo2D($aCombsRepAll)
_ArrayDisplay($aCombsRepAll2D, "Alle Kombinationen bis " & $k & " Elemente", "", 64 )
; Variationen mit Zurücklegen
$aVariations = _comb_Variations($aA, $k)
_ArrayDisplay($aVariations, $k & "er Variationen ohne Zurücklegen", "", 64)
; Variationen ohne Zurücklegen
$aVariationsRep = _comb_Variations_Repetition($aA, $k)
_ArrayDisplay($aVariationsRep, $k & "er Variationen mit Zurücklegen", "", 64)
Alles anzeigen