Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LInsoDeTeh

Treue Seele

  • »LInsoDeTeh« ist der Autor dieses Themas

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

1

10.12.2012, 19:51

Gegner-KI mit Schwarmintelligenz?

Hi Leute!
Also so langsam muss ich mich für mein Projekt mal mit den PvE Quests beschäftigen, wo es darum geht, die Gegner innerhalb eines Sektors zu vernichten, bzw. zu überleben. Jetzt sollen die Gegner aber natürlich nicht willkürlich herumfliegen, sondern halbwegs intelligent angreifen (Flottenformationen oder Taktik sind dazu allerdings nicht nötig).

Folgende Randparameter habe ich dazu: Ein Kampf findet immer in einem begrenzten Sektor statt, der eine Teilmenge des 2-dimensionalen reellen Raums ist, mit x- und y-Werten zwischen 0 und 360, also
§\{(x,y)|x,y\in[0,360]\}\subset R^2§
Die Spielerschiffe starten zwar recht zentral, können aber bewegt werden. Die Piratenschiffe (beliebige Anzahl) starten an zufälligen Positionen des Sektors. Diese sollen jetzt die Spielerschiffe angreifen, am besten in Gruppen, aber nicht unbedingt an Spielerschiffen vorbeifliegen, um ein anderes anzugreifen, und so evtl kampflos abgeschossen werden...

Da dachte ich an eine etwas vereinfachte Form des Glühwürmchenalgorithmus aus der Schwarmintelligenz, der ja vom Prinzip ähnlich funktioniert. Hier nochmal eine kurze anschauliche Zusammenfassung:

Zitat

Beim Glühwürmchenalgorithmus werden die Glühwürmchen zufällig im Raum platziert. Dabei hat jedes Glühwürmchen eine bestimmte Helligkeit, die vom Ort des Würmchens abhängt. Die Helligkeit steht hier stellvertretend für einen Wert einer Optimierungsfunktion über dem Raum. In jeder Iteration wird jedes Glühwürmchen mit jedem anderen verglichen und das dunklere der beiden bewegt sich einen Schritt auf das hellere zu (sprich, das Würmchen, das den schlechteren Wert hat, nähert sich dem mit dem besseren Wert an), plus einer Zufallskomponente in der Bewegung. Auf diese Weise bilden sich nach mehreren Durchläufen kleine Grüppchen um die lokalen Maxima der Optimierungsfunktion, und im Idealfall irgendwann eine große Gruppe am globalen Maximum. Bis auf die Optimierungsfunktion (sprich, welchen (Helligkeits-)Wert sie an welcher Stelle des Raums haben), haben die Glühwürmchen also keine globalen Informationen, sondern arbeiten nur mit Vergleichswerten untereinander -> Schwarmintelligenz


Wenn ich so ansetze, dass ich die Piratenschiffe als die Glühwürmchen nehme und die Spielerschiffe als lokale Maxima betrachte, sollten die Piratenschiffe Grüppchen in der Nähe der Spielerschiffe bilden. In dem Moment, wo ein Schiff ein lokales Maximum erreicht hat, also in einen Kampf verwickelt ist, würde ich es aus der Schleife rausnehmen und sich nicht mehr weiter bewegen lassen, bis das Ziel (und damit das Maxium) vernichtet wurde. Auf diese Weise müsste ich erreichen, dass die Schiffe immer zu den Spielern fliegen und wenn sie eines vernichtet haben, weiter zum nächstbesten (also dem Punkt, wo das nächsthellste Glühwürmchen ist) fliegen.

So weit die Theorie. Dazu ergeben sich ein paar Fragen:
1. Was haltet ihr von der Idee, ist diese tauglich? Ich brauche wie gesagt keine Taktiken/Schlachtpläne/Formationen, sondern lediglich ein halbwegs sinnvolles/intelligentes Verhalten der Einzelschiffe
2. Welche Lücken könnten entstehen, die zu dummem Verhalten führen?
3. Wie baue ich die Optimierungsfunktion auf? Angenommen, die Funktion hat im Raum überall den Wert 0 und bei den Spielerschiffen z.B. 1 oder ein Wert, der von der Stärke des Schiffes abhängt. Wie kann ich da am Besten eine glatte (wobei stetig eigtl auch reicht) Funktion aufstellen, die diese lokalen Maxima hat und um diese Maxima herum ein Gefälle in alle Richtungen hat, und welchen Radius für das Gefälle nehm ich da wohl am sinnvollsten? Ich brauche ja ein Gefälle, damit die Glühwürmchen unterschiedlich hell sind, das wäre ja sonst nur gegeben, wenn sie sich direkt auf dem gegnerischen Schiff befinden...
4. Wie kann ich den Aufbau dieser Funktion so gestalten, dass er bei jedem Durchlauf des Algorithmus recheneffizient durchgeführt werden kann?

Any Comments? :) Frei zum Philosophieren ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »LInsoDeTeh« (10.12.2012, 20:06)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

11.12.2012, 03:28

Die Frage ist, ob das nicht viel zu aufwendig ist. Wie viele Spielerschiffe wird es denn geben? Einfacher wäre es vermutlich wenn sich jedes Piratenschiff dem nächstgelegenen Spielerschiff nähert und dann einfach angreift. Wenn es viele Schiffe geben sollte, könntest du diese zu Gruppen zusammenfassen. Je nachdem wie du den Raum einteilst, kannst du dann darauf effizient das nächstgelegene Spielerschiff ausfindig machen. Ist einfacher zu implementieren und je nach Implementierung vielleicht sogar effizienter.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

11.12.2012, 11:39

Hört sich für mich nicht sonderlich tauglich an.
So wie es aussieht, ist das Spielerschiff das einzige maximum, andere, lokale gibt es nicht. Das bedeutet, dass im Prinzip alle Gegnerischen Schiffe direkt auf den Spieler zufliegen, oder aber, wenn alle von einer Seite kommen, irgendwo vor dem Spieler stehen bleiben werden, weil derjenige Gegner, der am nächsten dran ist, sich nie in Richtung Spieler bewegen wird.
Außerdem ist dieses "jeder mit jedem" vergleichen ziemlich quadratisch, weswegen du mit ausreichend vielen Gegnern absolut jeden PC in die Knie zwingen wirst.

Aber zu Sachwarmintelligenz gab es doch noch ein paar andere Modelle. Genau erinnere ich mich nicht mehr, aber es hatte was damit zu tun, das man sich immer in Richtung des Zentrums der Gruppe bewegt, dabei aber einen gewissen Mindestabstand beibehält. Wenn jetzt jeder Gegner nur sein lokales Umfeld betrachtet, bist du einerseits bei passender Optimierungsstruktur die quadratische Laufzeit los und andererseits, werden sich kleinere Grüppchen von Gegnern zusammen finden. Dieser Schwarm muss dann nur noch als dritte Bedingung irgendeinem Angriffsmuster folgen.
Lustig wird es natürlich, wenn sich 2 Schwärme treffen, da diese sich dann vermutlich zusammentun werden, aber vielleicht auch durch extreme Manöver wieder voneinander getrennt werden können.
Lieber dumm fragen, als dumm bleiben!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

11.12.2012, 11:44

Ist ein nicht ganz einfaches Thema. Im Prinzip geht das in Richtung steering behaviour bzw potenzialfeldansatz. Beim Steering wird mit den Kräften gerechnet, werden beim Potenzialfeld der Raum in diskrete Punkte unterteilt und einen Wert zugewiesen werden kann. Rein formal sind die beiden Ansätze äquivalent (Steering = Gradient vom Potenzial), aber beim Potenzial hat man ein n * d^2 (oder bei drei dimensionen d^3) Problem (wenn man Diskretisierung Potenziale nutzt so wie ich das tat) während man beim Steering hauptsächlich paarweise Kräfte berücksichtigt (n^2). Lässt man das mit der Diskretisierung sein, dann hat man bei beiden n^2 oder aber wenn man größe Räume+ space partition hat, einen konstanten Wert = Anzahl Nachbarn in einem Sektor.
Aber ein Potenzialfeldansatz ist zumindest für mich irgendwie anschaulicher vorallem auch leichter zu debuggen (per Visualisierung - colormap). Man muss nur für jedes Potenzial eine analytische Beschreibung finden :rolleyes: (oder aber etwas ähnlich den EAM und TERSOFF der Physiker).
Was damit z.B. möglich ist, ist dass man für Feind innerhalb verbündete Feuerkraft im Gebiet ein attraktives Potenzial hat und für gegnerische Feuerkraft ein repulsives. Das sorgt dafür das Gegner gemieden werden solange bis genug eigene Feuerkraft vorhanden ist. Wenn man das noch mit einem "flachen Ring" (maxican hat potential) für verbündete Einheiten versieht, dann werden Verbündete die gegenseitige Nähe suchen, aber nie zu dicht zusammenhängen und sobald sie auf Feinde stoßen entsprechend der Feuerkraftverhältnisse angreifen oder fliehen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nox« (11.12.2012, 11:50)


5

11.12.2012, 12:24

@Nox: Rein aus Interesse: Hast du irgendwas in die Richtung gemacht, was du zeigen könntest? Speziell die Möglichkeiten im letztem Abschnitt hören sich ganz interessant an.
Lieber dumm fragen, als dumm bleiben!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

11.12.2012, 12:38

Dazu steht in folgendem Buch ein netter Artikel. Geht dabei um eine KI für ein Strategiespiel und mögliche Positionierungen für Einheiten. An sich eignen sich Steering Behaviours für das Problem wirklich gut. Sie sind leicht umzusetzen und durch die Kombination untereinander kann man wirklich schöne Ergebnisse erreichen. Wenn man die KI dann noch erweitert durch einen Zustandsautomaten bzw ein Zielgetriebenes System, kann man damit recht einfach super Ergebnisse schaffen. Dadurch kann man eben genau dieses Teamverhalten schön schaffen. Und ich glaube nicht dass sich ein Potentialfeld im dreidimensionalen Raum schön visualisieren lässt. Ich würde mir einfach mal aufschreiben was du erreichen möchtest. Danach überlegst du dir mit welcher Technik du das am schönsten lösen kannst. Vielleicht macht es Sinn sich ein paar Papers oder ein Buch zu dem Thema anzusehen und dann zu entscheiden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

12.12.2012, 17:08

Ich habe mal nen diskretisierten Ansatz implementiert ( http://sourceforge.net/projects/potentia…ource=directory ), was aber heillos zulangsam ist. Daher ist es ein Beispiel dafür wie man es nicht machen sollte ;) . Aber wenn ich mal Zeit habe gehe ich vielleicht nochmal ran und implementiere den deskriptiven/analytischen Potenzialansatz.
Aber das mit der Visualisierung klappt zumindest in 2D sehr gut, weil man direkt die verschiedenen Potenzialeinflüsse oder aber die Kombination sehen und nachvollziehen, welche Bereiche für die KI als interessant gelten.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

LInsoDeTeh

Treue Seele

  • »LInsoDeTeh« ist der Autor dieses Themas

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

8

13.12.2012, 10:16

Also nochmal zu den Randparametern:
Es werden so 3-5 Spielerschiffe sein und maximal 20 Piratenschiffe. Klar ist der Algorithmus quadratisch in der Laufzeit, aber da die Schiffe ja gerade mal 25 sind und dann ja auch immer weniger werden, sollte das doch eigtl. möglich sein. Zumal der Algorithmus ja nur ein paar wenige Berechnungen macht (Abstände, Anziehungskraft, Repositionierung). Und er muss ja nicht in jedem Frame aufgerufen werden, das reicht ja auch z.B. 1x die Sekunde, wenn man den Sektor z.B. rastert, sprich auf ganze Zahlen reduziert. Das dürfte bei der Größe der Schiffe bei weitem präzise genug sein.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

9

13.12.2012, 12:41

Und warum vergleichst du nicht einfach die Abstände zwischen den Piratenschiffen mit den Spielerschiffen und wählst dann das am nächsten liegende Schiff als Ziel? Du musst daran denken, dass du nächste Woche ein weiteres Feature in die KI einbauen möchtest und danach die Woche noch zwei weitere und so geht das dann weiter und je aufwendiger du deine KI gestaltest, umso aufwendiger kann das einbauen weiterer Features werden. Die Abstandsmessung ist in wenigen Zeilen implementiert. Der bionische Ansatz dürfte da etwas mehr in Anspruch nehmen. Schneller wirst du mit deinem Ansatz auch nicht sein.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

10

13.12.2012, 23:43

Das sieht sehr nach Flocking(deutsch, Seite zum Paper) aus. In deinem Fall käme dann wohl noch eine Regel dazu, die deine Piraten in Richtung von Spielern(zum nächsten?) lenkt.

Werbeanzeige