Stellaris, carnet des développeurs n°172 : Le retour de l'IA (1ère partie : le ministère de la défense).

NdT : Avant de commencer au vu de la longueur du carnet (et en particulier des commentaires des devs par la suite), il sera en deux parties. Par ailleurs je vous annonce que je lance un multijoueur en preview vendredi soir prochain (si tout se passe bien) afin de tester cette nouvelle version tous ensemble. Pour plus d'information je vous invite à aller sur le sujet. Certaines informations ont aussi pu être récupérer des nombreux commentaires des développeurs ayant répondu aux questions sur le forum (à voir en sources).

Bonjour à tous, ici the French Paradox ! Pour ceux qui ne me connaissent point, j’ai rejoint l’équipe de Stellaris fin Décembre après avoir passé un an et demi dans l’équipe de programmation sur EU4. Aujourd’hui je vous parlerai de l’IA.

Une bonne introduction pour les nouveaux sur le sujet.

Cinquante nuances d’IA :

Stellaris possède plusieurs modules d’IAs. Pour des raisons historiques nous les appelons “ministères” car chacune d’entres elles est supposée remplir un rôle spécifique au sein d’un empire joué par l’IA.
Ces derniers sont de trois sortes :

- Le ministre des Relations Extérieurs gérant la diplomatie, les fédérations, la communauté galactique, les déclarations de guerre et paix;
- Le ministre de l’Intérieur en charge de l’économie et de la construction tant civile que militaire;
- Le ministre de la Guerre qui commande les troupes et les flottes disponibles. Il est aussi en charge d’établir les plans lors des guerres.

Pour chacun de ces postes, il y a différentes versions de ministre sélectionnées par chacun des empires du jeu. Aussi il existe une version de base disponible pour tous puis quelques variations mineurs suivant les éthiques (un ministre militariste conservera moins de moyen en défense par exemple). Cette version de base se calque sur ce que nous pensons qu’un joueur ferait. Les nations spécifiques : monstres neutres, empires déchus, crises de milieu et de fin de jeu, maraudeurs, etc, utilisent une version qui leur est spécifique (qui sait ce qui peut arriver si vous vous amusez à intervertir les comportements de chacun ). Sachez aussi que les ministres “communiquent” entres eux afin de se coordonner autour de ce que l’on appel des “stratégies”. En gros, l’IA va définir des objectifs et des moyens pour y arriver et créera des stratégies que les différents “ministres” peuvent choisir et poursuivre. Ils communiquent aussi de d’autres manières mais en général nous essayons de ne pas trop les interconnecter car leur module peuvent être changés selon les événements en jeu. Ils se doivent donc de travailler en indépendance. L’explication est certes simpliste mais l’idée est là.

Aujourd’hui je vous parlerais du ministre de la guerre. La refonte associée m’a été offerte en cadeau de bienvenue lorsque j’ai rejoint l’équipe. Celui des relations extérieurs ne fait pas partie du périmètre de ce carnet (NdT : celui sur l'économie en partie 2). Rassurez vous, nous l’avons mis à niveau afin qu’ils puissent jouer avec la Communauté Galactique ou les nouvelles mécaniques diplomatiques. Seulement il n'y a pas eu de changement majeur.

Le ministre de la guerre :

Tout d’abord un peu d’histoire : il y a eu plusieurs générations d’IAs militaires dans Stellaris. Une version générale (utilisée par la plupart des empires) a été réécrite par le grand @sidestep l’année passée alors que les plus spécialisées ont conservées les comportements tel qu'affectés lors de leur apparition dans le jeu. Dans la brume de ce sombre et triste hiver suédois, j’ai pu réaliser les améliorations que je vous montrerai aujourd’hui.

J’ai en premier lieu retravaillé la visualisation des actions de l’IA et ainsi avoir plus d’informations pour mieux les comprendre. Point amusant, rien que d’avoir ces informations supplémentaires les ont rendues à mes yeux plus malines alors que rien n’avait changé dans leur comportement. C’est une démarche qui se retrouve assez souvent dans le jeu vidéo : une bonne IA qui vous dit ce qu’elle fait, est toujours perçu comme meilleure. L'exemple des ennemis dans FEAR est l'un de mes favoris.

Ainsi en tapant la commande 'debug_ai' dans la console et en observant un peu vous pourrez voir ce qu’elles comptent faire :

“Je ne vois pas de code. Je ne vois que des blondes, des brunes et des rousses. Heu, vous désirez une bière?”

Pour faire l’analogie, l’IA a un ministre de la guerre qui possède une vision d’ensemble et qui affecte à chaque cible potentiel un score. Les cibles sont divisées en trois catégories : les flottes, les systèmes et les planètes. Chacune de ces catégories a ses propres modificateurs afin d'attribuer un score et d'aider l’IA à choisir ce qui importe le plus. Par exemple dans le cas des systèmes l’IA peut considérer si ce dernier est un bon goulet d’étranglement (donc un endroit plus stratégique) ou une revendication. Dans le cas des flottes, les variables servent à lui faire comprendre si une flotte est une distraction ou un véritable danger. Suite à l’attribution du score, un état major affecte les moyens nécessaire pour réaliser les objectifs et enfin les amiraux essayent de diriger ces flottes à un niveau tactique pour atteindre les objectifs fixés.

Le crâne sur chacun des système montre les objectifs militaires que l’IA considère. Les rouges sont ceux qu’elle a sélectionné et où des flottes se dirigent tandis que les verts sont des cibles pour lesquelles il n'y a pas encore de moyen alloué. Enfin il est possible de voir ce que fait chaque flotte.

Dans notre exemple, l’IA a décidé que prendre Tiralam était l’objectif le plus important avec un score de 4500 et qu’il lui faudrait environ 11,2 k de flotte pour ce faire. Elle y envoie donc les armadas Kilik, Jinki-Ki-Ti et Grekki. Puisque cela ne fait pas sens d’attaquer en formation dispersée, elle essaye d’abord de les regrouper dans le système de la Singularité de Broon avant de procéder à l’attaque (les comportements de regroupement ont été améliorés dans la mise à jour).

Pour plus de facilité le résumé est aussi visible dans l’onglet de droite :


La vue du camp d’en face !

Rien que ces changements nous ont permis de voir où l’IA était un peu faible mais aussi de confirmer quelques erreurs évidente qui sont maintenant corrigées. Une des meilleures était quand une flotte était affectée à deux objectifs différents ce qui simulait avec originalité deux amiraux se battant pour le commandement de ladite flotte et envoyant des ordres contraires chaque jour. Un autre bug de la bêta était que les systèmes en dehors des frontières étaient ignorés. Ce qui voulait dire que l’IA était très timide avec les systèmes contenant des monstres neutres (à moins qu’un objectif de guerre lui fasse traverser ce dernier par chance). Pour le moment rien n’est prévu pour faire en sorte que le joueur puisse voir la valeur de chaque système suivant l’IA (utile pour savoir ce que vont faire vos alliés) mais c’est une idée à creuser. Idem pour les flottes et leurs actions en cours.

L’IA et les Crises :

La prochaine étape fut de réécrire le comportement des crises variées afin qu’elles puissent utiliser le processus de décision classique et qu’ainsi les efforts déployés pour améliorer les uns profiteront aux autres. Avec la mise à jour 2.6 les IAs du Khan, des Prethoryns, des Unbidden et de la Contingency utiliseront le même module que les IAs standards avec quelques variables pour les personnaliser un peu plus.

Sans tout dévoiler voici quelques uns de leurs traits caractéristiques :

Le Khan ne croit pas vraiment en la défense et engagera toutes ses forces dans l’invasion des systèmes proches afin de soumettre leur propriétaire.
Les Prethoryns vont essaimer dans toutes les directions à la fois.
La Contingency attaquera systématiquement la plus grande menace pour la galaxie (sauf lui même bien entendu même si ça serait amusant).
Les Unbidden seront plus aléatoire mais ont des raisons derrières leur façon bizarre d’agir (NdT: quelques informations sont disponibles plus loin dans le spoiler).

Un des plus importants challenges auquel nous avons fait face fut d’attribuer les différentes flottes aux objectifs. Faire correspondre X flottes avec Y des Z objectifs n’est pas une tâche facile. Devons nous essayer d'accomplir le plus d’objectifs possibles en prenant le risque de trop disperser les moyens et donc de ne rien accomplir du tout? Est-il préférable de tout concentrer sur l’objectif le plus important et peut être forcer un combat qui aurait pu être éviter? Quelle serait la fréquence idéale pour reconsidérer ces options?
La version actuelle résout ce problème en affectant une puissance de flotte à chaque cible, puis en choisissant les flottes par ordre de priorité jusqu’à ce que le nombre soit satisfaisant et enfin recommencer l’opération avec l’objectif suivant.
Cette approche a montré ses limites lorsqu’elle fut adaptée aux crises puisqu’elles reposent essentiellement sur la taille de leur flotte et que l’IA ne sais pas les séparer actuellement, seulement les fusionner. Ainsi, apprendre à l’IA comment séparer des flottes s’est révélé assez intéressant :


Que faire avec toute cette connaissance ?​

Cela à pris plusieurs essais afin de trouver le bon équilibre car l’IA avait tendance séparer un peu trop ses flottes (puisque la plupart des objectifs ne requiert pas tellement de moyens sauf si vous affronter la flotte adverse). À la fin après avoir essayé plusieurs solutions complexes comme la conservation de statistiques sur les objectifs accomplis pour en dériver des comportements utiles, une approche plus simple s’est révélée efficace : regrouper toutes les forces offensives en une pile et ensuite, en fonction du niveau de confiance face aux flottes adverses et selon la situation, les séparer en deux ou trois flottes combinées (voir plus) (NdT : étrangement je pense que les joueurs font pareil en général). Dans les faits être sûr que chaque ensemble est capable de vaincre seul la flotte adverse est la solution la moins risquée mais est-ce la plus amusante? Suite à la sortie de la mise à jour, nous allons analyser tout ceci. Par ailleurs si l’IA n’arrive pas à regrouper ses flottes, elle les réassignera à d’autres cibles.

Sachant que certains d’entres vous aiment modifier l'IA , voici quelques valeurs que vous pourrez changer une fois la mise à jour de sortie :

Spoiler:
# Objective values
HORDE_INVASION_PLANNING_DEPTH = 5 # How far out does the Horde AI looks for invasion targets (in system hops)
SWARM_INVASION_PLANNING_DEPTH = 5 # How far out does the Swarm AI looks for invasion targets (in system hops)
SWARM_POP_TARGET_MULT = 1.0 # Extra target scoring for swarm (multiplied by number of edible pop on the planet)
CONTINGENCY_MEGASTRUCTURE_EXTRA_VALUE = 4 # How attractive are megastructures to the Contingency (added to the base value of 1)
UNBIDDEN_PORTAL_EXTRA_VALUE = 20 # How much does the Unbidden want to defend their portal (compared to base value of 1)
UNBIDDEN_BYPASSES_EXTRA_VALUE = 4 # How attractive are bypasses (wormhole, gate, and so one) to the Unbidden (added to the base value of 1)
UNBIDDEN_RIVALS_EXTRA_VALUE = 10 # Extra target scoring for rival invaders (Aberrant and Vehement)
UNBIDDEN_TARGET_EXTRA_VALUE = 10 # Extra target scoring for randomly chosen nemesis
UNBIDDEN_PSIONIC_CONQUER_DESIRE = 20 # Extra weight added to psionic empires when rolling a nemesis (base 1 + number of owned bypasses)
UNBIDDEN_CHOSEN_ONE_CONQUER_DESIRE = 50 # Extra weight added to empire lead by the chosen one when rolling a nemesis (base 1 + number of owned bypasses)

# Fleet sizing
OFFENSE_VS_DEFENSE_STRATEGY_ALLOTMENT = 0.75 # How much of its fleet power should a country with 1.0 aggressiveness should try to commit to offensive missions
AVERAGE_FLEET_SIZE_FACTOR = 0.05 # Ballpark estimate of the minimum size a fleet should be in relation to total fleet power
OWN_FLEET_POWER_FACTOR = 1.0 # How much does AI count its own fleet power when evaluating forces
ALLY_FLEET_POWER_FACTOR = 0.5 # How much does AI count ally fleet power when evaluating forces
ENEMY_FLEET_POWER_FACTOR = 1.0 # How much does AI count enemy fleet power when evaluating forces
FLEET_SUPERIORITY_FACTOR = 1.5 # How stronger should the AI be before it starts considering splitting fleets (fleet count = relative strength / this factor)
CRISIS_FLEET_SUPERIORITY_FACTOR = 1.0 # Same as previous but will be compared to the strongest foe in the universe

NdT : bypass = porte, trou de ver, etc


La plupart des changements viendront avec la mise à jour accompagnant Federation (version 2.6.0) mais pas tous . Comme vous pouvez l’imaginer ils sont très impactant et nous voulons les tester plus en profondeur. Une optimisation arrivera donc dans un second temps avec la version 2.6.1. De plus nous ne nous arrêterons pas là et l’IA gérant cette partie du jeu continuera d’être une préoccupation. En effet nous nous sommes concentré sur une échelle locale et nous prévoyons maintenant d’accumuler des données afin d’effectuer des ajustement si nécessaire. J’ai encore plein d’idée pour améliorer ce sujet mais il vaut mieux laisser les choses se tasser avant de continuer plus en avant.

Avec ceci je vous laisse dans aux mains de @sidestep pour la suite.


Une refonte bienvenue, reste à voir ce que cela donnera en jeu. Pour le reste la seconde partie arrive bientôt et en attendant n'hésitez pas à venir sur le forum pour en discuter.