Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP & Schach

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP & Schach

    Hi.

    Ich bin dabei eine Schachlösung (Übungszwecken) zu entwickeln. Als grobes Vorbild orientiere ich mich hierbei an Fritz (http://de.wikipedia.org/wiki/Fritz_%28Schach%29) - natürlich nicht ganz so ausgeklügelt.

    In der Konzeptionsphase bin ich schon recht weit, hake jetzt doch an einem Punkt: Fritz "lernt" praktisch gewisse Stellungen oder gute Zugabfolgen bzw. das spielerische Vorgehen des einzelnen (und optimiert sich dadurch weiter). Wie lässt sich sowas umsetzen? Bin in der Hinsicht etwas "kreativlos". Brüchte nen Gedankenanstoss - danke

    mfg Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.


  • #2
    algorytmische Observation der Züge und traversion über observierte Züge und deren Bevorzugung gegenüber logische Züge der Schach-AI, würde ich hier wohl anwenden.

    Zu deutsch: Du merkst dir Spielzüge 1-20, vergleichst diese in erster Charge ob sie möglich sind und in 2ter Charge welcher "klüger" wäre. Könnte man auch mit Schwierigkeitsgraden situieren. Gleichauf der bekannten Premisse: Ein Computer ist nicht intelligent, er wiederholt ( traversiert ) nur jede mögliche Alternative die ihm beigebracht wurde.

    Könnte man "Knock-Rocking" nennen.
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      @tr0y: thanks erstmal für deinen Ansatz. Auf gültige Züge wird stets geprüft werden. Das Problem besteht prinzipiell ja in der Bewertung der Züge, da mehrere Faktoren hier relevant sind: z.B. Positionsvorteil, Kombinationsmöglichkeiten, Figurenvorteil...usw.

      Du merkst dir Spielzüge 1-20, vergleichst diese in erster Charge ob sie möglich sind und in 2ter Charge welcher "klüger" wäre
      Grundidee war auch Meisterpartien zu hinterlegen und einzelne Züge in gewissen Positionen zu gewichten basierend auf diesen Partien.

      Wird wiederum schwierig, wenn z.B. 2 gleichgute Züge (zweischneidig) anwendbar sind (z.B. ein positioneller Zug oder eine unklare Opfermöglichkeit). Mit deiner Möglichkeit kann ich sicherlich das meiste abdecken, aber halt nicht alles.

      mfg wolf29
      while (!asleep()) sheep++;

      Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

      Kommentar


      • #4
        Wenn gleichgewicht unter Zügen identifiziert wird "randomizing" nutzen und den (Pseudo)-Zufall entscheiden lassen.

        Schach-Mechanik ist nicht anhand angedeuteter Algos zu erklären, da musst du dir schon ein Schema setzen das du verfolgen willst. Oder ob du Unterschiedliche Engines einbaust die als gegenspieler Arbeiten oder miteinander Kombiniert werden können, liegt quasi bei dir. Letzteres wär sicher sehr interessant zu realisieren.
        [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

        Kommentar


        • #5
          Wenn dein Algorithmus ein paar Züge vorausdenkt, hast du ja eine gewisse Ahnung, welchen Zug der Gegner im für ihn optimalen Fall machen sollte. Wenn er den dann nicht macht und die KI damit in eine bessere Position bringt, als erwartet, war es ein schlechter Zug.

          Eine Funktion zur Bewertung einer Stellung wirst du ja vermutlich so oder so brauchen. Dann kannst du also auch grob bestimmen, in welchem Maß der Zug gut oder schlecht war.

          Um daraus einen verwertbaren Lerneffekt zu ziehen, müsstest du die Stellung und den gemachten Zug der KI und den fehlerhaften Gegenzug dann noch irgendwie kategorisieren: Gambit/Figurentausch (nicht) angenommen, defensiven Zug gemacht und Initiative abgegeben, Springer gezogen, obwohl Turm günstiger gewesen wäre, Brettmitte oder eigene Figuren nicht ausreichend gedeckt, …

          Das kann dann in die Bewertungen von Zügen einfließen, indem etwa die Gewichtung erhöht wird, mit der eine Stellung bewertet wird, die einen Turm attackiert oder so.

          Verhältnismäßig einfach wäre wohl so was: Gegner macht immer Fehler, wenn er Türme ziehen sollte. Also wird die Bewertung der gegnerischen Türme runtergestuft, sodass sich die KI eher um die Figuren kümmert, mit denen der Gegner gut ist.

          Hm, verhältnismäßig einfach ist dabei vermutlich gar nichts.
          PHP-Wissenssammlung Composer Awesome Awesomeness PHP: The Right Way @mermshaus

          Kommentar


          • #6
            Wenn gleichgewicht unter Zügen identifiziert wird "randomizing" nutzen und den (Pseudo)-Zufall entscheiden lassen.
            Hm...ok, ne andere Idee hatte ich jetzt auch nicht.

            Oder ob du Unterschiedliche Engines einbaust die als gegenspieler Arbeiten oder miteinander Kombiniert werden können, liegt quasi bei dir. Letzteres wär sicher sehr interessant zu realisieren.
            Hm...interessanter Ansatz. Ich denke das werde ich verfolgen und schauen wie sich sowas kombinieren lässt.
            Kleine Endfrage: schwanke noch zwischen MySQL und MSSQL als DB System. Tendiere aber zu MSSQL wegen Stored Procedures und Triggermöglichkeiten (und gefühlte bessere Performance). Selbe Einschätzung?

            Danke Dir.

            mfg Wolf29
            while (!asleep()) sheep++;

            Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

            Kommentar


            • #7
              @mermshausen:

              Wenn dein Algorithmus ein paar Züge vorausdenkt, hast du ja eine gewisse Ahnung, welchen Zug der Gegner im für ihn optimalen Fall machen sollte. Wenn er den dann nicht macht und die KI damit in eine bessere Position bringt, als erwartet, war es ein schlechter Zug.
              Tja, "Vorrausdenken" im Schach ist ja so ne Sache für sich! Selbst Großmeister sagen, dass sie oftmals nicht mehr als 2-3 Züge, wegen der Variantendichte, vorrausberechnen. Der Rest ist dann Positionsgefühl und/oder gelernte Stellungen. Ich könnte sicherlich anhand des Spielverhaltens eines Spielers (wenn ich z.B. 100 Partien mit dem selben Gegner gespielt werden) ein gutes Muster dazu speichern/erfassen.

              Eine Funktion zur Bewertung einer Stellung wirst du ja vermutlich so oder so brauchen. Dann kannst du also auch grob bestimmen, in welchem Maß der Zug gut oder schlecht war.
              Ja, grob ist das Durch die Idee von tr0y auch möglich - denke dass ich erstmal damit das meiste abdecken kann.

              Um daraus einen verwertbaren Lerneffekt zu ziehen, müsstest du die Stellung und den gemachten Zug der KI und den fehlerhaften Gegenzug dann noch irgendwie kategorisieren: Gambit/Figurentausch (nicht) angenommen, defensiven Zug gemacht und Initiative abgegeben, Springer gezogen, obwohl Turm günstiger gewesen wäre, Brettmitte oder eigene Figuren nicht ausreichend gedeckt, …
              Ja...hier sehe ich noch etwas die Problematik: Springer gezogen, obwohl Turm günstiger gewesen wäre z.B. Im Mittelspiel denke ich kann man das noch gut bewerten, aber gerade im Endspiel lässt sich sowas ja nicht mehr so einfach bestimmen aufgrund der geringen Anzahl an Figuren und Zugmöglichkeiten (+ Sonderregeln wie z.B. 50-Züge Regel).

              Verhältnismäßig einfach wäre wohl so was: Gegner macht immer Fehler, wenn er Türme ziehen sollte. Also wird die Bewertung der gegnerischen Türme runtergestuft, sodass sich die KI eher um die Figuren kümmert, mit denen der Gegner gut ist.
              Ok, das lässt sich bewerkstelligen.

              Hm, verhältnismäßig einfach ist dabei vermutlich gar nichts.
              ...

              mfg Wolf29
              while (!asleep()) sheep++;

              Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

              Kommentar


              • #8
                Oracle 11g oder wenn du dich an ein System geißeln willst MSSQL. MySQL ist in dem Bezug zwar ausreichend, aber nunja, warum nicht mal eine andere Dimension wagen, wenn man schon komplexere Algorytmik über die Datenbank laufen lassen will. ORDBMS bieten da noch weit mehr als SPs, alternativ kannst du auch DODs nutzen.
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  Thanks..werde mich drüber schlau machen tr0y.

                  mfg wolf29
                  while (!asleep()) sheep++;

                  Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                  Kommentar

                  Lädt...
                  X