KI implementieren, um sich hinter Hindernissen zu verstecken

7

Ich entwickle eine KI-Simulation von Raubtier und Beute. Ich möchte die KI simulieren, die sich hinter Hindernissen versteckt, wenn sie verfolgt wird. Aber ich versuche immer noch herauszufinden, wie ich dies am besten umsetzen kann.

Ich dachte daran, zu überprüfen, auf welcher Seite des Hindernisses sich das Raubtier befindet, und zu versuchen, auf die andere Seite zu gelangen. Verwenden Sie möglicherweise den A * -Pfadfindungsalgorithmus, um sicherzustellen, dass er über den kürzesten Pfad dorthin gelangt.

Der Hauptgrund, warum ich schreibe, ist der Fall, dass jemand mich in die richtige Richtung weisen kann, um dies umzusetzen (vielleicht hat es schon jemand getan) oder andere gute Ideen hat, wie ich es umsetzen kann. Ich habe so etwas noch nie zuvor gemacht, um KI zu programmieren oder ein Spiel zu machen.

Alle Hindernisse sind entweder horizontale oder vertikale Quadrate / Rechtecke.

Zusätzliche Informationen: Die Karte basiert auf x- und y-Positionen, wobei sich jeder Agent mit einer festgelegten Geschwindigkeit bewegt. Daher ist die Karte nicht vollständig kachelbasiert, auch aus diesem Grund bin ich mir nicht sicher, ob A * in dieser Situation für mich tatsächlich funktionieren würde.

Hier ist ein Bild der Situation:

Geben Sie hier die Bildbeschreibung ein

Bitte beachten Sie auch, dass der rote Kreis das Raubtier ist, während der grüne Kreis die Beute ist, die vom Raubtier verfolgt wird.

Tohmas
quelle
2
Basiert Ihre Hinderniskarte auf Kacheln?
Anko
1
Ähm, es basiert auf X- und Y-Koordinaten, nicht nur auf Kacheln. Jeder Agent ändert die x- und y-Position entsprechend seiner Geschwindigkeit.
Tohmas

Antworten:

3

Sie können diese Art von Verhalten jedem Pfadfindungsalgorithmus hinzufügen, indem Sie einfach die heuristische Funktion anpassen. Eine typische Heuristik für die Wegfindung basiert nur auf der Entfernung zum Ziel. Sie können jedoch eine Schätzung der Gefährlichkeit eines bestimmten Punkts berücksichtigen:

// Typical heuristic function, lower values are better
float Heuristic(Vector position, Vector goal)
{
    return (goal - position).Length();
}



// New heuristic function
float Heuristic(Vector position, Vector goal)
{
    float value = (goal - position).Length();

    if(TestLineOfSight(enemy, position))
    {
        value += enemy.Level * 100.0f; // Higher-level enemies are more dangerous
    }

    // You can also add factors like environmental hazards, etc.

    return value;
}

Diese neue Heuristik lässt Ihre Schauspieler versuchen, Bereiche zu finden, die sie als gefährlich empfinden. Diese Technik ist wirklich großartig, da sie mit jedem heuristischen Pfadfindungsalgorithmus funktioniert.

Hinweis: Pfadfindungsalgorithmen wie A * müssen möglicherweise ein wenig angepasst werden, damit der Algorithmus zurückverfolgen kann, falls er auf einen Bereich stößt, der zum Überqueren als zu gefährlich eingestuft wird.

jmegaffin
quelle
1

Sie können die Beute mithilfe eines Algotithmus bestimmen lassen, dass der Predator sie zu einem bestimmten Zeitpunkt nicht direkt "sieht", wenn sie sich hinter einem Hindernis versteckt.

So könnte es gemacht werden:

  1. Beute findet ein Hindernis.
  2. Um festzustellen, ob das Hindernis zum Verstecken verwendet werden kann, erstellt die Beute eine Liste möglicher Stellen, an denen sie um das gefundene Hindernis herum stehen kann.
  3. Für jeden dieser Punkte zeichnet die Beute eine Linie vom Raubtier zu sich selbst. Sobald es eine Linie findet, die dieses Hindernis kreuzt, bedeutet dies, dass das Hindernis zwischen ihnen im Weg steht. Dann fand die Beute ein Versteck.

Dann bewegen Sie die Beute an diesen Ort.

Bearbeiten: Dies bedeutet, dass Sie eine kachelbasierte Karte verwenden.

Lucas Tulio
quelle
2
Die Einschränkung: Es gibt unendlich viele Stellen, um ein Hindernis herum zu stehen. Wenn Sie eine Stichprobe erstellen, verpassen Sie möglicherweise potenzielle gute Stellen zwischen Ihren Stichprobenwerten.
Anko
1
Ich nahm an, dass es sich um eine kachelbasierte Karte handelte. In diesem Fall gibt es nur wenige mögliche Stellen, so dass es einfach ist, sie schnell zu testen.
Lucas Tulio
Das stimmt. Der Fragesteller hat nicht sicher angegeben, aber da er A * verwendet, scheint es wahrscheinlich, dass es sich um eine Tilemap handelt, und daher würde dies funktionieren.
Anko
1
Tut mir leid, die Karte basiert auf der X-, Y-Achse, also nicht vollständig auf Kacheln. Aus diesem Grund war ich mir auch nicht sicher, ob ich einen A * -Algorithmus mit dieser Art von Karte zum Laufen bringen könnte.
Tohmas
0

Sie können dies als Max / Min-Baum behandeln. Das Ziel wäre es, die "Sichtbarkeit" des Raubtiers zu minimieren. Sie können Werte wie folgt berechnen:

  • Predators direkte Linie / Sichtweite: 100
  • Offene Gebiete, aber nicht in Sichtweite des Raubtiers: 50
  • Aus Sicht des Raubtiers nicht sichtbar: 0

In diesem Fall ist es ein einfacheres Problem, "den nächstbesten Zug zu wählen". Das würde bedeuten, der nächste Schritt, der Sie in einen Bereich ohne Sichtbarkeit führt.

Asche999
quelle
0

Für das nächste Hindernis ist das beides ...

  1. Lang oder breit genug, um sich dahinter zu verstecken.
  2. Weiter vom Raubtier entfernt als von dir.

Sehen Sie, ob Sie vom Raubtier auf die andere Seite des Hindernisses gelangen können. Gerade:

xPosToGoTowards = (2 * xPos_Obstacle) - xPos_Predator
yPosToGoTowards = (2 * yPos_Obstacle) - yPos_Predator

Wenn Sie nicht dorthin gelangen , kann in die Dinge , ohne zu stoßen, überprüfen Sie die nächste am nächsten Hindernis. Das erste Hindernis könnte den Test später nach etwas mehr Laufen bestehen, aber es wird die KI auch interessanter halten, wenn es sich nicht immer hinter dem nächsten Hindernis versteckt.

Es gibt weitaus ausgeklügeltere Lösungen, aber das ist eine schlechte Sache, wenn Sie sie nicht brauchen. Einfach ist gut.

Mike Howard
quelle