Pregunta

Tengo una simulación escrito en C ++ en el que tengo que mantener un número variable de agentes, y estoy teniendo problemas para decidir cómo implementar bien. Cada agente se ve algo similar a:

class Agent{
public:
    Vector2f pos;
    float health;
    float data[DATASIZE];
    vector<Rule> rules;
}

Tengo que mantener un número variable de agentes en mi simulación de tal manera que:

  1. Preferiblemente, no hay límite superior en el número de agentes
  2. puedo añadir fácilmente un agente
  3. Me puede quitar fácilmente cualquier agente bajo alguna condición (por ejemplo la salud <0)
  4. Me puede fácilmente iterar todos los agentes y hacer algo (por ejemplo la salud -)
  5. Preferiblemente, I puede paralelizar el trabajo usando OpenMP, porque muchas actualizaciones son algo costoso, pero completamente independiente de otros agentes.
  6. (editar) el orden de los agentes no importa en absoluto

¿Qué tipo de recipiente o principios de diseño se debe utilizar para los agentes? Hasta ahora yo estaba usando un vector, pero creo que es bastante difícil de borrar de esta estructura: algo que tengo que hacer con bastante frecuencia, ya que las cosas mueren todo el tiempo. ¿Hay posibilidades de que debo mirar? Pensé en algo así como la lista, pero no creo que puedan ser paralelizados, ya que se implementan como listas enlazadas con iterador objetos?

Gracias

¿Fue útil?

Solución

  

Hasta ahora yo estaba usando un vector, pero creo que es bastante difícil de borrar de esta estructura: algo que tengo que hacer con bastante frecuencia, ya que las cosas mueren todo el tiempo

.

¿Cuántas es lo que realmente espera a morir por cada paso de la simulación? Lo que parece ser "todo el tiempo" a un humano todavía se podría considerar muy poco frecuente a un ordenador. Por ejemplo, si cada paso de la simulación procesa miles de agentes, pero en promedio sólo el 1 agente muere cada pocos pasos, a continuación, agente de la muerte es un incidente menor. Con ese tipo de números, su programa gasta mucho más tiempo de procesamiento de agentes vivos de lo que no se ocupan de los agentes muertos y por lo tanto preocuparse por el rendimiento de la eliminación de un agente muerto puede no valer la pena en absoluto. Si haciendo la mudanza agente más eficiente terminaría haciendo agente iteración normal y procesar menos eficiente (sin embargo, la eliminación agente es relativamente poco común), entonces que probablemente habría una pobre compensación.

Por otro lado, si nacen y mueren cada paso de simulación gran número de agentes, entonces es posible que desee asegurarse de que esos eventos pueden ser manejados de manera eficiente. Así que realmente depende de la clase de números que esperar a estar tratando con.

Mi consejo general sería proceder con el uso de std :: vector (siempre y cuando se ajuste el resto de su diseño) a menos que realmente espera un número significativo de muertes de agentes por paso en comparación con el número de agentes en total.

Otros consejos

Se podría dejar el agente en la lista cuando muerto, listo para su reutilización. No se preocupa por la reducción de su contenedor, y se conservan los beneficios de un vector. Se podría mantener una pila separada de punteros a los agentes muertos / reutilizable, basta con pulsar sobre ella cuando un agente muere, POP uno fuera a reclamar por un nuevo agente.

foreach Agent {
    if (agent.health > 0) // skip dead agents
        process rules

Lista debería funcionar bastante bien. Se puede paralelizar, porque de insertar o retirar un elemento hace otros iteradores no invalida (excepto de iteradores curso apuntando a un elemento de ser eliminado).

Si usted no necesita el recorrido hacia atrás, slist es tan buena como la lista, y un poco más rápido.

Si no se preocupan por el orden de los elementos, el uso conjunto.

Utilice un árbol cuaternario como en los videojuegos. Luego de buscar en pos es rápido y la eliminación es rápida también. (Además, puede paralelizar través de nodos secundarios).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top