Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1028to1032
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

Kombinationsrätsel

Kombinationsrätsel
30.11.2008 08:54:00
Reinhard
Hallo Wissende,
in einem Rätselforum wurde folgende Kopfnuß dargestellt, inzwischen wurde sie gelöst mit einem Beispiel der Spielpaarungen wie sie für 8 Spieler aussehen könnte.
Die Lösung steht hier gaaaanz unten, wer mitknobeln möchte, muß ja nicht bis ganz unten scrollen :-)
**************************************************************************************
Ich habe folgendes Problem:
(Beispiel oder Unmöglichkeitsbeweis sind gesucht)
Kann man einen Spielplan für ein Tischkickerturnier konstruieren, bei dem 8 Spieler teilnehmen, jeweils 2
gegen 2 gespielt wird, nach jeder Runde die Teams verändert werden und folgende Bedingungen erfüllt
sind:
1. Jeder Spieler spielt mit jedem anderen Spieler(als Partner) genau einmal
2. Jeder Spieler spielt gegen jeden anderen Spieler (als Gegner) genau zwei mal
Ich habe noch kein Beispiel oder Unmöglichkietsbeweis für 8 Spieler gefunden, aber für 4 und 5 Spieler
jeweils ein Beispiel:
4 Spieler: (1,2,3,4)
12-34
13-24
14-23
5 Spieler
12-34
13-45
14-25
15-23
24-35
**************************************************************************************
Mit Vba komme ich in Spalte N nur bis zu 210 möglichen Spielpaarungen, was aber gar nicht richtig sein muß, denn gestern kam ich mit ähnlichem Code auf 420 mögliche Spielpaarungen, bin daher grad sehr unsicher was richtig ist.
Spalte A mit 28 möglichen Partnerschaften im Doppel wird wohl richtig sein.
Auch daß als Ergebnis 7 Spielpaarungen sein müssen ist klar.
Hat jemand vielleicht Lösungsansätze,Lösungscode?
Mein Versuchscode:

Option Explicit
Sub Plan()
Dim N As Byte, NN As Byte, Z1 As Long, Z2 As Long
Const M As Byte = 8
ActiveSheet.UsedRange.ClearContents
Application.ScreenUpdating = False
Columns("A:E").NumberFormat = "@"
For N = 1 To M
For NN = N + 1 To M
Z1 = Z1 + 1
If N  NN Then
Cells(Z1, 1) = N & NN
End If
Next NN
Next N
For N = 1 To Z1
For NN = N + 1 To Z1
If InStr(Cells(NN, 1), Left(Cells(N, 1), 1)) = 0 And InStr(Cells(NN, 1), Right(Cells(N, 1) _
, 1)) = 0 Then
Z2 = Z2 + 1
Cells(Z2, 2) = Cells(N, 1) & "-" & Cells(NN, 1)
End If
Next NN
Next N
Columns("A:E").AutoFit
Application.ScreenUpdating = True
End Sub


Gruß
Reinhard
Eine Lösung:
**************************************************************************************
die sache hat mich interessiert, weil ich eine lösung in einem anderen zusammenhang auch brauchen könnte.
ich bin von einem herkömmlichen jeder-gegen-jeden als einzel ausgegangen und habe diese gegnerschaften als partnerschaften verwendet. damit ist einmal sichergestellt, dass jeder exakt einmal mit jedem spielt.
dann gehts "nur" mehr drum, die richtigen paare gegeneinander antreten zu lassen. wenn ich nix übersehen habe, müsste folgendes passen:
1: 12-34, 56-78
2: 13-57, 24-68
3: 14-67, 23-58
4: 15-26, 37-48
5: 16-38, 25-47
6: 17-28, 35-46
7: 18-45, 27-36
**************************************************************************************

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kombinationsrätsel
30.11.2008 11:02:00
ransi
HAllo Rheinhard
Hier mal ein Code der dir alle möglichen Paarungen listet.
' **********************************************************************
' Modul: Tabelle1 Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit


Public Sub test()
Dim Dic1
Dim Dic2
Set Dic1 = CreateObject("Scripting.dictionary")
Set Dic2 = CreateObject("Scripting.dictionary")
Dim Arr
Dim B As Boolean
Dim I As Integer
Dim L As Long
Dim s As Integer
For L = 1 To 5 'Anzahl Spieler
    For I = L + 1 To 5 'Anzahl Spieler
        Dic1(L & I) = 0
    Next
Next
Arr = Dic1.keys
For L = 0 To UBound(Arr)
    For I = L To UBound(Arr)
        B = False
        For s = 1 To Len(Arr(L))
            If InStr(1, Arr(I), Mid(Arr(L), s, 1)) <> 0 Then
                B = True
                Exit For
            End If
        Next
        If B = False Then Dic2(Arr(L) & "<->" & Arr(I)) = 0
    Next
Next
Range("A1").Resize(Dic2.Count) = WorksheetFunction.Transpose(Dic2.keys)
End Sub

Schau mal ob du das ausbauen kannst.
ransi
Anzeige
AW: Kombinationsrätsel
30.11.2008 11:22:00
Reinhard
Hallo Ransi,
der Code ist für mich gut zum Lernen, bei Scripting.dictionary habe ich noch einiges zu verinnerlichen, das Transpose z.B.
Beim Rätsel war ich ja mit meinem Code auch schon so weit (nah *gg*). Immerhin hast du mir die 210 bestätigt, da lag ich wohl gestern falsch mit 420.
Danke
Reinhard
AW: Kombinationsrätsel
30.11.2008 21:08:26
ChristianM
Hallo zusammen,
nur mal so ein paar Gedanken...
Die Aufgabe läßt sich IMHO übersetzen in "Kombination von k aus n Elementen ohne Zurücklegen" (vgl. 6 aus 49 beim Lotto). Die Anzahl möglicher Mannschafts-Paarungen wäre also "n über k". Das heißt, bei 5 Spieler und zwei Spieler pro Mannschaft ergeben sich 10 Mannschafts-Paarungen ("5 über 2") und somit 5 Spiele. Bei 8 Spieler ergeben sich 28 mögliche Paarungen und somit 14 Spiele (entspricht den 7 Zeilen mit jeweils 2 angegebenen Paarungen von Reinhard).
Zur Info: "n über k" = n! / (k! * (n - k)!)
Nach diesem Ansatz wären also 210 mögliche Mannschafts-Paarungen falsch, denn es sind nur 28.
Ohne das jetzt weiter geprüft zu haben vermute ich, dass wenn immer "n über k" ungerade ist (zB bei "7 über 2" = 21) eine der möglichen Kombinationen nicht ausgespielt werden kann (der von Reinhard so genannte "Unmöglichkeitsbeweis").
viele Grüße
Christian
Anzeige
AW: Kombinationsrätsel
30.11.2008 22:21:00
Reinhard
Hallo Christian,
es gibt 28 Möglichkeiten wie sich die 8 Spieler zu Paaren zusammenfinden können.
Daraus ergeben sich dann 210 mögliche Spielpaarungen.
Und daraus gilt es nun eine oder alle 14 Spielpaarungen herauszufinden bei denen Regel 2 auch erfüllt ist.
Lass mal meinen Code oder den von ransi laufen, dann siehst du die 210 möglichen Spielpaarungen.
Und, es gibt ja zumindest eine perfekte Lösung, also ist es nicht unmöglich.
Gruß
Reinhard
AW: Kombinationsrätsel
01.12.2008 20:11:00
ChristianM
Hallo nochmals,
ok, da hab ich die Aufgabe wohl zuerst falsch verstanden. Ja du hast recht, es gibt 210 mögliche Spielpaarungen. Solche Spielereien finde ich sehr interessant, aber leider hab ich im Moment gar keine Zeit, um mich damit näher zu beschäftigen.
Mit den 210 Möglichkeiten wird das Thema natürlich sehr viel komplexer. Für 'ne Zuschnitts-Optimireung hab ich mal mit dem Solver rumgeschlagen. Vielleicht wäre der Solver ja auch geeignet, um dieses Problem zu lösen...ist nur 'ne Idee.
Ich lass die Frage noch offen.
Grüße
Christian
Anzeige
AW: Kombinationsrätsel
05.12.2008 15:50:00
Reinhard
Hallo Christian,
den Solver habe ich mal mit 7 + x = 12 ausprobiert und x wurde berechnet.
Mehr habe ich damit noch nicht gemacht.
Frage noch offen.
Gruß
Reinhard
AW: Kombinationsrätsel
01.12.2008 20:38:00
Lukas
Hallo
Also es gibt eine Möglichkeit, eine funktionierende Lösung zu finden. Die Lösung sieht folgendermassen aus:

Das ganze in Code zu fassen, habe ich heute keine Zeit mehr ... aber möchte euch noch die Grafik zeigen, wie man sich die Erstellung vorstellen kann:
Striche ohne Ende = Partner
Pfeile = Gegner
Das erste Spiel ist somit: 18-27 45-36
Nun drehen alle ihren Platz bis auf die Acht. Dann sieht es so aus:
Dies macht man, bis alles wieder bei der Ausgangslage ist. Damit sollte es aufgehen.
Ist natürlich beliebig erweiterbar ... Bei ungeraden Zahlen hat halt jemand einfach Pause, es steht jedoch niemand draussen ...
Viele Grüsse
Lukas
Anzeige
AW: Kombinationsrätsel
05.12.2008 15:48:00
Reinhard
Hallo Lukas,
so wie ich es verstehe spielt aber Spieler 8 viel zu oft, oder sehe ich da was falsch?
Gruß
Reinhard
AW: Kombinationsrätsel
06.12.2008 22:34:00
Lukas
Hallo Reinhard
Nein, Spieler 8 spielt überhaupt nicht zu oft! Jeder spielt schliesslich in jedem Spiel. Der Spieler 8 ist nun halt immer ganz links aufgeführt, aber immer nur einmal ...
Viele Grüsse
Lukas
AW: Kombinationsrätsel
07.12.2008 11:50:00
Reinhard
hallo Lukas,
dann habe ich es wohl falsch verstanden. Okay, dann schaue ich es mir nochmal viel genauer an und versuche das in Vba zu kodieren.
Gruß
Reinhard
AW: Kombinationsrätsel
30.11.2008 12:04:09
Lukas
Hallo
Dies ist mein Vorschlag ... ich bin mir nicht sicher, ob es genau das ist, was du suchst ...
Mein Code sucht eine Lösung für 8 Mitspieler. Immer 2 in einem Team. Die Teams wechseln, jeder ist einmal mit jedem im Team und jeder spielt einmal gegen jeden. So wolltest du doch das?
Option Explicit

Sub SpielerKombinationen()
Dim intSpieler1%, intSpieler2%, intAnzahlSpieler%
For intSpieler1 = 1 To 8
    For intSpieler2 = intSpieler1 + 1 To 8
        intAnzahlSpieler = intAnzahlSpieler + 1
        Cells(intAnzahlSpieler, 1) = intSpieler1
        Cells(intAnzahlSpieler, 2) = intSpieler2
        Cells(intAnzahlSpieler, 3).FormulaR1C1 = "=10*RC[-2]+RC[-1]"
    Next
Next
End Sub

Sub GegnerZusammenstellen()
Dim intTeam1%, intGegner%
[e1] = [c1]
For intTeam1 = 2 To 28
    For intGegner = 1 To 14
        If _
            ( _
                Not ( _
                    ((Cells(intGegner, 5) Mod 10) = Cells(intTeam1, 1)) _
                    Or (WorksheetFunction.RoundDown(Cells(intGegner, 5) / 10, 0) = Cells(intTeam1, 1)) _
                    Or ((Cells(intGegner, 5) Mod 10) = Cells(intTeam1, 2)) _
                    Or (WorksheetFunction.RoundDown(Cells(intGegner, 5) / 10, 0) = Cells(intTeam1, 2)) _
                ) _
            ) _
            And (Cells(intGegner, 6) = "") _
            And (Cells(intGegner, 5) <> "") Then
            Cells(intGegner, 6) = Cells(intTeam1, 3)
            GoTo naechster
        End If
    Next
    [e65536].End(xlUp).Offset(1, 0) = Cells(intTeam1, 3)
naechster:
Next
End Sub

Sub RundenFinden()
Dim intSpiel%, intSpielerZaehler%, dblMitspieler As Double, dblNMitspieler As Double, intPotenzMS%, intPotenzNMS%
For intSpiel = 1 To 14
    intPotenzMS = 3
    intPotenzNMS = 3
    dblMitspieler = 0
    dblNMitspieler = 0
    For intSpielerZaehler = 1 To 8
        If (InStr(1, Cells(intSpiel, 5), intSpielerZaehler) = 0) And (InStr(1, Cells(intSpiel, 6), intSpielerZaehler) = 0) Then
            dblMitspieler = dblMitspieler + intSpielerZaehler * 10 ^ intPotenzMS
            intPotenzMS = intPotenzMS - 1
        ElseIf (InStr(1, Cells(intSpiel, 5), intSpielerZaehler) > 0) Or (InStr(1, Cells(intSpiel, 6), intSpielerZaehler) > 0) Then
            dblNMitspieler = dblNMitspieler + intSpielerZaehler * 10 ^ intPotenzNMS
            intPotenzNMS = intPotenzNMS - 1
        End If
    Next
    Cells(intSpiel, 9) = Cells(intSpiel, 5) & Cells(intSpiel, 6)
    Cells(intSpiel, 8) = dblMitspieler
    Cells(intSpiel, 7) = dblNMitspieler
Next

Dim rngFound As Range, intKombination%
For intKombination = 1 To 7
    Set rngFound = Nothing
    Set rngFound = Range("g1:g14").Find(Cells(intKombination, 8))
    If Not rngFound Is Nothing Then
naechsteSuche:
        If Not Range("m1:m7").Find(what:=rngFound.Offset(0, 2), LookIn:=xlValues) Is Nothing Then
            Set rngFound = Range("g1:g14").Find(Cells(intKombination, 8), after:=rngFound)
            GoTo naechsteSuche
        Else
            Cells(intKombination, 11) = rngFound.Offset(0, -2)
            Cells(intKombination, 12) = rngFound.Offset(0, -1)
        End If
    End If
Next

Range("E1:F7,K1:L7").Interior.ColorIndex = 22
End Sub

Sub Vollständig()
SpielerKombinationen
GegnerZusammenstellen
RundenFinden
End Sub

Code eingefügt mit VBA in HTML 2.0size>
Viele Grüsse
Lukas
PS: Deine idee hat mich fasziniert :) Deshalb habe ich mich so lange damit beschäftigt ;)

Anzeige
AW: Kombinationsrätsel
30.11.2008 12:19:56
Reinhard
Hallo Lukas,
:::Mein Code sucht eine Lösung für 8 Mitspieler. Immer 2 in einem Team.
:::Die Teams wechseln, jeder ist einmal mit jedem im Team und jeder spielt einmal gegen jeden.
:::So wolltest du doch das?
nicht ganz, die Regeln sind aber klar:
1. Jeder Spieler spielt mit jedem anderen Spieler(als Partner) genau einmal
2. Jeder Spieler spielt gegen jeden anderen Spieler (als Gegner) genau zwei mal
Ich muß jetzt weg, aber den Code schaue ich mir nachher sicher an.
:::PS: Deine idee hat mich fasziniert :) Deshalb habe ich mich so lange damit beschäftigt ;)
Jepp, macht Laune, habe jetzt auch schon viel Zeit damit verbraucht :-)
Gruß
Reinhard
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige