Alle Varianten erhalten

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von vico255.

    Alle Varianten erhalten

    Hat einer eine Idee wie ich Werte so verteile, das jede Varianten einmal vorkommt?

    Vereinfacht möchte ich das so.

    Liste mit einem Item:
    a



    a



    a

    Liste mit 2 Items:

    ab


    ab

    a

    b
    ba


    b
    a

    b

    a

    ab



    ab

    ba



    ba

    b
    a

    a
    b

    Die Reihenfolge ist mir egal, es müssen nur alle Varianten drin vorkommen. (Verteilt in 3 Spalten)
    Ach und es sollte auch für mehr wie 2 Items möglich sein.

    Ich tu mich da gerade etwas schwer mit.

    LG



    PS:
    Wie viele Möglichkeiten gibt es?

    3
    12
    54?
    In Arbeit...
    @vico255 Das Zauberwort heißt Permutation. de.wikipedia.org/wiki/Permutation
    Es gibt Varianten mit und ohne Wiederholung. Da müsstest Du Dich erst mal festlegen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany das müsste 'ohne Wiederholung' sein.

    n Objekte verteilt auf 3 Spalten einer Tabelle. Wobei die Reihenfolge in jeder Zelle auch berücksichtig sein muss. Siehe 2 Tabelle (einmal ab und ba)

    Selbst eine 'abc' Variante aufzuschreiben macht Kopfzerbrechen ^^ ohne eine Konstellation zu vergessen.
    In Arbeit...
    Gut. Dann weißt du was du willst.
    Das passende Stichwort hast du auch.

    Dann mal ran an den Code. Bei weiteren Fragen deinen Code Posten dann kann man dir weiter helfen.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Ja, habe ich. Die Anderen sicherlich auch.
    Allerdings musst du deine Hausaufgaben schon selbst machen.

    Ich bin mir recht sicher dass sogar jemand hier im Forum schon mal ein Tutorial bezüglich Permutation gelistet hat.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Ich bekomm es nicht hin, ich haette gern so eine Auflistung, wobei die Reihenfolge der Zeilen egal ist.

    Die normale Verteilung bekomme ich ja hin aber meinen Fall net.
    zb:

    VB.NET-Quellcode

    1. Dim range = {0, 1, 2, 3}
    2. Dim combinations = From a In range
    3. From b In range
    4. From c In range
    5. Select (a, b, c) ' Permutation mit Wiederholung
    Bilder
    • p2.PNG

      32,67 kB, 1.728×987, 19 mal angesehen
    In Arbeit...
    Hi!

    Hilft Dir das weiter?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Dim Variationen As String() = GetPermutation(3, New Char() {CChar("A"), CChar("B")})
    5. For Each Variation As String In Variationen
    6. Debug.WriteLine(Variation)
    7. Next
    8. End Sub
    9. Public Shared Function GetPermutation(ByVal places As Integer, ByVal chars As Char()) As String()
    10. Dim output As ArrayList = New ArrayList()
    11. GetPermutationPerRef(places, chars, output)
    12. Return TryCast(output.ToArray(GetType(String)), String())
    13. End Function
    14. Private Shared Sub GetPermutationPerRef(ByVal places As Integer, ByVal chars As Char(), ByRef output As ArrayList, ByVal Optional outputPart As String = "")
    15. If places = 0 Then
    16. output.Add(outputPart)
    17. Else
    18. For Each c As Char In chars
    19. GetPermutationPerRef(places - 1, chars, output, outputPart & c)
    20. Next
    21. End If
    22. End Sub
    23. End Class

    vico255 schrieb:

    das müsste 'ohne Wiederholung' sein.

    vico255 schrieb:

    VB.NET-Quellcode

    1. ' Permutation mit Wiederholung
    Ja was denn nun?
    Immerhin hast Du diesen Post hier gefunden: Permutationen
    Mach auf Deine Form eine ListBox und füge diesen Code an:

    VB.NET-Quellcode

    1. For Each Tuple In combinations
    2. Me.ListBox1.Items.Add(Tuple)
    3. Next
    Ggf. musst Du im Code von @Morrison das Debug durch Console ersetzen, um den Output zu sehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke für eure Hilfe aber ich glaube ich bin zu doof.

    Danke @Morrison für dein Tipp. A und B war nur ein Beispiel, genauso gut hätten es Obsorten oder Zahlenfolgen sein können.

    Das mischen von A und B wie in deinem Fall ist nicht das Problem.

    Ich nenne mal ein anderes Beispiel:

    Stellen wir uns vor wir wären in einem Supermarkt wo 3 Kassen geöffnet sind und 2 Personen sich anstellen koennen.
    Nun ist es für mich noch wichtig ob sich zuerst Person1 oder Person2 an einer Kasse anstellt. Siehe meine Bildanhang.
    Bei mir gibt es immer nur genau 3 Kassen aber unterschiedliche Anz. von Personen.

    Das macht mir Probleme das zu lösen.

    LG
    In Arbeit...
    @vico255 Male mal auf, was bei Deinem Kassenbeispiel rauskommen soll.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Male mal auf

    Im ersten Durchlauf stellt sich P1 und P2 bei Kasse 1 an (P1 vor P2)
    Im zweiten Durchlauf P1 bei Kasse 1 und P2 bei Kasse 2
    Beim 4 Durchlauf stellen sich wieder beide bei Kasse 1 an, allerdings P2 vor P1



    edit

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim AList As New List(Of Auftrag)
    3. AList.Add(New Auftrag With {.Gewicht = 1000, .Temperatur = 480, .index = 0})
    4. AList.Add(New Auftrag With {.Gewicht = 3000, .Temperatur = 480, .index = 0})
    5. Dim dt As New DataTable
    6. dt.Columns.Add()
    7. dt.Columns.Add()
    8. dt.Columns.Add()
    9. For i As Integer = 0 To 3 ^ AList.Count - 1
    10. For ii As Integer = AList.Count - 1 To 0 Step -1
    11. If AList(ii).index = 2 Then
    12. AList(ii).index = 0
    13. Else
    14. If AList(ii).index < 2 Then AList(ii).index += 1
    15. Exit For
    16. End If
    17. Next
    18. Dim nrow As DataRow = dt.NewRow
    19. For Each a As Auftrag In AList
    20. nrow(a.index) &= a.Gewicht & " "
    21. Next
    22. dt.Rows.Add(nrow)
    23. Next
    24. DataGridView1.DataSource = dt
    25. End Sub


    liefert mir jetzt (siehe Anhang)
    allerding wird da die Reihenfolge noch nicht beachtet ob P1 vor oder hinter P2 an einer Kasse steht.

    Kann man das iwie schöner schreiben?
    Bilder
    • p2.PNG

      32,67 kB, 1.728×987, 9 mal angesehen
    • p3.PNG

      36,75 kB, 631×551, 9 mal angesehen
    In Arbeit...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vico255“ ()

    vico255 schrieb:

    allerdings P2 vor P1
    Das ist Dein Bild, nur in einer anderen Reihenfolge:

    Quellcode

    1. K1 K2 K3
    2. P1|P2
    3. P2|P1
    4. P1 P2
    5. P1 P2
    6. P2 P1
    7. P1|P2
    8. P2|P1
    9. P1 P2
    10. P2 P1
    11. P2 P1
    12. P1|P2
    13. P2|P1
    Nimm einfach die oben erwähnten Permutationen und finde diejenigen heraus, bei denen zwei Personen an einer Kasse stehen.
    Diese Lösungen musst Du verdoppeln und beide Reihenfolgen eintragen.
    Feddich.
    Besser wäre es, wenn Du hier nicht in jedem Post Deine Beispiel-Bases wechseln würdest.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    vico255 schrieb:

    so
    Ist egal wie, nur solltest Du einheitliche Begriffe verwenden.
    a|b, Kunden|Kassen, Temperatur|Gewicht, rotes Viereck|grüner Kreis => da genügt eins.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    vico255 schrieb:

    n Objekte verteilt auf 3 Spalten einer Tabelle.
    Mir scheint notwendig, hier eine "Permutation in einer Permutation" anzuwenden.
    Die "innere Permutation": n Objekte je Spalte ist ja die Standard-Permutation ohne Wiederholungen mathematisch gesprochen: "Variation aller Elemente, ohne Wiederholung"

    Die annere Geschichte - die Verteilung der Elemente auf die 3 Spalten - das scheint mir ein "Umdreh-Denk + Zwischenschritt" erforderlich zu machen:
    Nämlich nicht die n-Elemente auf k-Spalten verteilen, sondern die k-Spalten auf die n-Elemente. Und dabei auch Wiederholungen zulassen.
    Angenommen die Elemente a, b, c, d, e, und die Spalten 0, 1, 2 - das liesse sich in etwa so darstellen:

    Quellcode

    1. abcde
    2. 00000
    3. 00001
    4. 00002
    5. 00010
    6. 00011
    7. ...
    Diese Spalten-Zuteilungen (äussere Permutationen) wären aber noch umzuwandeln, bevor die innere Permutation - je Spalte - angewandt wird.
    Also zB 00011 bedeutet ja, dass a,b,c in Spalte 0 sind, und d,e in Spalte 1.
    Und dann kann man hergehen, und für die beiden Spalten die o.g. inneren Permutationen berechnen.


    Code-Algos zum Permutieren findste hier: codeproject.com/Articles/1111639/Permutations

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()