Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1932to1936
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Alle Permutationen auflisten (aaaabbccc}

Alle Permutationen auflisten (aaaabbccc}
02.06.2023 09:06:49
Konrad

Hallo,
ich suche ein Makro, das alle Permutationen auflistet.

Beispiel: Gesucht sind alle Anordnungen von 5 roten und 3 blauen Kugeln. Das sind 56 Anordnungen, (8!/5!/3!).
Zum Beispiel: rrrrrbbb, rrbrbbrr, bbrbrrrr, usw.
Die Bezeichnung der einzelnen Elemente ist mir gleich, kann auch a, b, c, sein. Die Ausgabe als Array zum Beispiel, sodass man damit weiter rechnen kann

Wenn das Makro auch mehr als 2 verschiedene Elemente kombinieren kann, umso besser.
Beispiel: alle Anordnungen von 2 roten, 3 blauen und 3 gelben Kugeln.
Das wären dann 560 Möglichkeiten (8!/2!/3!/3!)

Meine Internet-Recherche ergab nur beinah nützliche Ergebnisse, vielleicht kann mir jemand hier helfen.

LG, Konradw

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
in Excel Online oder Excel 365
02.06.2023 09:13:17
lupo1
=LAMBDA(n;[k];[c];LET(
z;WENN(c;c;WENN(ISTZAHL(--n)*(LÄNGE(n)=1);1;WENN(k;3;2)));
q;LAMBDA(q;n;ZUSPALTE(WENN(n2;1;ERSETZEN(q(q;n-1);SEQUENZ(;n);0;n))));
p;LAMBDA(p;n;LET(t;LÄNGE(n);r;RECHTS(n);EINDEUTIG(ZUSPALTE(WENN(t2;r;ERSETZEN(p(p;LINKS(n;t-1));SEQUENZ(;t);0;r))))));
v;LAMBDA(v;x;k;WENN(k>1;ZUSPALTE(v(v;x;k-1)&MTRANS(x));x));
SORTIEREN(WAHL(z;
q(q;n);
p(p;n);
LET(x;EINDEUTIG(LINKS(p(p;n);k));FILTER(x;NACHZEILE(x;LAMBDA(a;TEXTKETTE(SORTIEREN(TEIL(a;SEQUENZ(;k);1);1;1;1))=a))));
EINDEUTIG(LINKS(p(p;n);k));
v(v;EINDEUTIG(TEIL(n;SEQUENZ(LÄNGE(n));1));k)))))("rrbbbggg")


Guckst Du:
https://www.office-hilfe.com/support/threads/combinatorics_list-liste-der-permutationen-kombinationen-variationen-in-einer-formel.57791/


Anzeige
Nachtrag:
02.06.2023 09:17:29
lupo1
Mein =COMBINATORICS() (aus dem Link) erschlägt die ganze Schul-Kombinatorik.

Der Teil p; (rekursive Teil-Formel) erledigt aber schon allein Deine Frage. Lässt sich isolieren.


AW: Nachtrag:
02.06.2023 09:29:35
Konrad
Danke für deine schnelle Antwort, Lupo.

Da ich kein Excel online oder 365 habe, kann ich damit leider nichts anfangen.

Ich brauche ein VBA Makro.

LG Konradw


https://office.live.com/start/Excel.aspx
02.06.2023 09:33:28
lupo1
Da findest Du es!


AW: https://office.live.com/start/Excel.aspx
02.06.2023 10:13:51
Konrad
Sorry, kann mit diesem Link nichts anfangen.
Da ist nichts von einer Excel Datei zu sehen.


Das ist Excel. Keine Excel-Datei!
02.06.2023 11:05:07
lupo1
Dort trägst Du die Formel in eine Zelle. Fertig.


Anzeige
Ich verstehe kein Wort
02.06.2023 11:57:32
Konrad
Du schreibst:
"Dort trägst Du die Formel in eine Zelle. Fertig."
WO trage ich WELCHE Formel in welche Zelle? Und was ist dann fertig? Kommt dann das gewünschte Makro raus?


In 09:13:17 ist eine Formel.
02.06.2023 12:07:38
lupo1
Die kopierst Du so in eine Zelle rein.

Und wenn Du auf Daniel wartest, bekommst Du auch Dein Makro.


und hier die Permutations-Teilformel
02.06.2023 12:25:26
lupo1
Statt der o.g. langen Formel für alles:

=LET(n;"rrgggbbb";p;LAMBDA(p;n;LET(t;LÄNGE(n);r;RECHTS(n);EINDEUTIG(ZUSPALTE(WENN(t2;r;ERSETZEN(p(p;LINKS(n;t-1));SEQUENZ(;t);0;r))))));SORTIEREN(p(p;n)))

Du siehst: Es dreht sich hier alles um Deine Bedürfnisse. Uneigennützig, kostenlos, beflissen.


Anzeige
AW: Alle Permutationen auflisten (aaaabbccc}
04.06.2023 01:01:39
Konrad
Hallo

habe nun selbst eine Lösung gefunden:


Sub Aufruf_Permutation_Beispiel1()
   Call Ergebnisausdruck(PermutationenMitWiederholung(Array(1, 2, 3, 4)))
End Sub

Sub Aufruf_Permutation_Beispiel2()
   Call Ergebnisausdruck(PermutationenMitWiederholung(Array(1, 1, 1, 0, 0)))
End Sub

Sub Aufruf_Permutation_Beispiel3()
   Dim aListe()
   Dim cPermutationen As Collection
   
   aListe = Array("rot", "rot", "blau", "blau", "blau", "gelb", "gelb", "gelb")
   Set cPermutationen = PermutationenMitWiederholung(aListe)
   Ergebnisausdruck cPermutationen
End Sub

Sub Ergebnisausdruck(Sammlung As Collection)
'Die Einträge einer Collection werden im Direktbereich ausgedruckt.
   Dim i As Long
   For i = 1 To Sammlung.Count
      Debug.Print i, Join(Sammlung(i), ", ")
      If i > 100 Then
         Debug.Print i, "..."
         Exit For
      End If
   Next i
   Debug.Print Sammlung.Count & " Permutationen"
End Sub

Function PermutationenMitWiederholung(Grundmenge) As Collection
'Alle Permutationen der Einträge von Grundmenge werden in einer Collection zurückgegeben.
   Dim Sammlung As New Collection
   Call TeilPerm(Grundmenge, Sammlung, 0)
   Set PermutationenMitWiederholung = Sammlung
End Function

Sub TeilPerm(ByVal Liste, Sammlung As Collection, StartNr As Long)
   Dim Nummer As Long
   For Nummer = StartNr To UBound(Liste)
      If Nummer > StartNr Then Liste = Tausch(Liste, StartNr, Nummer)
      If StartNr + 1  UBound(Liste) Then
         Call TeilPerm(Liste, Sammlung, StartNr + 1)
      Else
         On Error Resume Next
         Sammlung.Add Liste, Join(Liste, ", ")
         On Error GoTo 0
      End If
   Next Nummer
End Sub

Function Tausch(ByVal Liste, PosA, PosB)
   'Zwei Einträge eines Arrays werden getauscht
   Dim Zwischen
   Zwischen = Liste(PosA)
   Liste(PosA) = Liste(PosB)
   Liste(PosB) = Zwischen
   Tausch = Liste
End Function
Ist vielleicht nicht optimal, aber für mich reicht es. Verbesserungsvorschläge gerne willkommen.

LG, Konradw

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige