13-02-2013, 12:51 PM
On se répète un peu...
Autre solution: une structure en arbre.
Tu considère chaque individu, mais tu rassemble les individus en groupes, eux-mêmes pouvant être rassemblés en super-groupes (etc).
Au sens d'un groupe, tu simule chaque individu. Mais un individu d'un groupe ne pourra pas interagir avec un autre groupe. En revanche, deux groupes pourront interagir l'un avec l'autre, comme somme d'individus.
Par exemple, dans un groupe (quartier de ville), les gen sont simulés un à un dans leur quartier. Mais si tu passes à l'échelle "ville", alors les quartiers sont simulés de façon statistique (je suis pas sûr d'être clair... l'idée est de reprendre le principe de l'oct-tree en faisant en sorte de découper le nuage granuleux de population en des blocs indépendants, simulables indépendamment et rapidement).
Ce système permet généralement de passer d'un algo O(n²) à un algo ~o(n²/k) avec k le nombre de personnes par groupe. En d'autres mots, pour n=1.000.000 (nombre d'habitants), et des groupes de k=1.000 personnes, on aura environ (10e6)² calculs pour le cas granuleux simple (soit 10e12 ou 1.000 milliards) contre ((10e6)²/1.000) = 1 milliard de calculs. On A déjà pas mal "élaggué" le code. C'est d'ailleurs l'idée principale: au lieu de traiter toutes les interactions, on décompose en groupes de personnes qui peuvent interagir, de sorte qu'une personne d'un groupe ne puisse jamais interagir avec les individus d'un autre groupe.
Mais, là, c'est assez tordu, et peut-être pas la meilleure piste pour un jeu en ligne ("faites simple" étant le credo d'un jeu en ligne).
Autre solution: une structure en arbre.
Tu considère chaque individu, mais tu rassemble les individus en groupes, eux-mêmes pouvant être rassemblés en super-groupes (etc).
Au sens d'un groupe, tu simule chaque individu. Mais un individu d'un groupe ne pourra pas interagir avec un autre groupe. En revanche, deux groupes pourront interagir l'un avec l'autre, comme somme d'individus.
Par exemple, dans un groupe (quartier de ville), les gen sont simulés un à un dans leur quartier. Mais si tu passes à l'échelle "ville", alors les quartiers sont simulés de façon statistique (je suis pas sûr d'être clair... l'idée est de reprendre le principe de l'oct-tree en faisant en sorte de découper le nuage granuleux de population en des blocs indépendants, simulables indépendamment et rapidement).
Ce système permet généralement de passer d'un algo O(n²) à un algo ~o(n²/k) avec k le nombre de personnes par groupe. En d'autres mots, pour n=1.000.000 (nombre d'habitants), et des groupes de k=1.000 personnes, on aura environ (10e6)² calculs pour le cas granuleux simple (soit 10e12 ou 1.000 milliards) contre ((10e6)²/1.000) = 1 milliard de calculs. On A déjà pas mal "élaggué" le code. C'est d'ailleurs l'idée principale: au lieu de traiter toutes les interactions, on décompose en groupes de personnes qui peuvent interagir, de sorte qu'une personne d'un groupe ne puisse jamais interagir avec les individus d'un autre groupe.
Mais, là, c'est assez tordu, et peut-être pas la meilleure piste pour un jeu en ligne ("faites simple" étant le credo d'un jeu en ligne).