Spieltheorie

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    Spieltheorie

    Mal angenommen:

    Kartenspiel mit 20 Karten, mit Werten von 1-20. 2 Spieler. Jeder bekommt zufällig 10 Karten (verdeckt). Jeder spieler legt jeweils eine Karte verdeckt auf den Tisch. Wenn beide Karten liegen, wird aufdeckt und der Spieler mit der höheren Karte bekommt den Stich. Gewonnen hat, wer mehr Punkte hat.

    Fragen:
    Gibt es eine "optimale" Strategie? Wenn ja welche? Kann man das irgendwo nachlesen?
    also ich kenne dabei ein leicht ähnliches Spiel:
    de.wikipedia.org/wiki/Hol%27s_der_Geier

    ist recht lustig und ich meine, dass ich darin auch recht gut bin...nur gibt es hierbei auch noch zufällig eine Punktzahl welche man gewinnen kann(inklusive minus Punkte, die bekommt der mit den niedrigeren Werten)...
    also ich versuche meistens die kleineren Karten recht früh "los" zu werden, da die meisten Gegenspieler oft zu hoch ansetzen->da sie gewinnen wollen und sie später nur noch kleine Karten haben...hinzu kommt einfach, dass ich es nach Gefühl mach...xD

    aber da dein Beispiel etwas anders ist, denke ich stimmt meins auch nicht mehr ganz so...

    das wäre meine "Strategie", ob diese aber "Optimal" ist, ist wohl eher fraglich und alles eine Glückssache, da es ja noch auf den Gegenspieler ankommt...

    gut dabei ist, dass du genau weißt, welche Karten dein Gegenspieler hat ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    da es ja noch auf den Gegenspieler ankommt...

    Das wäre meine Überlegung:
    Macht eine "Strategie" überhaupt Sinn, oder spielt man die karten mehr oder weniger zufällig?
    Nehmen wir an, ich habe alle geraden und der Gegner alle ungeraden.
    Ich überlege, die 20 zu spielen - die gewinnt ja auf jeden Fall. Mein Gegner weiß, dass ich die 20 habe und antizipiert meinen Zug. Er nimmt also die 1. Wenn ich jetzt seine Antwort antizipiere, spiele ich stattdessen die 2. Das könnte der Gegner wieder antizipieren und stattdessen die 19 spielen. Würde ich das jetzt antizipieren ... usw usw ;)

    Müsste man vlt mal simulieren ...

    Madd Eye schrieb:

    Also um bei diesem spiel wirklich eine Strategie zu entwickeln musst du die Mathematik hernehmen

    Oder Mondphasen? Toller Link ... not :(


    Selbst mal rumgespielt:
    SimulatorKlasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Enum Strategie
    2. Zufall
    3. Niedrig
    4. Hoch
    5. End Enum
    6. Public Class GameSim
    7. Private BaseSet As New List(Of Integer)
    8. Private Shuffler As New Random(13245768)
    9. Private Chooser As New Random
    10. Public Sub New()
    11. For i = 1 To 20
    12. BaseSet.Add(i)
    13. Next
    14. End Sub
    15. Public Sub NewGame(ByRef SetA As List(Of Integer), ByRef SetB As List(Of Integer))
    16. Dim r() As Integer = (From i As Integer In BaseSet Order By Shuffler.NextDouble Select i).ToArray
    17. SetA = New List(Of Integer)
    18. SetB = New List(Of Integer)
    19. For i = 0 To 9
    20. SetA.Add(r(i))
    21. SetB.Add(r(10 + i))
    22. Next
    23. End Sub
    24. Public Function Choose(ByVal SetX As List(Of Integer), ByVal s As Strategie) As Integer
    25. Select Case s
    26. Case Strategie.Zufall
    27. Return SetX(Chooser.Next(0, SetX.Count))
    28. Case Strategie.Niedrig
    29. Return SetX.Min
    30. Case Strategie.Hoch
    31. Return SetX.Max
    32. End Select
    33. End Function
    34. Public Sub Remove(ByVal SetX As List(Of Integer), ByVal i As Integer)
    35. Dim j As Integer = -1
    36. For j = 0 To SetX.Count - 1
    37. If SetX(j) = i Then Exit For
    38. Next
    39. SetX.RemoveAt(j)
    40. End Sub
    41. End Class


    Aufrufcode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Simulate(Strategie.Hoch, Strategie.Niedrig)
    4. Simulate(Strategie.Niedrig, Strategie.Hoch)
    5. Simulate(Strategie.Niedrig, Strategie.Niedrig)
    6. Simulate(Strategie.Hoch, Strategie.Hoch)
    7. Simulate(Strategie.Zufall, Strategie.Zufall)
    8. Console.ReadLine()
    9. End Sub
    10. Private Sub Simulate(ByVal sA As Strategie, ByVal sB As Strategie)
    11. Dim seta As List(Of Integer) = Nothing
    12. Dim setb As List(Of Integer) = Nothing
    13. Dim a, b As Integer
    14. Dim awin, bwin, draw As Integer
    15. Dim asum, bsum As Integer
    16. Dim g As New GameSim
    17. For i = 1 To 100000
    18. g.NewGame(seta, setb)
    19. asum = 0
    20. bsum = 0
    21. For j = 1 To 10
    22. a = g.Choose(seta, sA)
    23. b = g.Choose(setb, sB)
    24. If a > b Then
    25. asum += (a + b)
    26. Else
    27. bsum += (a + b)
    28. End If
    29. g.Remove(seta, a)
    30. g.Remove(setb, b)
    31. Next
    32. If asum > bsum Then
    33. awin += 1
    34. ElseIf bsum > asum Then
    35. bwin += 1
    36. Else
    37. draw += 1
    38. End If
    39. Next
    40. Dim stb As New System.Text.StringBuilder
    41. With stb
    42. .AppendLine("Player A: " & sA.ToString)
    43. .AppendLine("Player B: " & sB.ToString)
    44. .AppendLine(String.Format("A: {0} B: {1} - {2}", awin, bwin, draw))
    45. .AppendLine("")
    46. End With
    47. Debug.Print(stb.ToString)
    48. Console.WriteLine(stb.ToString)
    49. End Sub
    50. End Module


    Output:

    Quellcode

    1. Player A: Hoch
    2. Player B: Niedrig
    3. A: 48720 B: 49159 - 2121
    4. Player A: Niedrig
    5. Player B: Hoch
    6. A: 48720 B: 49159 - 2121
    7. Player A: Niedrig
    8. Player B: Niedrig
    9. A: 48822 B: 48860 - 2318
    10. Player A: Hoch
    11. Player B: Hoch
    12. A: 48822 B: 48860 - 2318
    13. Player A: Zufall
    14. Player B: Zufall
    15. A: 49279 B: 49621 - 1100


    Was ich sehe: Strategie schein wurscht zu sein.
    wobei ich mich frage, ob ich irgendwo nen logischen Fehler habe, weil hoch-niedrig das gleiche ergibt wie niedrig-hoch (bzw hoch-hoch und niedrig-niedrig). Irgendwo ein Fehler?

    xCM2x schrieb:

    Ich schätze irgendwas stimmt mit dem Shuffler nicht.

    Derselbe Output ist beabsichtigt. Der ZufGen für's Kartenverteilen wird mit einer Konstanten initialisiert, damit man die Ergebnisse besser vergleichen kann. Die Karten sind also zufällig aber jedesmal gleich ;)
    Beim KartenLEGEN wird aber zufälliger Zufall verwendet.
    Nein, da ist kein Logikfehler. Allerdings sagt dein versuch nix aus über die strategien.
    Es ist bei gleich bleibendem Blatt egal ob hoch - niedrig oder anders herum.
    Ausschlag gebend ist bei welchem zug der Schnittpunkt ist. Bis zu diesem bekommt der hoch stratege jeden stich. Danach keinen.
    Aber egal wierum mans spielt,das Ergebnis bleibt gleich. Ebenso ist es bei niedrig -niesrig vs hoch-hoch.
    Die kartenpaare und damit der ausgang des stichs bleibt gleich.

    Ich bezweifle das es eine sichere strategie gibt, da man nicht alle aspekte kalkulieren kann.(gezogene karten +Handlung des gegners sind nicht berechenbar )
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich habe gestern Abend noch einmal eine eigene Version programmiert (Ich habe zugegebenermaßen ein bisschen übernommen ^^ ), in meiner Version gibt es deutliche Unterschiede zwischen den Strategien.

    Spielklasse

    VB.NET-Quellcode

    1. Public Class cardSim
    2. Private deck As New List(Of Integer)
    3. Public deckSpielerA As New List(Of Integer)
    4. Public deckSpielerB As New List(Of Integer)
    5. Private mischer As New Random
    6. Private letzeKarteHoch As Boolean = False
    7. Sub New()
    8. For i = 1 To 20
    9. deck.Add(i)
    10. Next
    11. End Sub
    12. Public Sub neuesSpiel(ByVal spA As Strategie, ByVal spB As Strategie)
    13. Dim tKarte As Integer
    14. Dim karteA As Integer
    15. Dim karteB As Integer
    16. For j = 1 To 50
    17. karteA = mischer.Next(0, 20)
    18. karteB = mischer.Next(0, 20)
    19. tKarte = deck(karteB)
    20. deck(karteB) = deck(karteA)
    21. deck(karteA) = tKarte
    22. Next
    23. deckSpielerA.AddRange(deck.GetRange(0, 10))
    24. deckSpielerB.AddRange(deck.GetRange(10, 10))
    25. End Sub
    26. Public Function auswaehlen(ByVal st As Strategie, ByVal d As List(Of Integer))
    27. Select Case st
    28. Case Strategie.hoechste
    29. Return d.Max
    30. Case Strategie.niedrigste
    31. Return d.Min
    32. Case Strategie.hochNiedrigAbwechselnd
    33. If letzeKarteHoch Then
    34. Return d.Min
    35. Else
    36. Return d.Max
    37. End If
    38. letzeKarteHoch = Not letzeKarteHoch
    39. Case Strategie.zufaellige
    40. Return d(mischer.Next(0, d.Count))
    41. End Select
    42. End Function
    43. Public Sub entferne(ByVal d As List(Of Integer), ByVal karte As Integer)
    44. d.RemoveAt(d.IndexOf(karte))
    45. End Sub
    46. Public Enum Strategie
    47. hoechste
    48. niedrigste
    49. zufaellige
    50. hochNiedrigAbwechselnd
    51. End Enum
    52. End Class


    Aufruf

    VB.NET-Quellcode

    1. Module Module1
    2. Dim karten As cardSim
    3. Sub Main()
    4. karten = New cardSim()
    5. Do While True
    6. Simuliere(cardSim.Strategie.niedrigste, cardSim.Strategie.niedrigste)
    7. Simuliere(cardSim.Strategie.niedrigste, cardSim.Strategie.hoechste)
    8. Simuliere(cardSim.Strategie.hoechste, cardSim.Strategie.hoechste)
    9. Simuliere(cardSim.Strategie.zufaellige, cardSim.Strategie.zufaellige)
    10. Simuliere(cardSim.Strategie.zufaellige, cardSim.Strategie.hochNiedrigAbwechselnd)
    11. Simuliere(cardSim.Strategie.niedrigste, cardSim.Strategie.hochNiedrigAbwechselnd)
    12. Simuliere(cardSim.Strategie.hoechste, cardSim.Strategie.hochNiedrigAbwechselnd)
    13. Simuliere(cardSim.Strategie.niedrigste, cardSim.Strategie.zufaellige)
    14. Simuliere(cardSim.Strategie.hoechste, cardSim.Strategie.zufaellige)
    15. Console.ReadLine()
    16. Loop
    17. End Sub
    18. Sub Simuliere(ByVal stA As cardSim.Strategie, ByVal stB As cardSim.Strategie)
    19. Dim a, b As Integer
    20. Dim aTotal, bTotal As Integer
    21. Dim aWin, bWin, draw As Integer
    22. For i = 1 To 100000
    23. karten.neuesSpiel(stA, stB)
    24. For j = 1 To 10
    25. a = karten.auswaehlen(stA, karten.deckSpielerA)
    26. b = karten.auswaehlen(stB, karten.deckSpielerB)
    27. If a > b Then
    28. aTotal = a + b
    29. Else
    30. bTotal = a + b
    31. End If
    32. karten.entferne(karten.deckSpielerA, a)
    33. karten.entferne(karten.deckSpielerB, b)
    34. Next
    35. If aTotal > bTotal Then
    36. aWin += 1
    37. ElseIf bTotal > aTotal Then
    38. bWin += 1
    39. Else
    40. draw += 1
    41. End If
    42. Next
    43. Console.WriteLine("A: " & stA.ToString)
    44. Console.WriteLine("B: " & stB.ToString)
    45. Console.WriteLine(aWin & " - " & bWin & " - " & draw & vbNewLine & vbNewLine)
    46. End Sub
    47. End Module


    Output

    Quellcode

    1. A: niedrigste
    2. B: niedrigste
    3. 48698 - 48591 - 2711
    4. A: niedrigste
    5. B: hoechste
    6. 39950 - 40238 - 19812
    7. A: hoechste
    8. B: hoechste
    9. 48404 - 48898 - 2698
    10. A: zufaellige
    11. B: zufaellige
    12. 48106 - 48249 - 3645
    13. A: zufaellige
    14. B: hochNiedrigAbwechselnd
    15. 56677 - 38725 - 4598
    16. A: niedrigste
    17. B: hochNiedrigAbwechselnd
    18. 39940 - 39916 - 20144
    19. A: hoechste
    20. B: hochNiedrigAbwechselnd
    21. 48877 - 48404 - 2719
    22. A: niedrigste
    23. B: zufaellige
    24. 38442 - 56889 - 4669
    25. A: hoechste
    26. B: zufaellige
    27. 38293 - 57107 - 4600


    Da könnte man ja fast meinen der Zufall wär die beste Strategie... :(

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

    Mono schrieb:

    Es ist bei gleich bleibendem Blatt egal ob hoch

    Kann denn heutzutage keiner mehr Code lesen? ;)

    Ich erzeuge nicht 10.000 gleiche Blätter. Es werden 10.000 verschiedene Blätter erzeugt und mit einer Strategiekombination getestet. Damit ich die Kombis vergleichen kann, wird aber für jede Kombi dieselbe Blattfolge von Karten erzeugt.
    Also bleibt das Blatt auch für die kombis gleich und bringt das gleiche Ergebnis.

    kurz: gleiches blatt für kombi niedrig - hoch, hoch - niedrig
    = gleiches resultat.
    Dasselbe gilt für hoch hoch vs niedrig niedrig.
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    kurz: gleiches blatt für kombi niedrig - hoch, hoch - niedrig

    Das meinte ich ja.
    Mit einem gegebenen Blatt X und der Verteilung A(X) und B(X) ist es offensichtlich egal, wer von den beiden Spielern "niedrig" und wer "hoch" spielt. Das Ergebnis ist jeweils identisch. Aber inzwischen ist mir wenigstens auch klar, warum ;)

    niedrig_hoch
    A B
    1 6
    3 4
    5 2

    bzw hoch_niedrig
    A B
    5 2
    3 4
    1 6

    Die Kombinationen bleiben ja jeweils gleich, da ich BEIDE sortierungen umdrehe und zweimal - egibt ja wieder + ;)
    War also ein Denkfehler meinerseits, jeweils die Gegenkombi zu prüfen.

    Ach so:
    Hatte auch mal mitgezählt, wer jeweils das "bessere" Blatt (Summe der Karten) hat: B liegt bei der gegebenen Zuf bei rund +350 (hat also 350 Mal ein besseres Blatt) und gewinnt ja auch entsprechend häufiger. Scheint also evtl egal zu sein, welche Strat man spielt, Hauptsache man hat die besseren Karten ;)
    Aber vlt findet ja noch jemand eine "gute" Strategie?