Flexible Potenzmenge

  • 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
    [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    $c=2
    $out = "{[leere Menge],"
    For $i=0 To $iSize-1
    $out &= "{"&$aElem[$i]&"}, "
    $c += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $n=0 To $iSize-1
    For $i=$n+1 To $iSize-1
    $out &= "{"&$aElem[$n]&", "& $aElem[$i]&"}, "
    $c += 1
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    $out &= "{"
    For $i=0 To $iSize-1
    $out &= $aElem[$i]&", "
    Next
    $out = StringTrimRight($out,2)&"}}"

    [/autoit] [autoit][/autoit] [autoit]

    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? :whistling:
    Mir ist auch eine 'große' Forschleife in den Sinn gekommen,
    die über 2^n Elemente geht, jedoch wird die Formatierung dementsprechend
    komplex... :S
    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...

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    2 Mal editiert, zuletzt von XovoxKingdom (13. November 2011 um 15:02)

  • [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $aElem[6] = ["Gold", "Silber", "Kupfer", "Eisen", "Holz", "Gummi"]
    Global $s_Potenzmenge = "{[leere Menge]", $a_Comb

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To UBound($aElem)
    $a_Comb = _ArrayCombinations($aElem, $i, ",")
    For $x = 1 To UBound($a_Comb) - 1
    $s_Potenzmenge &= ", {" & $a_Comb[$x] & "}"
    Next
    Next
    $s_Potenzmenge &= "}"
    ConsoleWrite($s_Potenzmenge)

    [/autoit]
  • AARGH... ich wusste nur von der Funktion _ArrayPermute() die mir in diesem Fall
    nicht wirklich nützlich wäre. X(
    Vielen Dank AspirinJunkie für die Lösung :thumbup:
    Beim nächsten Mal werde ich intensiver in der Hilfe suchen *auspeitsch* (...) .

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!