Hallo zusammen,
ich habe ein (möglicherweise logisches) Problem mit der Potenzmenge,
die ich mir gerne aus einer n-elementigen Menge generieren lassen würde.
Hier ist ein Beispiel für n=4:
Spoiler anzeigen
$iSize = 4
If $iSize = 4 Then
Dim $aElem[4] = ["Gold", "Silber", "Kupfer", "Eisen"]
ElseIf $iSize = 5 Then
Dim $aElem[5] = ["Gold", "Silber", "Kupfer", "Eisen", "Holz"]
Else
Exit
EndIf
$c=2
$out = "{[leere Menge],"
For $i=0 To $iSize-1
$out &= "{"&$aElem[$i]&"}, "
$c += 1
Next
For $n=0 To $iSize-1
For $i=$n+1 To $iSize-1
$out &= "{"&$aElem[$n]&", "& $aElem[$i]&"}, "
$c += 1
Next
Next
For $n=0 To $iSize-1
For $i=$n+1 To $iSize-1
For $k=$i+1 To $iSize-1
$out &= "{"&$aElem[$n]&", "& $aElem[$i]&","& $aElem[$k]&"}, "
$c += 1
Next
Next
Next
; Dieser Teil ist nur für n bzw. $iSize >= 5 relevant! :
;~ For $n=0 To $iSize-1
;~ For $i=$n+1 To $iSize-1
;~ For $k=$i+1 To $iSize-1
;~ For $p=$k+1 To $iSize-1
;~ $out &= "{"&$aElem[$n]&", "& $aElem[$i]&","& $aElem[$k]&","& $aElem[$p]&"}, "
;~ $c += 1
;~ Next
;~ Next
;~ Next
;~ Next
$out &= "{"
For $i=0 To $iSize-1
$out &= $aElem[$i]&", "
Next
$out = StringTrimRight($out,2)&"}}"
MsgBox(0,"Ist: "&$c&" = "&2^$iSize&" : Soll",$out)
[/autoit]
Wenn man jetzt n=5 setzen will, so muss der auskommentierte Teil wieder 'scharf' gemacht werden,
und $iSize auf 5 gesetzt werden...
Leider kann ich das nicht allgemein fassen,
da z.B. bei n=6 noch eine weitere innere Schleife - zusätzlich zu dem Konstrukt,
das mir die letzte n=5 Forschleife liefert, hinzukäme!
ich weiß, dass die Rechenzeit enorm zulegt, da wir ja 2^n Elemente erwarten,
aber das sei an dieser Stelle nicht wichtig.
Hat einer vllt. eine Idee, wie man dynamisch mehrere Forschleifen erzeugen kann,
die (nach derzeitigem stand) ineinander verschachtelt sind?
Mir ist auch eine 'große' Forschleife in den Sinn gekommen,
die über 2^n Elemente geht, jedoch wird die Formatierung dementsprechend
komplex...
Weitere Ideen sind natürlich gerne willkommen!
Vorhaben in kurz:
Eine Potenzmenge mit <= 5 Elemente ist kein Problem,
jedoch würde ich das gerne mit einer variablen Größe
generieren lassen - OHNE dass ich per hand kurz vor der Laufzeit
die entsprechenden Forschleifenkonstrukte einfügen muss!
[Sollte der Sachverhalt unklar sein, dann kann ich gerne für Klarheit sorgen]
PS: Eine spätere Umsetzung via OpenCL wäre nicht schlecht, da bei steigender Mächtigkeit der Ursprungsmenge
die Zeit exponentiell zunimmt und parallelisierbar ist ! - Falls jemand daran Interesse hat dies umzusetzen...