• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.

Stellaris Dev Diary #172 - Reworking the AI

Bonjour everyone, it’s the French Paradox speaking! For those who don’t know me, I’ve joined the Stellaris team this December after a year and a half as a programmer on Europa Universalis IV.

Today, we are gonna talk about AI.

pasted image 0.png

A good introduction for those new to the field

Fifty Shades of AI
There are several AI modules in Stellaris. For historical reasons we call them “ministers” as each one is supposed to handle a specific role in an AI empire.

There are 3 broad kinds:
  • The AI foreign minister handles diplomacy, federations, galactic community, peace deals and the like
  • The AI interior minister is in charge of the economy. He keeps budgets and order constructions, both civil and military.
  • The AI military minister is in command of all troops and military fleets, and also responsible for laying out strategic plans when at war.
For each of those ministries there are different “ministers” there are several options that can be selected for every empire in the game. All of those have generic one which behaves more or less like we’d expect a player to and is used for most AI empires. Then we have a bunch of specialized ones for special tags such as space monsters, fallen empires, crisis, marauders and the like.

As almost everything in our games, AI is configurable in script for our modders, although I’m not exactly sure what would happen if you assigned a space monster military AI to the caravaneers ;)

In guise of a welcoming gift when I joined the team, I was tasked with reworking the military one...

The Military AI
To give you a little bit of background, there were several generations of military AIs in Stellaris. The generic one (used by most “classic” empires) was redone by the great @sidestep last year, while the more specialized ones (crisis, space monsters) have kept close to what they were on release. In the midst of the sad and dark swedish winter, I managed to bring some improvements that I’ll showcase today.

First of all, I worked on visualization to help us debug how the AI “thinks”. Funny thing is, it already made it look “better” to audiences even if it didn’t actually change any behaviour. It’s actually something that’s been observed in video games: a good AI tells you what it does, which makes it look smarter. One of my favourite examples of that would be the enemies in FEAR.

So by typing 'debug_ai' in the console and observing an AI empire, you can see what it has in mind:

pasted image 0 (1).png

“I don't even see the code. All I see is blonde, brunette, redhead. Hey uh, you want a drink?”

As a simple analogy, imagine that the AI has a war minister that looks at the big picture and rates every potential target, a general staff who assign fleets to some of those objectives, and then admirals who try to lead those fleets on a tactical level to achieve those objectives.

The skulls on top of each system shows military objectives that the AI is considering (the war minister). Red ones are the ones they selected and committed some fleets to, while green ones are other options they haven’t retained for now. Finally for each individual fleet, in those task forces, you see what they are doing at present.

In our screenshot example, the AI decided that taking Tiralam was the most important objective with a score of 4500, and that they estimated that at least 11.2k fleet power was needed to accomplish this. They committed the Kilik Armada, the Jinki-Ki-Ti Armada and the the Grekki Armada to this. Since it makes little tactical sense to attack in a dispersed formation, the AI issued orders to regroup in Broon’s Singularity before proceeding on the attack (something we improved in this patch).

For convenience, the summary is also visible in the outliner:

pasted image 0 (2).png

As seen from the other side of that war

That change alone allowed us to see where the AI was a bit weak and also made evident a few bugs in the production AI that we promptly fixed. A funny one was that in some cases a fleet would end up assigned to two different fleet groups, nicely simulating two admirals fighting over command of a fleet and issuing contradictory orders every day.

Crisis AI
The next step was to rewrite the various crisis to use the generic AI, so that any effort spent on making better would benefit all. In patch 2.6 the specific AI of the Khan, the Prethoryn, the Unbidden and the Contingency will use the same AI as the “standard” empires, with a few twists to still retain their personality.

Without spoiling every secret, here’s a few ideas:
  • The Khan doesn’t really believe in defense and will try to beat the closest systems into submission
  • The Prethoryn will swarm in every direction they can
  • The Contingency will systematically try to stop the biggest threat to the galaxy, until nothing remains
  • The Unbidden will be harder to predict, but there’s reason behind their alien way of acting.
One of the biggest challenges we faced was assigning fleets to objectives. Matching X fleets with Y out of Z objectives is not an easy task. Do we try to accomplish as many objectives as we can at the risk of spreading too thin or accomplishing nothing of value? Should we instead focus on the most valuable target and possibly end up in a big fight that we could have avoided? How often should we reconsider our options?

The current version solves this by putting a fleet power value on every target, then grabbing fleets by order of priority until it either has enough to accomplish the objective, or go over the next one. This approach showed its limits when we plugged the crisis AI into it, as it relies a lot on the size of available fleets (it doesn’t know how to split them, it can only merge them).

Teaching the AI how to split fleets proved quite interesting:

pasted image 0 (3).png

What shall we do with this knowledge?

It took several tries to find a good balance, as the AI tended to split too much (most objectives don’t call for that much fleet power, unless you’re fighting your enemy main fleet). In the end, after trying some complex strategies such as keeping statistics on accomplished objectives and deriving a good target number from that, a simpler approach turned out more efficient: put all the nation’s offensive fleet power into one stack, and then consider splitting in 2,3 or more depending on how confident the AI feels about its military power versus its foes.

Knowing some of you like to mod our AI, here’s some new defines you may want to play with once all that hits the shelves.

Code:
# 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 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

Most of those changes will be delivered in the patch coming alongside the Federations release (2.6.0), but not all. As you may imagine, changes to the military AI are quite impactful and we don’t want to release the changes without enough testing, so some of them will be delivered in the first support patch (2.6.1).

And with that, I shall leave you with @sidestep one last time.
 
Last edited by a moderator:
  • 2Like
Reactions:
This is great news. I'm interested to see what improvements have also come of diplomatic AI, but to know that any time I try to conquer a foreign world it won't cause a complete economic collapse for me (Seriously, how does conquering a homeworld cause all my resources to dive into the negative?) is a great thing. I look forward to seeing how the AI handles things in the future, and how this changes how I play Stellaris.
 
Just out of curiosity, what happens when the AI fulfills an economic plan? How do they decide what to build next - do they shift to the next plan? Also, can the plan shoot for "as high as possible"? One might imagine you want the late game AI to try to max out alloys, tech and unity, without a cap.
 
About the economic AI, does it know how to deal with temporary income deficits, like having Devastation on worlds after a war? And not try to "fix" it by building lots of unneeded districts when time will most probably fix the issues?
 
@sidestep , for the mods that add additional mine-able or produce-able resources, do we need to make AI take a completely new plan once it's able to mine/produce those resources, or is it possible to "insert" a new resource as a sub-plan?
You can just add those resources to an existing plan in the income = {} field, it will try to read any resource key that is in there and since moddable resources are read into the game like other resources they should work out of the box
 
You're letting the AI PLAN!? Are you insane!? If you allow this to happen, there's no telling what will happen. What if the Stellaris AI starts planning to escape my computer into the internet? We need to kill it here and now before this thing becomes a threat to all of humanity,
It's too late. The Plan™ is already in effect. *bleep-bloop*
 
I don't know about this. Creating more pops (and thus jobs) seems like a cornerstone of building powerful economies and you lose ground when growth slows.
It seems to me that it'd be better to design economy AI plans around pop/job expansion rather than making it an incidental target number.
They won't ever stop growing/building pops, it just becomes less of a priority. In later plans that number is of course increased. See it more as something for the AI to work towards actively than a hard cutoff :)
 
When it comes to demolish/rebuild the AI still looks at the destroy = {} triggers and ai_weight = {} ( if weight is < 0 they will destroy iirc ) when looking to demolish buildings, so they should be destroying bad buildings via that script

Habitats work just like any other planet with this system and from what I've seen the AI handles them better now as well :)
Current game rule - you can't build a habitat/megastructure in orbit around an object where another station is.

Now a Habitat can earn 200 minerals, whereas a really good Gas Giant can generate 12. So the AI should demolish the mining station to build a Habitat.

The problem in the current Stellaris is that it doesn't plan. It doesn't know that demolish Mining Station allows it to build a Habitat and earn more in the future. So demolish/rebuild probably won't do anything at all unless the AI is "thinking" a couple of steps ahead.

Likewise for Ecumenopolis.

The problem is not that the AI is getting rid of a building or station that is a net negative, it is the opportunity cost that matters.

They won't ever stop growing/building pops, it just becomes less of a priority. In later plans that number is of course increased. See it more as something for the AI to work towards actively than a hard cutoff :)
The current AI does however? So what did you change?
 
You can just add those resources to an existing plan in the income = {} field, it will try to read any resource key that is in there and since moddable resources are read into the game like other resources they should work out of the box

I meant added "dynamically" : e.g. there is a secondary plan (a sub-plan) that does not invalidate the base one, but sets additional income goal for new resources and is activated upon researching tech. Or we need to overwrite existing plan / substitute it in its entirety with our own that includes these modded in resources.
 
As far as my observations go in over 2500 hours of this game (probably more than your average QA :)), the worst enemy of AI fleets is subsequent reinforcements.

A meatbag player tends to doomstack always (human nature, as well generic military strategy - hit it hard, hit where it hurts, instead of matching forces hit with overwhelming advantage to reduce your casualties).
When AI is beaten, it starts sending constant reinforcement stream into existing fleets. All you have to do at this point is split a few ships and delete them 1 by 1 as they come into the system under siege.

This behaviour has to go away. The fleet has sailed to fight - and wish it good luck. Any newly built ships have to form a new fleet to deal with the situation.
If the fight was close, and the winner limped away with reduced force - the newly formed fleet of reinforcements will present much greater threat than a stream of ships coming in 1 by 1 to take part in battle which has already passed.
 
As far as my observations go in over 2500 hours of this game (probably more than your average QA :)), the worst enemy of AI fleets is subsequent reinforcements.

A meatbag player tends to doomstack always (human nature, as well generic military strategy - hit it hard, hit where it hurts, instead of matching forces hit with overwhelming advantage to reduce your casualties).
When AI is beaten, it starts sending constant reinforcement stream into existing fleets. All you have to do at this point is split a few ships and delete them 1 by 1 as they come into the system under siege.

This behaviour has to go away. The fleet has sailed to fight - and wish it good luck. Any newly built ships have to form a new fleet to deal with the situation.
If the fight was close, and the winner limped away with reduced force - the newly formed fleet of reinforcements will present much greater threat than a stream of ships coming in 1 by 1 to take part in battle which has already passed.
This is changing, which I disagree with.

In the new system, reinforcements will go MIA and then join their target fleet after a countdown has elapsed.
 
More than arbitrary dates like ''early'', doesn't it make more sense to tie the economic plans the geopolitical situation? Like having a ''wide expansion'' plan that focuses on pop growth and minerals to build stuff if there is little danger and plenty of space, a 'tall expansion'' if there is little danger but few colonization options, or a ''military buildup'' plan that focuses on alloys if the AI predicts an war in the near future.
 
Ah, technical dev diaries, the best kind when this meaty and lengthy :D
Please, sir(s), may I have some more?

On a more serious note - excellent write-up, I have high hopes for the AI actually not being braindead ... well, at least on the economy side, and possibly on the military side (I suspect it's the economy killing everything else right now). I'm still going to observe my "no pre-order" rule, but don't tempt me like this ... actually, please, do :D

A few things remain unclear for me, however:
A) Will the AI be able to plan in building megastructures to integrate into the economy? What about Ascension Perks? As in, if their empire is locked in and pacifist, will the overall country AI prioritize furthering internal development via demolishing mining stations in favor of habitats, and increase priority on picking up Galactic Wonders and/or Ecus? Because if not I foresee a future where an AI is locked in due to military might or federation blocks, and it has capped out all the planets it has and thus cannot grow more. What will it do? (Admittedly this is an edge case scenario, but still)

B) What about planetary/sector AI? The automation feature that is sorely needed (when you have a large empire) - is there any way for it to benefit from all the work done here? If not, would it be possible to enable economy country AI for the player when automation is turned on, and limit it based on planet designations, as well as let the player edit The Plan™? Please, I've stopped playing conquering empires for this very reason - managing 100 planets manually is no fun at all :(
 
I did not touch the research AI for this, but that would be nice indeed!

When it comes to demolish/rebuild the AI still looks at the destroy = {} triggers and ai_weight = {} ( if weight is < 0 they will destroy iirc ) when looking to demolish buildings, so they should be destroying bad buildings via that script

Habitats work just like any other planet with this system and from what I've seen the AI handles them better now as well :)

Just to verify a point.... in your post, you specifically mentioned demolishing BUILDINGS, but didn't explicitly mention demolishing DISTRICTS. Its the failure to do the latter that prevents AI players from developing ecumenopolis planets. Have you made certain to specifically allow the AI to demolish districts too?

Is there currently a desire in the later-game plans to create ecumenoplis planets if available (which would encourage demolition + replacement to make particular planets all city)? If not currently, will there likely be in the future?

Additionally, just to confirm how the resource targets in the plans work - naturally, I'd assume that if we have a very successful AI that's colonized or conquered a lot of planets it would be aiming to produce more resources than the amounts specified in the plans - it would naturally want as much as possible to be produced. So, just to confirm, it won't just "give up" on producing alloys or consumer goods or research or unity once it reaches the plan targets, right? If it has the productive capacity to produce more, it would, right?

Thanks. Really looking forward to seeing these changes in 2.6 and 2.6.1.
 
Sounds like the revolutionary amount of AI rework that the game needed. Really looking forward to trying it.

How well is the AI handling the Galactic community? Sounds like a feature that isn't that easy to understand if you are a computer.
 
Another small but significant and cool change we made to help the economic AI is make it possible to see which job a pop favours according to the job weightings using debugtooltips:

upload_2020-3-5_14-48-23.png

This specialist Artisan would like to be an Administrator, but an Artisan is the specialist job they are most suited to at the moment. Of course, worker jobs are beneath them and not worthy of consideration!

By making it much easier to see this information, we could fix a number of bugs where e.g. mining bots were not automatically favoured for mining jobs.
 
I've a question about the not detailed diplomacy AI. Let's say you and another empire are good friends and you want to form a federation. But you're missing three points of acceptance to seal the deal. Now you gift them 1k ressources and he likes you about 50 points more. In the aktual system with the aktual AI it often happens that the acceptance is still -1 or something like that (absolutely don't know why).

So now with 2.6/Federations the diplomacy system including the "minister" for that has been reworked. You can send envoys to improve relations and the acceptance is based on both side opinions of each other. Does this "Fix" that problem, so you can start a Federation right away?