Mini AI Cup # 3: Einen Top Bot schreiben


Im FrĂŒhherbst wurde der Wettbewerb um das Schreiben von Bots Mini AI Cup # 3 (auch bekannt als Mad Cars) abgeschlossen, bei dem die Teilnehmer auf Autos kĂ€mpfen mussten. Die Teilnehmer diskutierten viel darĂŒber, was funktionieren wird und was nicht, Ideen wurden ausgedrĂŒckt und getestet, vom einfachen Wenn bis zum Training neuronaler Netze, aber die Jungs belegten die SpitzenplĂ€tze mit der sogenannten "Simulation". Versuchen wir zu verstehen, was es ist, vergleichen Sie die Lösungen fĂŒr den 1., 3. und 4. Platz und diskutieren Sie ĂŒber das Thema anderer möglicher Lösungen.


Haftungsausschluss


Der Artikel wurde in Zusammenarbeit mit Alexei Dichkovsky (Commandos) und Vladimir Kiselev (Valdemar) verfasst .


FĂŒr diejenigen, die nur ĂŒber die Entscheidungen der Gewinner lesen möchten, empfehle ich Ihnen, sofort mit dem Punkt „Simulation“ zu beginnen.


ErklÀrung des Problems


Diesmal war die Mechanik der Welt dem Handyspiel Drive Ahead sehr Ă€hnlich: Die Spieler erhielten ein Auto mit einem Knopf darauf; Die Aufgabe besteht darin, den Knopf des Feindes schneller zu drĂŒcken als er. Wenn in 600 Spiel-Ticks niemand gewinnt, sinkt die Karte in einen MĂŒllhaufen, der auch einen Knopf drĂŒcken kann. Mit anderen Worten, Sie mĂŒssen Ihren Knopf vor Feinden, der Welt um Sie herum und MĂŒllhaufen schĂŒtzen (lebenswichtig, ja). Jeder Spieler erhielt 5 Leben, das Spiel dauerte 5 bis 9 Runden, wĂ€hrend jemand sein Leben nicht beendete. Jede Runde wurde auf einer zufĂ€lligen Karte und Autos abgehalten, die fĂŒr beide Teilnehmer gleich waren. Insgesamt gab es 6 verschiedene Karten und 3 Fahrzeugtypen - insgesamt 18 verschiedene Kombinationen.


Jede Runde ist in Zecken unterteilt. Ein Tick ist ein Zug, wie im Schach. Der einzige Unterschied ist, dass beide Spieler gleichzeitig gehen. Es gibt Wettbewerbe, bei denen sich jeder abwechselt, oder Sie können eine Aktion nur einmal alle paar ZĂŒge ausfĂŒhren und Einheiten als Rahmen auswĂ€hlen .
Jeder Tick fĂŒr den Bot ist ein Zustand des Friedens und bietet die Möglichkeit, drei Aktionen auszufĂŒhren: , , . Diese Aktionen bringen das Auto in eine der Richtungen, und wenn es gleichzeitig die RĂ€der der Erde nicht berĂŒhrt, geben sie dem ganzen Körper eine kleine Drehung (ein bisschen Arcade-Physik). Nachdem beide Gegner eine Aktion ausgewĂ€hlt haben, wird eine Simulation der Spielwelt gestartet, ein neuer Zustand betrachtet und an die Spieler gesendet. Wenn jemand auf eine SchaltflĂ€che geklickt hat, endet die Runde und die nĂ€chste beginnt. Alles ist einfach, aber es gibt Nuancen.


VollstÀndigere Regeln finden Sie hier . Und sehen Sie die Finalspiele hier .


Allgemeine Lösungsbeschreibung


Die meisten Bot-Schreibwettbewerbe sind sehr Ă€hnlich: Es gibt eine endliche Anzahl von Ticks (es gibt maximal 1.500 fĂŒr eine Runde), es gibt eine endliche Anzahl von möglichen Aktionen, Sie mĂŒssen eine Abfolge von Aktionen auswĂ€hlen, um besser als Ihre Gegner zu sein. Wenig spĂ€ter kehren wir zu dem zurĂŒck, was es bedeutet, besser zu sein, aber jetzt werden wir herausfinden, wie wir mit dem Hauptproblem umgehen sollen - einer Vielzahl von Optionen: Zu Beginn haben wir einen Anfangszustand, dann kann sich jede Maschine auf drei verschiedene Arten bewegen gibt uns 9 verschiedene Kombinationen fĂŒr zwei Autos, durch die 1.500 Bewegung werden es 9 ^ 1.500 verschiedene Kombinationen sein ... Das ist etwas mehr als wir möchten, wenn wir planen, Zeit zu haben, um sie wĂ€hrend der Existenz des Universums zu sortieren.


Hier kommen wir zu dem, was Simulation ist . Dies ist kein Algorithmus, sondern lediglich eine Neuerstellung der Spielregeln mit ausreichender oder vollstĂ€ndiger Genauigkeit, damit die Lösungen sortiert werden können. NatĂŒrlich werden wir nicht alle Lösungen durchgehen, sondern nur einen Teil davon. HierfĂŒr wird ein Suchalgorithmus verwendet - im Spielstatusbaum suchen wir das Beste fĂŒr uns. Es gibt viele Algorithmen (von Minimax bis MCTS), jeder hat seine eigenen Nuancen. Machen Sie sich am besten mit den Entscheidungen vertraut, die Teilnehmer frĂŒherer KI-Wettbewerbe getroffen haben. Dies liefert ein grundlegendes VerstĂ€ndnis darĂŒber, unter welchen Bedingungen die Algorithmen funktionieren und unter welchen nicht. DafĂŒr gibt es in einem speziellen Repository viele Links.


Bei der Auswahl eines Algorithmus sollten Sie Folgendes berĂŒcksichtigen:


  • Zeitlimit fĂŒr 1 Tick (hier habe ich mich dieses Jahr viel verrechnet, konnte aber auf dem 3. Platz bleiben);
  • Anzahl der Spieler. Wenn beispielsweise drei Spieler vorhanden sind, ist es schwierig, Minimax zu verwenden.
  • Simulationsgenauigkeit, as Dies kann die Wiederverwendung alter Berechnungen ermöglichen.
  • "Verzweigung" des Zustandsbaums (ist es möglich, alle möglichen ZustĂ€nde mindestens 10 Schritte voraus zu berechnen);
  • gesunder Menschenverstand - schreiben Sie kein MCTS, wenn der Wettbewerb 4 Stunden dauert.

In diesem Wettbewerb ergab 1 Tick ungefĂ€hr 10-13 ms (2 Minuten fĂŒr das gesamte Spiel). WĂ€hrend dieser Zeit musste der Bot die Daten lesen, eine Entscheidung treffen und einen Befehl zum Verschieben senden. Dies war genug, um ungefĂ€hr 500-1000 Bewegungen zu stimulieren. Iterieren Sie ĂŒber alle ZustĂ€nde. Der einfachste Suchalgorithmus sieht möglicherweise aus wie ein Vergleich von drei Bewegungsoptionen: "50 Ticks gehen nach links", "50 Ticks gehen nach rechts", "50 Ticks klicken auf Stopp". Und egal wie einfach es klingt, es ist nicht weit von der Entscheidung des Gewinners entfernt.


Weil Wir zĂ€hlen nur 50 ZĂŒge voraus, was in den meisten FĂ€llen erst am Ende des Spiels zĂ€hlt. Dann brauchen wir eine Bewertungsfunktion , die sagt, wie gut und schlecht der Zustand der Welt fĂŒr uns ist. Meistens basiert es auf Heuristiken und dem VerstĂ€ndnis, was fĂŒr den Sieg wichtig ist. Zum Beispiel gab es beim russischen AI Cup-Wettbewerb 2014 Rennen, aber Sie könnten gewinnen, wenn Sie zuletzt ankommen und mehr Bonuspunkte erhalten. Daher sollte die Bewertungsfunktion das Sammeln von Punkten gleichzeitig mit der schnellen Bewegung entlang der Autobahn stimulieren. Die Punktzahl kann nur fĂŒr den letzten Zustand der Simulation (nach 50 Ticks) oder als Summe der SchĂ€tzungen der ZwischenzustĂ€nde berechnet werden. Oft „verblasst“ die SchĂ€tzung mit der Zeit, sodass frĂŒher auftretende ZustĂ€nde stĂ€rker beeinflusst werden. Weil Wir können den Feind nicht sicher vorhersagen, dann sind zukĂŒnftige Optionen weniger wahrscheinlich, wir werden uns nicht stark auf sie verlassen. Außerdem beschleunigt diese Technik den Bot, um seine Aufgaben zu erledigen, und verschiebt nicht alles fĂŒr spĂ€ter. Es ist jedoch anzumerken, dass der Bot im Interesse spĂ€terer Vorteile weniger Risiken eingeht.


Da wir den Zustand der Welt als Reaktion auf unsere Handlungen vorhersagen werden, mĂŒssen wir das Verhalten von Feinden irgendwie modellieren. Es gibt nichts Kompliziertes und es gibt einige gĂ€ngige Optionen:


  • Stub oder Heuristik
    Es wird eine einfache Verhaltenslogik geschrieben, bei der der Feind einfach nichts tut oder Aktionen basierend auf einfachen Heuristiken auswÀhlt (Sie können beispielsweise Ihre ersten Versionen der Strategie verwenden oder einfach den vorherigen Zug des Gegners wiederholen).
  • Verwenden Sie den gleichen Algorithmus wie fĂŒr sich
    Zuerst versuchen wir, die besten Aktionen fĂŒr den Feind zu finden (gegen unsere besten Aktionen aus dem letzten Zug oder gegen einen Stummel), und dann suchen wir nach der besten Aktion fĂŒr uns selbst, indem wir das Verhalten verwenden, das der Feind gefunden hat. Hier wird der Bot versuchen, kniffligen Feinden zu widerstehen. Diese Logik funktioniert zu Beginn des Wettbewerbs nicht gut, weil Viele Bots sind immer noch sehr schwach und Ihre Entscheidung wird mit ihnen zu vorsichtig sein.
  • Andere
    Der gleiche Minimax iteriert ĂŒber alle ZĂŒge der Spieler gleichzeitig, und er benötigt einfach keine Heuristiken.

Wenn Sie alle oben genannten Schritte ausfĂŒhren, erhalten Sie höchstwahrscheinlich einen sehr guten Bot, insbesondere wenn Sie eine gute Bewertungsfunktion ĂŒbernehmen können. Aber wenn man seine KĂ€mpfe durchschaut, kann man sehen, dass er sich in bestimmten Situationen seltsam verhĂ€lt. Das Korrigieren der Bewertungsfunktion fĂŒr diese Situationen kann schwierig sein oder es besteht ein großes Risiko, dass eine andere Logik verletzt wird. Hier kommen KrĂŒcken und Wenns zur Rettung. Ja, in den letzten Tagen des Wettbewerbs ging es oft darum, KrĂŒcken und Wenns zu schreiben, um die Fehler unter bestimmten Bedingungen zu beheben. Persönlich mag ich diesen Teil wirklich nicht, aber ich habe mehr als einmal bemerkt, dass es KrĂŒcken im Finale sind, die die Anordnung der PlĂ€tze in den Top Ten beeinflussen können, was bedeutet, dass ein ungeschriebenes Wenn Sie einen Preis kosten kann (mein Herz tut weh, wenn ich diese Worte schreibe, ich Ich liebe auch schöne Algorithmen und Lösungen.


F: Kann man ĂŒberhaupt auf Simulation verzichten?
A: Ja, Sie können Lösungen fĂŒr Heuristiken verwenden (EntscheidungsbĂ€ume, eine Reihe von Wenns usw.). Es gibt einen guten Artikel mit KI-Architekturen zur Heuristik.


F: Wie viel besser ist die Verwendung von Simulationen als heuristische AnsÀtze?
A: Es hĂ€ngt alles von der Aufgabe ab. Zum Beispiel könnten hier einige Kombinationen von Karten und Autos mit Wenns fest codiert werden und immer gewinnen (oder ziehen). Oft findet die Simulation jedoch Lösungen, die fĂŒr sich selbst schwer zu denken oder Heuristiken schwer zu implementieren sind. Wenn Sie in diesem Wettbewerb ein anderes Auto umdrehen, setzen die Lösungen in den Simulationen das Rad auf das Rad des Feindes, wodurch die Flagge "in der Luft" ausgeschaltet wird. Dies bedeutet, dass der Feind die Drehung des Körpers nicht anwenden und die RĂ€der nicht wieder drehen kann. Aber die Entscheidung dachte nicht ĂŒber die Bedeutung nach, sondern fand nur Optionen, bei denen der Feind schneller auf das Dach fallen und seinen Knopf drĂŒcken wĂŒrde.



F: Neuronale Netze und RL?
A: Egal wie beliebt dies ist, in Bot-Wettbewerben funktionieren solche Lösungen selten gut. Obwohl neuronale Netze keine Simulation benötigen, weil Sie können einfach eine Aktion ausfĂŒhren, die auf den Eingabeparametern des aktuellen Status basiert. Sie mĂŒssen noch etwas lernen, und dafĂŒr mĂŒssen sie hĂ€ufig einen Simulator schreiben, um Spiele zu Tausenden lokal zu steuern. Persönlich glaube ich, dass sie Potenzial haben. Vielleicht können sie einen Teil des Problems lösen oder es unter Bedingungen sehr begrenzter Reaktionszeit verwenden.


Hinweis
In Bezug auf die endliche Anzahl möglicher Aktionen sollte klargestellt werden, dass es manchmal erlaubt ist, einige Parameter "reibungslos" anzupassen. Zum Beispiel nicht nur vorwĂ€rts fahren, sondern mit einem gewissen Prozentsatz an Leistung. In diesem Fall kann die „Endlichkeit“ der Anzahl der Schlussfolgerungen leicht erreicht werden, indem einfach mehrere Werte verwendet werden, beispielsweise 0%, 25%, 50%, 75% und 100%. Meistens reichen nur zwei aus: "Voll ein" und "Voll aus".


Simulation


In diesem Wettbewerb haben wir die fertige Chipmunk-Physik- Engine verwendet. Die Erwartungen der Organisatoren waren, dass er alt und erprobt ist und viele Wrapper hat, damit jeder es in seine Entscheidung einbeziehen kann ...


In der harten RealitĂ€t erzeugte der Motor jedes Mal andere Werte, was es schwierig machte, ihn neu zu starten, um die Optionen fĂŒr Bewegungen zu berechnen. Das Problem wurde „frontal“ gelöst - ein Speicherzuweiser wurde in C geschrieben und ein Speicher mit dem Zustand der Welt wurde vollstĂ€ndig kopiert. Ein solcher Allokator machte der FĂ€higkeit ein Ende, Lösungen in anderen Sprachen als C ++ zu schreiben (tatsĂ€chlich war es möglich, aber sehr arbeitsintensiv und ein Allokator mĂŒsste noch in C geschrieben werden). DarĂŒber hinaus wurde die Genauigkeit der Vorhersage durch die Reihenfolge des HinzufĂŒgens von Elementen zur Spielwelt beeinflusst, was eine sehr genaue Kopie des Codes erforderte, den die Organisatoren zur Berechnung der Spiele verwendeten. Aber er war schon in Python. Das letzte Highlight im Sarg anderer Programmiersprachen war, dass die Engine alt ist und viele Optimierungen enthĂ€lt, die wĂ€hrend des Wettbewerbs nicht genau wiederhergestellt werden können, um Ihre eigene Version der Physiksimulation zu erhalten.


Infolgedessen wurde der Motor, der allen Teilnehmern gleiche Bedingungen fĂŒr die Simulation von Bewegungen bieten sollte, zum schwierigsten Hindernis. Über 10 Personen konnten es ĂŒberwinden. Die ersten 7 PlĂ€tze in der Rangliste wurden ausschließlich von den Jungs belegt, die die genaue Simulation durchgefĂŒhrt haben, was als Beweis fĂŒr ihre Bedeutung in solchen Wettbewerben dienen kann.


Mit Ausnahme einiger Teilnehmer, die in der Lage waren, in das Innere des Chipmunks einzudringen und dessen Kopierzustand zu optimieren, hatte der Rest eine Simulation mit ungefĂ€hr derselben Leistung (was die Konkurrenz etwas interessanter machte, weil Sie wissen, dass der Kampf um den Entscheidungsalgorithmus geht, nicht "Wer zĂ€hlt die ZĂŒge mehr").


Algorithmus zum Suchen und Vorhersagen eines Gegners


Ab diesem Punkt beginnt eine separate Beschreibung der Lösungen. Algorithmen werden im Namen des Autors beschrieben.


Vladimir Kiselev (Valdemar) 4. Platz


Eine zufÀllige Suche (Monte Carlo) wurde verwendet, um den Lösungsraum zu durchsuchen. Der Algorithmus ist wie folgt:


  1. Wir initialisieren das Genom - eine Folge von Aktionen (links, rechts, Stopp) fĂŒr 60 Ticks - zufĂ€llige Daten.
  2. Nehmen Sie das beste gefundene Genom
  3. Ändern Sie zufĂ€llig eine der Aktionen
  4. Mit der Bewertungsfunktion erhalten wir eine Zahl - ein Indikator dafĂŒr, wie gut das neue Genom ist
  5. Wenn Sie eine bessere Lösung erhalten, aktualisieren Sie die beste Lösung.
  6. Wiederholen Sie erneut ab Schritt 2

Mein Simulator hat in 1 Sekunde ~ 100.000 Simulationen der Welt erstellt. Wenn man bedenkt, dass es durchschnittlich ~ 12 ms pro Tick gibt, erhalten wir 1200 Aktionen pro Tick. Das heißt, in 1 Tick schaffen wir es ungefĂ€hr 20 Mal, den gesamten Zyklus zu durchlaufen.


Um die optimale Lösung zu finden, reichte diese Anzahl von Iterationen eindeutig nicht aus. Daher wurde die Idee mit "Stretching" -Aktionen verwirklicht: Anstelle des Genoms von 60 ZĂŒgen werden wir mit einer Kette von 12 "gestreckten" ZĂŒgen arbeiten - wir glauben, dass jede Aktion 5 Ticks hintereinander dauert.
Plus: Um die QualitĂ€t der Mutationen zu verbessern, indem die LĂ€nge des Genoms verringert wird, kann die Simulation auch alle 5 Ticks ausgefĂŒhrt werden und 100 statt 20 Genome ĂŒberprĂŒfen (um Zeitverzögerungen zu vermeiden, habe ich schließlich bei 70 aufgehört).
Weniger: DehnungsvorgĂ€nge können zu nicht optimalen Lösungen fĂŒhren (z. B. Schwingen am StoßfĂ€nger anstelle eines stabilen Racks).


Es sind die Techniken zu beachten, die die QualitÀt des Algorithmus erheblich verbessert haben:


  • Wir fĂŒhren eine zufĂ€llige Initialisierung nur beim ersten Tick durch, den Rest der Zeit verwenden wir die beste Lösung, die mit einer Verschiebung von 1 Zug gefunden wurde (die Aktion beim 2. Tick wird zum 1. verschoben usw. Eine zufĂ€llige Aktion wird zum Ende hinzugefĂŒgt). Dies verbessert die QualitĂ€t der Suche erheblich, da der Algorithmus sonst "vergisst", was er beim letzten Tick tun wĂŒrde, und sinnlose Rucke in verschiedene Richtungen macht.
  • Zu Beginn des Kurses nehmen wir intensivere Änderungen vor (wir Ă€ndern das Genom zwei- oder dreimal anstelle von einem), in der Hoffnung, das lokale Maximum zu ĂŒberschreiten (Ähnlichkeit der Temperatur bei der Methode zur Simulation des Annealing).
    Die IntensitÀt wurde manuell ausgewÀhlt: Die ersten 30 Iterationen ergeben 3 Mutationen, die nÀchsten 10 mal 2 und dann 1.
  • Sehr wichtig ist die Vorhersage feindlicher Aktionen. Zum Nachteil der Zeit fĂŒr die Suche nach unserer eigenen Lösung starten wir eine zufĂ€llige Suche von der Seite des Gegners mit 20 Iterationen und dann 50 fĂŒr uns selbst, wobei wir Informationen ĂŒber die optimalen Bewegungen des Gegners verwenden.
    Die beste Entscheidung des Gegners wird auch im nĂ€chsten Zug mit einem Versatz wiederverwendet. Gleichzeitig wird bei der Suche nach einer Lösung fĂŒr den Feind das Genom aus dem letzten Zug als meine beabsichtigte Aktion verwendet.

WĂ€hrend des Wettbewerbs setzte er aktiv Tools fĂŒr die lokale Entwicklung ein, die es ermöglichten, schnell Fehler zu finden und sich auf die Schwachstellen der Strategie zu konzentrieren:


  • lokale Arena - Start vieler Spiele gegen die vorherige Version;
  • Visualizer fĂŒr das Debug-Verhalten;
  • Ein Skript zum Sammeln von Statistiken ĂŒber Übereinstimmungen auf der Website - ermöglicht es Ihnen zu verstehen, auf welchen Karten und Maschinen die Niederlage am hĂ€ufigsten auftritt.

Mortido:
Das ZĂ€hlen alle 5 Ticks sieht riskant aus, besonders wenn sich der Feind von den von Ihnen vorhergesagten Optionen entfernt. Andererseits ist in dieser Spielwelt fĂŒr 5 Ticks nicht viel passiert.
Außerdem habe ich bei meiner Entscheidung trotzdem bei jedem Tick zufĂ€llige Kombinationen hinzugefĂŒgt, aber ich werde definitiv nicht sagen, wie sich dies auf die Entscheidung ausgewirkt hat.

Kommandos:
Das Ändern einiger Aktionen mit einer solchen Anzahl von Simulationen sieht nicht sehr aussagekrĂ€ftig aus, da nur sehr wenige Änderungen in einer Aktion auftreten. Aber wenn Sie eine Aktion auf 5 Ticks Bedeutung ausdehnen, scheint es mehr zu werden.
Die Idee selbst gefĂ€llt mir auch nicht - wir nehmen das beste Set und versuchen, es irgendwo am Anfang zu bearbeiten. Es erscheint unlogisch, dass das Ändern der ersten Zecken die nachfolgenden zumindest relativ angemessen macht.

Alexander Kiselev (Mortido) 3. Platz


Mit Artikeln von Gewinnern anderer Wettbewerbe bewaffnet, entschied ich mich fĂŒr den genetischen Algorithmus. Es stellte sich jedoch heraus, dass es sich um eine zufĂ€llige Suche oder sogar eine Nachahmung des Temperns handelte, aber dazu spĂ€ter mehr.


Wir codieren die Lösung mit einem Array von 40 Zahlen, wobei -1, 0 und 1 den Bewegungen , und .


Zu Beginn jeder Runde berechnete ich, wie viel Zeit ich bereits fĂŒr das gesamte Spiel aufgewendet hatte, zĂ€hlte ein neues Zeitlimit basierend darauf, wie viele Runden noch vorhanden sein wĂŒrden, und jede Runde, die ich annahm, war 1200 Ticks. T.O. Anfangs habe ich versucht, nicht mehr als 11 ms pro Runde zu verbringen, aber ich könnte am Ende ein bisschen „herumlaufen“, wenn die vorherigen Runden schneller als 1200 Ticks wĂ€ren.


Valdemar:
Interessanterweise hat dieser Chip das Spiel fĂŒr mich verschlechtert. Es stellte sich heraus, dass es immer besser ist, zuerst 20 bis 30 ms als 11 und am Ende 60 ms zu verbringen

Ein Drittel dieser Zeit suchte ich nach dem besten Zug des Feindes, der Rest ging in die Berechnung meiner eigenen Entscheidung. Bei der Suche nach einem Zug fĂŒr den Feind wurde mein Verhalten als das Beste aus dem letzten Zug modelliert, verschoben um 1 Tick. Das heißt, als ob ich weiterhin nach dem Plan handeln wĂŒrde, der im letzten Tick aufgestellt wurde, und er versucht, mir zu widerstehen.


Die Suche nach der Lösung selbst war fĂŒr sich und den Gegner gleich:


  1. Wir treffen die Entscheidung aus dem letzten Zug und verschieben sie um 1 Zug (was wir bereits getan haben).
  2. Wir beweisen der Population zufĂ€lliger Lösungen, bis wir alles gefĂŒllt haben
  3. Wir simulieren alle Entscheidungen und stellen die Fitness mithilfe der Bewertungsfunktion ein. Wir erinnern uns am besten.
  4. WĂ€hrend es Zeit fĂŒr Berechnungen gibt
    1. Tipp, fĂŒgen Sie der Population immer 1 Mutation der derzeit besten Lösung hinzu. Denken Sie daran, wenn es besser ist
    2. Solange es einen Platz in der neuen Bevölkerung gibt und die Zeit fĂŒr Berechnungen nicht ĂŒberschritten wurde (Sie können auf den Boden einer bevölkerten Bevölkerung gehen)
      1. Wir nehmen zwei verschiedene Personen und gehen mit der besten Fitness - Mutter
      2. Wir nehmen zwei verschiedene Personen und gehen mit der besten Fitness - Papa (sollte nicht mit Mama zusammenfallen)
      3. Überquere sie
      4. Mutieren, wenn RND <
      5. Wir simulieren eine Lösung und erinnern uns daran, wenn es die beste ist

Infolgedessen geben wir die Reihenfolge der Aktionen zurĂŒck, die als optimal angesehen wird. Der erste Zug wird als Bot-Aktion gesendet. Leider hatte mein Plan einen gravierenden Nachteil Die Anzahl der Simulationen, die mit einem Tick durchgefĂŒhrt werden können, war sehr gering (auch aufgrund der langen Bewertungsfunktion). Auf dem Wettkampfserver wurden 4 Punkte nur einmal ausgefĂŒhrt, und fĂŒr den Feind wurden sie ĂŒberhaupt nicht ausgefĂŒhrt. Dies machte den Algorithmus eher zu einer zufĂ€lligen Suche oder einem simulierten Tempern (da wir es geschafft haben, die Lösung 1 Mal vom letzten Zug an zu mutieren). Es war schon zu spĂ€t, um etwas zu Ă€ndern, und wir konnten den 3. Platz halten.


Es ist wichtig, die Algorithmen zum Kreuzen, Mutieren und Erzeugen anfÀnglicher Zufallslösungen zu implementieren, da Es hÀngt davon ab, welche Entscheidungen getestet werden, und eine vollstÀndige zufÀllige Entscheidung ist nicht so gut, wie es auf den ersten Blick erscheinen mag (es wird funktionieren, aber es werden viel mehr Optionen benötigt).


In der endgĂŒltigen Version wurden zufĂ€llige Entscheidungen in Segmenten generiert, die "ruckelnde" Lösungen an einer Stelle ausschlossen:


  1. ZufÀlliges Team ausgewÀhlt
  2. FĂŒr die gesamte LĂ€nge der Lösung (40 ZĂŒge)
    1. Wir schreiben den aktuellen Befehl in die Zelle
    2. Mit einer Wahrscheinlichkeit von 10% Àndern wir das aktuelle Team in eine zufÀllige

Nach einer Ă€hnlichen Technologie trat auch eine Mutation auf - ein zufĂ€lliges Segment der Lösung wurde durch einen zufĂ€lligen Befehl ersetzt. Die Überquerung erfolgte durch Auswahl des Punktes, bis zu dem die Entscheidung von einem Elternteil und danach vom 2. getroffen wurde.


Mir hat gefallen, dass wir die uns zur VerfĂŒgung stehende Zeit nutzen, um die beste Lösung zu finden. Es ist keine große Sache, wenn die Lösung nicht die beste ist - wir können sie beim nĂ€chsten Tick verbessern, weil Die Optimierung stellt sich als zeitlich "verschwommen" heraus. , . , - , . ,


Valdemar:
1 , , .

Commandos:
— - .
— , . , 
 , . " ”. -.

(Commandos) 1


( ), n m . 3^2=9 . m + n 40 .


:


 |----------- n  -----------|---------- m  --------| |   ...   |   ...   | 

: , , . ( ).


n m , . , .


:


  1. , ( , ):
    • , , , .
    • , , . . . , , , .
    • . ; ( ).
  2. n m . , .1, , . - ( ) , — , ;
  3. . , — . , ( ).

Valdemar:
, 2 . . , .

mortido:
Wow! , . . , 2 , 40-60 . , 3 .
n + m == const ?

. n + m != const , . , . - .



(Valdemar) 4


, . , ( , , ..) [0..1].
. : , .
, , : , .


, :


  • — 70 180 ( : ).
    , .
  • 0..500
  • — [2pi, pi/4] [0, 1]
  • — , ( ), ( , , )
  • — , , , .
    , , .
  • — . .
  • Y — .

, 2 , .


.


:


  • “” ,
  • “ ” , , .

mortido:
, .. , .

Commandos:
, . -

(mortido) 3


, chipmunk. . , , , , . .


3 .


, ( , , ):


  • . , , ( , );
  • , — , ; , 1 ;
  • ;
  • ( , );
  • ( “+”, “-”);
    - ( “+”, “-”); , , , ;
    30 , , ( );
  • , .

, , (, , )


Valdemar:
. , “ , , ” , ( ..) .

, , . .


Commandos:
, , “”
 ? , “” .

(Commandos) 1


SquaredWheelsBuggy , .. , . Buggy , , ( /).
Kurz:


  1. ;
  2. ; — , , 1 0; .. ;
  3. . ; 10 ( );
  4. ( , );
  5. (, );
  6. — - , ;
  7. / ; , — ; .

1-5 , . 2 “ ”.


Valdemar:
, . , .

mortido:
, 10 .

IF'


(Valdemar) 4


, if'. 3 , , . , , -.
: , “” — , - , ( , ) — .


:


  • . , .
  • — , .
  • . “ ” .
    , , .
    , , .

, : . , , if' .


mortido:
, . .

Commandos:
if'. , , 
 , , .

(mortido) 3


- .


3 . . . “”, . , , .


, “” . . , , , - . . , , .. .


, , , , , . 
 . - — , ( , ).


Valdemar:
, . . “” , if'. , — .

, + . , .


Commandos:

 , - — , , . , , .

(Commandos) 1


. (, , ). ( ) /.


pill carcass map , , ( ). island map, , .


island hole buggy. / , , ( ). — . , , . SquaredWheelBuggy . , , , . , 
 , , .


(Pill map, Bus) , ( / 100% ).


pill hubble map. , ( ), . .


— , ...


, . , . ( ).


Valdemar:
, — . , .

mortido:
, “” .


Valdemar:
. , . ( ) .
. “”, , , , :)
, mailru , .

mortido:
: , 
 , , ( ). , 3 , , 
 .

Commandos:
- , . , , , . 
 . — , .
— ++. . , . 1 -.

Also


, . , . , , .


Mail.Ru Group .


Bonus


Valdemar
mortido


,







Source: https://habr.com/ru/post/de430466/


All Articles