Der Minimax-Algorithmus | Erklärung auf Deutsch

Поділитися
Вставка
  • Опубліковано 2 гру 2024

КОМЕНТАРІ • 28

  • @francesco.paletta
    @francesco.paletta 11 місяців тому +6

    Hallo Pascal, vielen Dank für das ausführliche Video zum Minimax-Algorithmus! Super erklärt, auch die Umsetzung in Python. :-)

  • @pa20065
    @pa20065 22 дні тому +1

    Klasse Video. Beeindruckend, wie klar und sicher du sprichst, verhedderst dich ja nie 😂 Ist Vier-Gewinnt nicht mittlerweile auch gelöst, sodass Computer den optimalen Zug errechnen können?

  • @rudipopp6734
    @rudipopp6734 2 місяці тому +1

    Ich bin von deiner Vortragsart begeistert. Du greifst interessante Probleme auf und löst sie.
    Weiter so

  • @andreasgaschka
    @andreasgaschka 11 місяців тому +2

    Underrated channel!
    Super content. Ich hoffe, der Algorithmus pusht dich bald mal! 👍🏼

  • @richard941
    @richard941 3 місяці тому +4

    super erklärung

  • @j.06p80
    @j.06p80 9 місяців тому +1

    Danke für so eine gute Erklärung! : )

  • @arthurgil338
    @arthurgil338 2 місяці тому

    Morgen, Pascal! Hatte jetzt nur kurz Zeit, reinzuschauen, aber ein Punkt fiel mir gleich ein. Habe gehört, dass das "Dame"-Spiel auch bereits perfekt von Computern gespielt werden kann, bin mir gerade aber nicht sicher, woher ich diese Info habe. Ich werde mich bestimmt noch genauer damit beschäftigen, zu Schachalgorithmen hab ich schon einiges gelesen, aber will erstmal alles anschauen, bevor ich wiederhole, was Du eventuell schon erklärt hast...

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  2 місяці тому

      Guten Morgen, ich habe gerade einmal gegoogelt und tatsächlich ist das Dame-Spiel gelöst. Wir wissen durch Computeranalysen, dass Dame bei perfektem Spiel immer unentschieden endet. Auch Spiele wie Vier-Gewinnt sind gelöst. Der Spieler, der beginnt, kann bei perfektem Spiel einen Sieg erzwingen. Dafür muss er seinen ersten Stein in die Mitte setzten.
      Viel Spaß mit dem Video :)

  • @arthurlolinger
    @arthurlolinger 9 місяців тому

    Echt gut und ausführlich erklärt, das einzige, was mir nur unklar ist ist wie nun der Computer aus dem Algorithmus weiß, welchen Zug er machen soll. Er bekommt ja am Ende nur den Maxwert zurück, aber keinerlei angaben, was er nun spielen soll

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  9 місяців тому

      Danke für deinen Kommentar :) Deine Anmerkung ist völlig richtig, ich bin ganz am Ende des Videos darauf eingegangen 01:02:25. Wir müssen den Code noch ein bisschen erweitern, um den besten Zug zu bestimmen. Dazu schauen wir uns alle Zugmöglichkeiten in der aktuellen Position an. Der Zug mit der höchsten Bewertung ist der Zug, den der Computer spielen sollte.

    • @arthurlolinger
      @arthurlolinger 9 місяців тому

      @@Programmieren-mit-Pascal Ah das habe ich irgendwie übersehen dies in eine Globale Variable zu packen macht natürlich Sinn

  • @TheCore2842
    @TheCore2842 Місяць тому

    Hallo Pascal,
    ich habe mir jetzt auch dieses Video angeschaut, und ich bin nach wie vor begeistert von Deiner Art, die Dinge zu erklären, auch wenn mir dieses Video ein wenig zu lang und zu theoretisch geworden ist. Aber das ist einzig meine subjektive Meinung, Du solltest da also nicht zu viel drauf geben :-)
    Ich würde mir aber wünschen, dass Du kommende Videos vielleicht ein wenig praktischer gestalten würdest, und vor allem auch den kompletten Code zur Verfügung stellst. Denn so bleiben für mich doch noch einige Fragen offen:
    1. Was passiert, wenn es mehrere gleichwertige Knoten gibt? Dein Beispiel ist ja relativ einfach aufgebaut (finde ich grundsätzlich sehr gut!), aber wenn es nun mehrere Kindknoten gibt, die gleichwertig sind? Was macht der Computer dann? Bzw. würde es dann nicht Sinn machen, die Tiefe um 1 zu erweitern, um den bessereb Zug doch noch zu finden.
    2. Der Algorithmus an sich ist ja nicht schlecht, allerdings hat er in meinen Augen mehrere Schwächen, u.a. steht und fällt er mit der Bewertungsfunktion. Oder übersehe ich hier etwas?
    3. Wie geht es weiter, wenn der Beste Zug gefunden wurde? Der Computer führt den Zug aus und wartet auf den Zug vom Gegenspieler. Und danach beginnt der Algorithmus von vorne. Und wie wird das praktisch umgesetzt?
    Ich freue mich auf Deine nächsten Videos.
    Viele Grüße
    Gunnar

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  Місяць тому +1

      Vielen Dank für Deinen netten Kommentar und für Dein Feedback. Das ist hilfreich und freut mich sehr :D
      Deine Fragen sind wirklich gut, ich werde sie mal versuchen der Reihe nach zu beantworten:
      1. Wenn zwei Knoten die gleiche Bewertung haben, dann ist es aus Sicht des Computers egal, welcher der beiden Züge ausgeführt wird. Die Züge werden als gleich gut betrachtet. In der Regel wird einfach der Zug ausgeführt, der zuerst analysiert wurde. Es ist ein interessanter Gedanke bei Gleichstand die Tiefe um einen zu erweitern. Möglicherweise stellt sich bei einer höheren Suchtiefe heraus, dass der eine Zug doch besser ist als der andere. Allerdings kostet die Erhöhung der Suchtiefe bei Gleichstand viel Rechenzeit und würde die Spielstärke wahrscheinlich nur leicht verbessern.
      2. Du hast absolut recht. Die Bewertungsfunktion ist einer der wichtigsten Bestandteile in Schachcomputern und bestimmt die Spielstärke gewaltig. Wenn die Bewertungsfunktion schlecht ist, dann wird der Computer auch schlecht spielen, selbst wenn der Minimax-Algorithmus viele Züge in die Tiefe denkt. Beim Schach sind die wichtigsten Faktoren, die in die Bewertung einfließen vor allem Figurenmaterial, Figurenaktivität, Bauernstruktur und Königssicherheit. Je mehr Regelungen in die Bewertung einfließen, desto mehr Rechenzeit wird für die Bewertung benötigt und desto weniger Züge kann der Minimax-Algorithmus in die Tiefe denken. Die Schwierigkeit besteht also vor allem darin, einen guten Kompromiss zwischen der Stärke der Bewertungsfunktion und der Suchtiefe zu finden.
      Es gibt aber auch Spiele wie Go, bei denen es kaum möglich ist, eine gute Bewertungsfunktion zu programmieren. Gute Go-Spieler bewerten eine Stellung vor allem anhand von Intuition und Erfahrung. Es ist sehr schwierig feste Regeln zu definieren, wann eine Stellung gut oder schlecht ist. Das ist einer von mehreren Gründen, warum der klassische Minimax-Algorithmus an Go scheitert. Für den Minimax-Algorithmus ist eine gute Bewertungsfunktion also eine Voraussetzung. Und das ist gar nicht bei allen Spielen möglich.
      3. Wenn der Computer seinen Zug ausführt und der Gegner dann wiederum einen Antwortzug macht, entsteht eine neue Spielposition. Ausgehend von dieser neuen Stellung wird jetzt erneut die maximieren-Funktion aufgerufen. Die neue Stellung ist jetzt also der Wurzelknoten und ausgehen von dieser Stellung laufen wir jetzt mit dem Minimax-Algorithmus bis zur Suchtiefe durch den Spielbaum. Auf diese Weise bestimmen wir den nächsten Computerzug.
      Ich hoffe, das konnte Deine Fragen beantworten. Wenn noch Dinge unklar sind oder Du weitere Fragen hast, lass es mich gerne wissen :)

    • @TheCore2842
      @TheCore2842 Місяць тому

      @@Programmieren-mit-Pascal Moin Pascal, vielen Dank für Deine ausführliche Antwort. Ich finde es echt super, dass Du Dir die Zeit nimmst, um so ausführlich zu antworten. Allerdings hast Du mich damit nun so richtig neugierig gemacht... 🙂 Hast Du zufällig so eine Bewertungsfunktion zur Hand, damit ich mir mal anschauen kann, wie so etwas grundsätzlich aufgebaut wird. Es muss auch nicht für Schach sein. Jedes andere Spiel geht auch. Hauptsache irgendein kompletter Code.
      Kannst Du mir vielleicht auch noch ein gutes Python Tutorial empfehlen? Ich denke, ich werde mich mal näher mit Python befassen in der nächsten Zeit.
      Viele Grüße
      Gunnar

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  Місяць тому

      @@TheCore2842 Hallo Gunnar, ich beantworte immer gerne Fragen zu dem Thema, weil mich das Thema selbst sehr interessiert :)
      Hier ist ein Beispiel für eine möglichst einfache Bewertungsfunktion im Schach. Man könnte den Code auch noch schöner und kompakter programmieren, aber ich habe versucht das Ganze so verständlich wie möglich zu halten:
      # Die Figuren werden als Zahlen repräsentiert.
      BAUER_WEISS = 1
      BAUER_SCHWARZ = 2
      SPRINGER_WEISS = 3
      SPRINGER_SCHWARZ = 4
      LAEUFER_WEISS = 5
      LAEUFER_SCHWARZ = 6
      TURM_WEISS = 7
      TURM_SCHWARZ = 8
      DAME_WEISS = 9
      DAME_SCHWARZ = 10
      KOENIG_WEISS = 11
      KOENIG_SCHWARZ = 12
      # Die Figuren sind unterschiedlich viele Punkte wert.
      BAUER_WERT = 1
      SPRINGER_WERT = 3
      LAEUFER_WERT = 3
      TURM_WERT = 5
      DAME_WERT = 9
      # Das Schachbrett wird als 2D-Liste dargestellt - Also als eine 8x8 Tabelle.
      # Eine 0 steht für ein leeres Feld. Die Figuren repräsentieren wir mit
      # den entsprechenden Zahlen.
      brett = [[8, 4, 6,10,12, 6, 4, 8],
      [2, 2, 2, 2, 2, 2, 2, 2],
      [0, 0, 0, 0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0, 0, 0, 0],
      [1, 1, 1, 1, 1, 1, 1, 1],
      [7, 3, 5, 9,11, 5, 3, 7]]
      # Hier beginnt die Bewertungsfunktion.
      # Es werden einfach nur die Wertigkeiten der Figuren zusammengerechnet.
      # Weiße Figurgen erhöhen die Bewertung - Schwarze Figuren verringern sie.
      def bewerten(brett):
      # Wir starten mit einer Bewertung von 0.
      bewertung = 0
      # Laufe alle Felder des Schachbretts ab.
      for row in range(8):
      for column in range(8):
      figur = brett[row][column]
      # Erhöhe / Verringere die Bewertung, wenn sich eine Figur auf dem Feld befindet.
      if figur == BAUER_WEISS:
      bewertung += BAUER_WERT
      elif figur == SPRINGER_WEISS:
      bewertung += SPRINGER_WERT
      elif figur == LAEUFER_WEISS:
      bewertung += LAEUFER_WERT
      elif figur == TURM_WEISS:
      bewertung += TURM_WERT
      elif figur == DAME_WEISS:
      bewertung += DAME_WERT
      elif figur == BAUER_SCHWARZ:
      bewertung -= BAUER_WERT
      elif figur == SPRINGER_SCHWARZ:
      bewertung -= SPRINGER_WERT
      elif figur == LAEUFER_SCHWARZ:
      bewertung -= LAEUFER_WERT
      elif figur == TURM_SCHWARZ:
      bewertung -= TURM_WERT
      elif figur == DAME_SCHWARZ:
      bewertung -= DAME_WERT
      # Gebe die Bewertung zurück
      return bewertung

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  Місяць тому

      @@TheCore2842 Es gibt viele gute Tutorials auf UA-cam, um Python zu lernen. Es gibt zum Beispiel eine sehr erfolgreiche Videoserie von dem Kanal "Programmieren Starten": ua-cam.com/play/PL_pqkvxZ6ho3u8PJAsUU-rOAQ74D0TqZB.html
      Ich selbst habe auch eine Python Tutorial Reihe gemacht. Diese richtet sich vor allem an komplette Anfänger. Wenn du schon Programmiererfahrungen hast, könnte dir das Ganze vielleicht ein bisschen zu langsam sein:
      ua-cam.com/play/PLPYSnTen2yes90nCeaEK0YadV8PzbyWfW.html

  • @FrankHoppe
    @FrankHoppe 2 місяці тому

    Jetzt weiß ich, warum mein BASIC-Schachprogramm in den 1990er Jahren so schwach war, auch wenn ich wegen der Rechendauer nur auf 5 Halbzüge mit Brute Force kam. Ich habe den Minimax-Algorithmus falsch verstanden und auch beim gegnerischen Zug als Computer gedacht. Ich habe immer den Zug ausgeführt, an dessen Ende die 5 stand, um bei Deinem Beispiel zu bleiben.
    Ich habe damals auch nicht verstanden warum das BASIC-Schachprogramm aus dem Buch von Dieter Steinwender so viel besser war als meins. Aber er hatte wohl Minimax richtig angewendet.

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  2 місяці тому +1

      Ah verstehe, das Programm ist dann also nicht davon ausgegangen, dass der Gegner immer die besten Züge spielt, sondern es ist davon ausgegangen, dass der Gegner immer die schlechtesten Züge spielt. Das ist ein häufiger Fehler, der schnell mal passieren kann beim Minimax-Algorithmus :)

  • @yourjourney.
    @yourjourney. 2 місяці тому

    Hey ho super Video! Wäre mega wenn du mal ein Erklärvideo zum Perlin-Noise Algorithmus machen könntest.

  • @Digitalislanate
    @Digitalislanate Місяць тому

    FRAGE: Damit ich einen Zug ausführen kann muss ich zuerst die Stellung kennen. Muss man da nicht auch die Stellung an die Maximierungsfunktion oder die Minimierungsfunktion übergeben?

    • @Programmieren-mit-Pascal
      @Programmieren-mit-Pascal  Місяць тому

      Das ist richtig. Entweder übergibst du die Stellung an die Funktionen oder du hast die Stellung global gespeichert, sodass die Funktionen auf die Stellung zugreifen können.

    • @Digitalislanate
      @Digitalislanate Місяць тому

      @@Programmieren-mit-Pascal Wir haben gelernt es ist gut wenn man mit globalen Variablen so wenig wie möglich arbeitet. Da ist dann die Fehlerkorrektur einfacher. Daher sollte man die Stellung übergeben.