¿Cómo construir una "IA de tráfico"?

21

Un proyecto en el que estoy trabajando ahora presenta una gran cantidad de "tráfico" en el sentido de que los automóviles se mueven a lo largo de las carreteras, los aviones se mueven alrededor de una plataforma, etc.

A partir de ahora, las rutas disponibles se calculan previamente, por lo que los nodos se generan automáticamente para los cruces que están interconectados por bordes. Cuando un personaje / agente aparece en el mundo, comienza en algún nodo y encuentra un camino hacia un nodo objetivo mediante un algoritmo simplemente A *. El agente sigue el camino y finalmente llega a su destino. No hay problema hasta ahora.

Ahora necesito habilitar a los agentes para evitar colisiones y manejar situaciones de tráfico complejas. Como soy nuevo en el campo de la IA, busqué varios artículos / artículos sobre el comportamiento de la dirección, pero descubrí que tenían un nivel demasiado bajo. Mi problema consiste menos en evitar la colisión real (que es bastante simple en este caso porque los agentes siguen caminos estrictamente definidos), sino en situaciones en las que un agente deja un callejón sin salida mientras que otro quiere entrar exactamente en el mismo. O dos agentes que se encuentran en un cuello de botella que solo permite que pase un agente a la vez, pero ambos necesitan pasarlo (de acuerdo con la ruta óptima encontrada antes) y necesitan encontrar una manera de dejar que el otro pase primero. Básicamente, el aspecto principal del problema sería predecir el movimiento del tráfico para evitar bloqueos muertos.

Difícil de describir, pero supongo que entiendes lo que quiero decir. ¿Tiene alguna recomendación para mí sobre dónde comenzar a buscar? ¿Algún trabajo, proyectos de muestra o cosas similares que puedan ayudarme a comenzar?

¡Aprecio tu ayuda!

Lunikon
fuente
La difusión colaborativa puede ayudarlo con algo. Es una forma sencilla de resolver la búsqueda de rutas para múltiples agentes al mismo tiempo + agentes evitándose a sí mismos. Por favor, comparta su experiencia con él en algún lugar, gracias. ;)
user712092

Respuestas:

12

Hay tantas maneras de abordar este problema que me costaría dar una respuesta decente y completa aquí. Pero aquí hay algunos puntos de diseño de alto nivel.

  • Estás construyendo una simulación de agente aquí. Pathfinding es simplemente una entrada en el sistema: el agente tiene un objetivo, y la búsqueda de ruta es solo una forma de lograr ese objetivo. En realidad, al pensarlo en términos reales, el agente tiene dos objetivos: el objetivo principal del conductor es "no chocar", en segundo lugar, "llegar a donde quiero ir".
  • Sus sistemas deben basarse en paralelos del mundo real. La razón por la cual la mayoría de las carreteras tienen dos o más carriles es porque es mucho más fácil organizar el tráfico con ese sistema, nadie tiene que pensar mucho. En un escenario de un solo carril, los conductores tienen que resolver varios problemas:

    detección : reconocer que usted y el automóvil que se aproxima chocará a menos que se eviten mutuamente

    reacción : desaceleración y entrar en una fase de negociación.

    negociación : uno de los conductores tiene que tomar la iniciativa, el otro tiene que ceder. Las reglas sobre cómo decidir esto son vagas, pero básicamente quieres algo en el que un conductor arbitrariamente (o basado en una heurística sobre cuántos autos vienen en la otra dirección) decide tener prioridad. Por ejemplo, A tiene prioridad en el momento 1, B ve que A tiene prioridad y cede (al apartarse y detenerse). Si tanto A como B intentan tener prioridad, ambos deberían detenerse, esperar una cantidad de tiempo aleatoria (o señalizarse mutuamente) e intentar nuevamente. Finalmente, uno cederá al otro.

    La belleza de esta implementación es que evita la necesidad de mantener colas artificiales u otras construcciones falsas. La negociación se realiza en términos de percepciones del mundo real: una vez que ambas partes están en la fase de negociación, cualquier avance significativo se detecta fácilmente como un intento de tener prioridad. También debe reaccionar adecuadamente al usuario, que probablemente no se adhiera a las buenas reglas de manejo.

  • Asume lo peor. Incluso en un sistema perfecto, pueden surgir situaciones extrañas y sus actores deben actuar con sensatez. Esto es aún más probable si el jugador puede interferir (bloquear artificialmente áreas, etc.) A menudo, detenerse por completo es la única respuesta sensata (¡bloqueo!) Girar en el lugar o obviamente estar en un estado roto es una falla de la IA. Parar por completo es al menos plausible en términos del mundo real.

    Cuanto más modeles la IA de tu actor en una lógica simple del mundo real, más fácil será crear una IA convincente. Las personas reales no se detienen ni oscilan hacia adelante y hacia atrás si no pueden alcanzar su objetivo. Si el único camino hacia el destino de la IA está bloqueado, deberían reconocerlo y elegir una respuesta (detenerse por completo, darse por vencido y conducir a casa, darse por vencido y conducir a otro lugar).

  • Capa de comportamientos para obtener lo que quieres. Recuerde, el primer objetivo es no chocar. Por lo tanto, la lógica de evitación (dirección) siempre debe dominar las acciones del conductor. Encima de eso, la lógica direccional que viene de la búsqueda de ruta ('Quiero girar a la derecha en el próximo cruce'). Capa encima de esa reevaluación ocasional de rutas, con lógica de nivel superior ('prefiero seguir adelante, pero si no puedo avanzar, permitir una nueva ruta que implique un cambio de sentido').

  • La búsqueda de caminos proviene de la memoria, pero la conciencia situacional se basa en la percepción. No intentes hacer que tus agentes sean perfectos. Conocen el camino desde su casa hasta la oficina, así que saben qué turnos hacer. Pero no saben que la calle a 2 millas de distancia está bloqueada. No intente hacer que sus agentes tracen un camino perfecto, porque no hay ninguno, incluso si comienza perfecto, otros factores pueden bloquear su camino. Los agentes solo deberían planear unas pocas calles con anticipación hacia dónde van.

  • Calidad de la información. Sus comportamientos deben ser simples, pero para lograrlo necesita una buena funcionalidad de consulta. Debe poder hacer preguntas sobre su entorno como "¿ese automóvil que se aproxima ocupa mi carril?", "¿Cuántos automóviles se aproximan?", "¿Hay algún automóvil detrás de mí", "¿puedo hacer un cambio de sentido" .

MrCranky
fuente
Gracias por tu elaborada respuesta. Su consejo debería ser realmente útil cuando llegue al tráfico regular. Pero probablemente no noté dos aspectos importantes en mi publicación inicial: 1. El jugador no participa en el tráfico por sí mismo. Es más como un simulador de negocios y él construye la red. 2. Las rutas unidireccionales ocurren especialmente en los aeropuertos, pero en los aeropuertos los agentes no están "en sí mismos" sino que tienen una torre que les dice a dónde ir. La torre tiene que identificar las situaciones difíciles, pero también tiene un conocimiento total, así que supongo que está una capa por encima de las situaciones / comportamiento que describiste.
Lunikon
5

Habiendo visto algunas fallas horribles en los juegos lanzados, tengo un par de sugerencias:

1) A menos que haya una buena razón, de lo contrario, haga dos carriles y, para fines de inteligencia artificial, haga que tengan prioridad para una dirección de flujo normal: permita un viaje de dos en dos, pero si algo viene hacia el otro lado, el tipo en el lado equivocado de la carretera siempre cede ante ello.

2) Algún tipo de lógica para desenrollar un embotellamiento si ocurre. He observado situaciones en las que el manejo del atasco de tráfico solo se aplicaba a los vehículos que intentaban chocar entre sí, pero fallaban por completo cuando se enfrentaban a un patrón -> -> <- <-. Recuerdo un mapa que era propenso a esto: era un punto de estrangulamiento destinado a hacer que la base de IA fuera más difícil de atacar, pero tarde o temprano entrarían dos recolectores de recursos mientras un grupo de ataque salía y eso fue todo. Las unidades en contacto girarían intentando encontrar una ruta pero no tenían movimientos legales. No retrocedió y descubrió que alguna otra unidad tenía que moverse primero, y por lo tanto, la IA no realizó acciones útiles hasta que se eliminó el obstáculo. (Podrías ver a las unidades en contacto girar y nada más hacer nada).

Creo que esto podría resolverse haciendo que una unidad atascada le diga a las unidades vecinas que se salgan del camino; esto se propagaría hasta que llegara a una unidad despegada que pudiera retroceder. Esto debería involucrar algún tipo de lógica para mantenerlos alejados hasta que se solucione el problema.

Tenga en cuenta que simplemente buscar una ruta alternativa suele ser una mala respuesta. He visto una situación de bloqueo en vivo de ese tipo: la unidad A observa que B está bloqueando el camino más adelante y, por lo tanto, se da vuelta para usar una ruta diferente. Esto ahora bloquea el camino para B que se da vuelta, ahora el camino está desbloqueado, por lo que ambos dan la vuelta nuevamente. Cada turno alternan entre avanzar y retroceder.

El mismo juego que he visto es una versión diferente, también debido a la niebla de la guerra. Había una unidad enemiga en un punto de estrangulamiento. En el movimiento automático, la búsqueda de caminos no pelearía a menos que en realidad apunte a la unidad enemiga. Avanzaría y vería que el camino estaba bloqueado. Luego retrocedió, ya no podía ver el bloqueador y avanzaría nuevamente. Repita hasta que el humano se dio cuenta de que no estaba llegando a donde se suponía que debía ir.

Loren Pechtel
fuente
2
Buena respuesta: me gusta la idea de transmitir mensajes "atascados" para que cualquiera que pueda salir lo haga.
MrCranky
4

No tengo mucha experiencia en simulaciones de tráfico, pero me vienen a la mente algunas cosas.

En primer lugar, para evitar cuellos de botella en primer lugar, tendría dos carriles que permiten que los vehículos viajen en direcciones opuestas. en el mismo "camino".

En segundo lugar, para las colisiones que pueden ocurrir, debe tener un comportamiento de dirección para evitar colisiones para evitar una acumulación masiva. Los comportamientos de dirección pueden ser de bajo nivel, pero son muy útiles para crear comportamientos emergentes de aspecto realista.

Si no desea tener más de un carril, tendrá que almacenar más información en el gráfico. Por ejemplo, si el agente A va por un camino (representado como un borde gráfico) y el agente B está en la misma carretera que se mueve en la dirección opuesta a A continuación, se hará chocan / punto muerto / lo que sea que haya codificado para hacer frente a este comportamiento.

Sin embargo, si el agente A está en una carretera, podría solicitar la propiedad de esa carretera. Ser propietario del camino significaría que ningún otro agente puede viajar a lo largo de ese borde (puede hacer esto simplemente cambiando el costo del borde a un número masivo para asegurarse de que A * no elija el camino al calcular un camino). Luego, cuando el agente A está libre de ese camino, renuncia a la propiedad.

Honestamente, es una solución hacky que no me gusta especialmente y la mayoría de las simulaciones de tráfico (¿si no todas?) Que he visto utilizan un enfoque de varios carriles.

Ray Dey
fuente
Sí, se deben usar dos carriles (porque simplemente hay dos carriles), pero eso no resuelve ningún problema relacionado con ceder el paso (que son la mayoría de los problemas que describió el autor de la pregunta)
Bart van Heukelom
4

Dijiste que buscaste varios artículos sobre el comportamiento de la dirección, aunque por si acaso, ¿has buscado el siguiente?

http://www.red3d.com/cwr/steer/

De lo contrario, podría proporcionarle algunas respuestas, ya que cubre algunos de los problemas que mencionó, por ejemplo, el problema del cuello de botella (Cola).

Tiroteo
fuente
0

Creo que lo que debe hacer es implementar un algoritmo de búsqueda de ruta.

Divida su mapa en partes tan pequeñas como pueda (digamos cuadrados) pero solo para lugares válidos para el tráfico. Luego determinará dónde está el vehículo y hacia dónde va, y encontrará un camino, el más corto o el más directo, tal vez. El camino será un conjunto de cuadrados, cada paso del camino a la destilación. Entonces, lo que querría es calcular no solo la posición actual de todos los vehículos, sino también las posiciones futuras de los vehículos para un par de pasos en el futuro. Si dos vehículos van a estar en la misma casilla en el futuro, entonces debe cambiar la velocidad de uno o de ambos.

A * (Una estrella) es un algoritmo de búsqueda de ruta muy simple que probablemente pueda traducir fácilmente el código psuedo en wikipedia a su idioma de elección y funcionará: http://en.wikipedia.org/wiki/A*_search_algorithm

justin.m.comprar
fuente
44
Como mencioné en mi publicación inicial, ya implementé un algoritmo A * y también tengo estructuras de datos coincidentes. Además, solo reducir la velocidad de cualquiera de los agentes me suena demasiado "fácil".
Lunikon 01 de
Este no es un problema de búsqueda de ruta, es un problema de simulación de agente. La búsqueda de caminos es solo el nivel más bajo de inteligencia que los actores necesitan aplicar.
MrCranky
¿Demasiado fácil? jaja. ¡Bueno, eso es lo que hago cuando conduzco! Si puedo predecir una colisión con mi trayectoria actual, cambio mi velocidad.
justin
¿Y los semáforos? ¿Y qué hacer cuando su camino está bloqueado por otro vehículo? Qué hacer cuando su camino dice avanzar, pero su velocidad es cero para evitar una colisión. ¿Una colisión con otro automóvil, cuyo camino dice avanzar (a través de usted), y su velocidad también es cero?
MrCranky
En un escenario de un solo carril, si usa la velocidad de los otros automóviles para calcular sus destinos futuros cuando el primer automóvil detecta la colisión y se detiene, el otro automóvil no necesitará detenerse, ya que la velocidad de los primeros automóviles ahora es 0. Esto supone que usted Podrá mirar con suficiente anticipación a tiempo para ver colisiones con automóviles por largas carreteras de un solo carril. Un amigo mío sugiere que agregue un nodo STOP en su algoritmo A * también. Con eso desde la perspectiva de cualquier automóvil solo consideraría que otros automóviles son un obstáculo. Detener puede desbloquear su camino si se hace el tiempo suficiente.
justin
0

Cuando implementé Enemy Nations, mi último inconveniente fue que si un vehículo estaba atascado por más de 2 segundos, lo adelanté en su camino. Entonces, cuando se atascaron, una unidad básicamente fue transportada. Nadie se quejó, así que imagino las pocas veces que sucedió que nadie estaba mirando y no lo vio.

David Thielen
fuente