TL;DR : The problems with doll-based performance are probably due to the fact that dolls are treated as agents – as individuals. If you treat them like numbers, more pops doesn’t mean the game will slow down.
In version 3.0 Paradox makes some changes in the evolution of pop music. One was the imposition of a government-wide growth restriction on everyone’s pop culture. This was done in large part to reduce the total amount of pop at the end of the game, to improve performance. However, this brought some strange effects, such as the fact that it’s almost impossible to fill ecumenopolis (let alone ring worlds) because they appear too late, so by the time you have one, you already have enough pops to grow them on the 1 pop glacier in 3 years on the planet.
The purpose of this paper is to study how to modify the pops system so that a large number of pops is no longer a performance problem. So I’m going to pretend, with numbers and assumptions, that this new growth boundary doesn’t exist. It also makes analysis easier, since the planets are now completely independent of each other in terms of growth rate.
High-level analysis of the current system
Since I don’t work at Paradox and don’t have access to the Stellaris source code and profiler results (and can’t get away with profiling a compiled binary – I decompile manually as I work), I just need system descriptions. So I will only provide a high level analysis using
asymptotic notation. I’m sure Paradox does a good job profiling their builds, so they’ll know if I’m targeting the right areas with this or not.
Pop-ups and tasks – analysis ofimplementation
TL;DR : The monthly tick becomes slower as the number of pops increases – probably O(n2) and Ω(n√n).
We know that every pop musician looks around and thinks every month: Is there a better job I can do? This is the root of all evil (representation).
The way it works (probably) is that each planetary orbit looks at each planetary orbit and determines:
a. Can I move to this job,
b. how much will I produce in this job, and
c. whether I should move to this job.
A is a simple filter and a good pruning step (robots cannot perform specific tasks, so there is no point in testing them, and specialists cannot perform professional tasks without first becoming unemployed, being demoted, etc). B is a simple calculation, just add some bonuses to the base production. This is a little more complicated, but probably implies a comparison with the current owners of these jobs to see if this doll does better.
This gives us an estimate of the O(n*k*j) execution time on the planet, where n is the number of popups on the planet, k is the number of different tasks, and j is the number of popups at each task (so technically a series of numbers). You may have noticed that we essentially ignore the a-step, but it can be about 1/2 to k, and since we are using asymptotic notation, we can ignore the constants. Similarly, there is probably a constant (<1)*j, since we would have stopped earlier if we had chosen to change, but that would have happened in a stable economy. Looking more closely at j, we see that it is actually n/k, since the number of pop-ups that have jobs is, on average, equal to the number of work windows divided by the number of different jobs they can have. As we do for every command, it doesn’t matter if we add several k real numbers or take k times the average. This gives a total execution time of O(n*k*n/k) = O(n2).
This is not good. If we leave out some precautions and/or do it intelligently, we can reduce the need to check every deposit. Instead of assigning dolls directly based on their properties (in this case, filling free slots with dolls instead of choosing free slots for each doll), we can reduce this to an O(n*k) estimate for each planet, which is much faster because k rarely turns out to be around 10 while n can be >100. If we compromise and partially sort the task list before going to the pop list, we can get something like O(n*lg(k)), but since k is never greater than 10 (and lg(10) is about 3), we won’t get very far with that.
The best you can do if you have discrete puppets that are treated as agents is O(n), where each puppet considers and selects only one job (or uses a pre-programmed priority list based on its properties, crossing out jobs as they are fulfilled).
I can’t give a definitive answer, but I think the runtime will be O(n2) and Ω(nk) (which essentially means at least n*k, but at most n2).
If we want, we can try to express it purely in terms of n. The number of different professions on the planet tends to grow in some proportion to the size of the population. In the beginning you only have 1 or 2 hits and 1 lane (colon). In 3 or 4 clicks, you can add a robot, etc. By the end of the game (and that’s what we’re really interested in here), you start to reach about 10-11 openings and 100+ pops. In general, the square root of n is a good approximation. This gives O(n2) and Ω(n√n). However, this can be reversed if you build more planets or let your planets get bigger than ~200. So remember that Ω(nk) is a realistic estimate, even though Ω(n√n) is usually less than 50% reversal at the end of the game.
So the size of the calculation increases with the amount of pop music on the planet. That’s the root of the problem. As the game progresses and more pop comes out, it slows down. Fortunately, n2 holds for all planets. Each planet can be calculated independently (possibly in parallel, although this is a separate technical discussion), since Pops does not take into account orbits on other planets. This is bad for something that needs to happen quickly (like the tick of the month), and it makes sense that Paradox would want to reduce the total number of pop messages to improve performance.
There is probably some attachment to fathers who already have jobs to ease the burden. Not all fathers will re-evaluate all tics, perhaps only when something significant changes on the planet. This would significantly improve performance (but not asymptotically).
Proposal: Rov discrete pops
TL;DR : Turn pop-up windows into statistical units and don’t treat each as an agent.
Our goal here is to design the number of pop-threads and their execution times such that the growth of pop-threads can continue without performance degradation. To do this, we need to treat pop music as a song, not as a collection of individuals. That way, the number can increase without requiring additional computation (on modern computers, multiplying two 64-bit numbers is very fast, on the order of a few clock cycles plus memory overhead, and does not depend at all on the size of the number, as long as it is smaller than, say, 264 or 18 billion).
Pop music as a collection of people
TL;DR: 1 doll = 1 billion people (/robot/drone/mad machine).
If we convert modern populations into people, say 1 in 1 billion (which is the accepted metric), then we can treat them as numbers rather than individuals. Each species is currently assigned a certain number of people (there may be 12,385,472 people and 35,862,512 blogs on the planet, but we can still assume 12.4 people sticks and 35.9 blogs).
All figures are largely unchanged. In the urban area there are 6 housing units, in the industrial area there are 2 housing units, 1 craftsman and 1 metal worker. In terms of representation, they can still be called housing units (and a billion people is a person). Each species grows proportionally to the overall growth rate of the planet, modified by the growth rate of the species, and immigration is intelligently distributed according to the sources of migration and their demographic distribution (this can in fact be predicted for each planet, as each planet calculates its overall immigration wave. Last month’s immigration wave can be used to increase productivity and multithreading potential. So there is no reason to wait for this figure for other planets; migration lasts at least a month anyway).
Vacancies and types – Pop music specialisation
TL;DR: more specialization = better job selection pop-ups.
At this point we can introduce a new term: the specialization of pop music. It’s not necessarily an idea that works, but it came naturally and seemed like a cool mechanism, so I did it. Specialization is the degree to which hits specialize in the tasks that best suit them.
The specialization goes from 0 to 1 (or from 0% to 100% if you prefer). With zero specialization, we essentially assume that species are evenly distributed across all jobs (or at least across all jobs available to them). In other words, if 10% of your cotton is industrial, you get a total of +1.5% mining via jobs. With 100 specializations, we assume each species is working on what they can, if possible. Your mining profit is the number of pops you have divided by the number of miners you have. So with 15 manufacturing jobs and 50 mining jobs, the total would be +4.5%. For values between 0 and 100 the value evolves linearly. The formula is: bonus*((1-specialization)*proportion_of_total_pops + specialization*pops/jobs), where specialization is between 0 and 1. It should be noted that the number of vacancies is the number of positions to be filled; this premium is not calculated until we have determined the number of individual positions to be filled.
The current system (at least in theory) is roughly equivalent to setting specialization at 100, which is a reasonable choice, but I think it could be an interesting mechanism. Authoritarians can find ways to force specialization (through a kind of command economy), while egalitarians can encourage their fathers to specialize (after all, in a meritocracy there is a strong incentive to do what you are good at). More specialization would be a useful, but not foolish, incentive. The more specialized your planet is (say, a planet with 80+% mining jobs), the less impact it will have (imagine very few people moving from admin to mining, when there actually aren’t that many admins).
As an example of a highly specialized planet, I found a planet in the savings section that has 54 strands and 32 mining orbits on it. Let’s just say the good half of Pop is busy. With a specialization of 0, this corresponds to +7.5% of jobs for minerals. At 100 specializations, that would be 0.15*27/32=+12.7% minerals, or only about 5% extra modifier. Good, but not essential.
There are 2 artists on the same planet, and 13% of the population is traditional. With a specialization of 0, this gives a unit of +1.3% of jobs. However, with 100 specializations, this gives an overall unit of +10%, as there are more than enough traditional pops to cover the jobs. Specialization can be for more specialized professions, for example. B. entertainment and cultural workers, more efficient.
Runtime analysis of new system
TL;DR : In this system, the turnaround time does not depend on the amount of pop, but only on the variety and diversity of the work.
Our goal was to decouple execution time from the number of pop-flows, allowing the empire and planets to grow without increasing the computational burden and delaying the endgame. Well, how did we do?
Let’s see what needs to be done each month. We have to:
1. Grow Our Daddy
2. 2. Distribute pop-ups for free jobs
3. Calculate bonuses for type
work 4. Calculate the total number of jobs produced5. Calculate the total number of refills
6. Calculate the immigration peak for the next tick
1 is a simple numerical operation performed on all species on the planet.
2 would probably be a one-time calculation (it’s almost a grab bag problem, but assigning a value to each type of job is difficult/desirable; you probably want a more even distribution that pre-fills niche jobs like robotics), with the ability to prioritize some jobs over others (like screw salespeople). Since we don’t really care which father does which job (as described in step 3), we can ignore the individual species and focus on the overall population. Thus, it is a task-based computation, not a nested loop of views and activities. The only clue is the layers: The total population must be broken down by strata (for the previous month), and places are filled first from one’s own stratum and then from the lower strata. Too much pop in the shifts leads to unemployment and gradual deterioration, as in the past.
We have talked at length about 3 above. The described operations are performed once for each characteristic, although in practice it may be faster or easier to calculate by type. However, this does not depend on the amount of pop.
4 is (since we already have bonuses for each commodity in step 3) a per order calculation. Basic*Bonus*Ops.
5 is either the unit multiplier or the sum of species multipliers, depending on whether we have already calculated the power modifiers along with the order modifiers above.
6 is also a unique calculation.
This gives a runtime of O(s+k+s+k+s)=O(4s+2k)=O(s+k), where s is the number of types and k is the number of vacancy types. So we did it! It is totally independent of the actual world population and depends only on the diversity of pop music and jobs. When I load the save game (and remember that the numbers should stay about the same), the planet of 120 inhabitants has about 30 different species (some AIs have adopted xeno compatibility, and I have quite a few migration contracts) and 10 different professions.
We can expect the galaxy to have no more than 45 species in the beginning (30 realms, 5 FE, and a few mechanistically or syncretically evolving realms, plus a few invading/filtering/etc primitives), but this number may increase over the course of the game as robotic modeling and genetic modeling occurs. There is a real risk that the number of different species and half-species will increase to a level that exceeds the current population numbers, especially if a minimum level of pruning is not applied. In the backup I used as a reference, my realm has a total of 111 different species. They are not all present on all planets, but without a full 1 pop minimum cut, they probably would be. There are about 380 different species in total in the galaxy – only 45 of which are actually semi-species – which is significantly more than the current population (and enough to make it a nightmare to keep track of or visualize). It should probably be reduced a bit.
But even with 380 species, the execution time of O(s+k) is still faster than O(n2) or even O(nk), provided that s is not asymptotically larger than n. As a check (although this is not asymptotic notation, we’re just concerned with the big picture, remember we left out 4*s and 2*k), 100 pops and 11 jobs gives 1002 = 10,000 and 100*11 = 1100, while 380 gives species 380+11 = 391. If something is done to stop the spread of species, then s must be smaller than n.
This system can probably be adapted to practice, but I haven’t studied it yet. You may only reassign jobs when the total population changes too much (or perhaps only when it reaches a new full popup, unless you allow a partial popup), or when the number of jobs changes, and these calculations can even be done asynchronously over the course of the month (although this brings up a lot of other challenges, such as whether they will finish on time, or what happens when multiple changes are close together, etc.) This post is about high-level analysis, though.
Similarly, the number of species actually included in the calculations can be minimized by only counting species with <1 population for population growth. Do not count them in the total population or iterate on them in another step. They only become real when their growth takes them above 1 cotton. This should keep biodiversity in line with the modern game, where there are about 120 populations on the planet, probably about 40 species at best – and where it is guaranteed to be less than 120 species.
Pops are an integral part of Stellaris, so this revision will affect many systems. The pop depreciation will probably be continuous (x% depreciation each month), which (to me at least) gives a nice half-life curve, as if some people are staying on their savings longer or something. Resettlement should either work with an immediate resettlement multiplier of one billion people, as it does now, or move to a system of resettling x people per month. However, with a billion people as a population, the volume of actual thematic remakes is still manageable.
This forces us to take a stand on partial pops. If there are 42.65 billion people on earth, what do we do with 650 million? Do they come to work, do part of the work, or even be excluded from work? What relationship do we have with children, the elderly and the weak? The figures used in the calculations are all people of working age, but showing the total number of people seems a bit out of place when it is only a count of the working age population. You can get around this by calling a billion pops and having the pops be a fraction (instead of 13,562,870 people, you’d have 13,562870 pops – rounded to 13.6 in the assignment, of course).
It was essentially an exercise in thinking together about the mechanics and performance of the games. In my opinion, this goes way beyond a mod, because it requires a modification of the game engine. If anyone at Paradox is reading this, you are free to follow the idea or, if not, not follow it. I know how the code works, but I don’t know how your code works, and one or more elements may be wrong, technically impossible, or just undesirable from a game design standpoint.
Although my solution is asymptotically faster than the current system, this does not mean that it is faster in practice. It will eventually get faster as n grows, but the tipping point may not come until every planet has 1000 or 10,000 dolls – and that’s a lot more than it has now. There are also problems related to biodiversity, which can reach impossible levels, but we have come up with possible solutions to this problem.
However, I have described an alternative to modern pop mechanics that (in my opinion) should decouple productivity from the number of pops, so that the galactic population can grow unhindered without disrupting productivity. I know that pops aren’t the only source of endgame performance problems (the AI probably takes longer too, as its empires grow and fleets expand, etc.), and my proposal requires radical gameplay changes – even though I’ve tried to emulate the essence of the current mechanics, which I think are very good.
Acknowledgement of receipt
I’d like to thank you/Lucky-Surround-1756 and you/xXPalpatineXx, in whose conversations this idea originated, and Paradox for making this damn game.
I also want to thank Wiki 2, for reasons that should be obvious (including the fact that it exists). Come to think of it, this is my sneaky attempt to get PDS to make a wiki in space instead of Wiki 3.
EDIT: I just realized how long it took me, I need to study, lol. As an apprentice compiler, I think this is at least important.
2020 will satisfy both classic and modern players. To be on the list, the game must be confirmed for 2020, or there must be a compelling reason for it to be released that year. Upcoming games that are only announced and do not have a major release date are therefore not eligible.
By 2020, there will be a ton of… in the world of video games. Here are fifteen games to look forward to in the first half of 2020.
stellaris how to resettle popsstellaris migration treatystellaris pop growthstellaris expel excess populationstellaris pop resettlementstellaris fastest pop growth,People also search for,Privacy settings,How Search works,stellaris how to resettle pops,stellaris migration treaty,stellaris pop growth,stellaris expel excess population,stellaris pop resettlement,stellaris fastest pop growth,stellaris how to increase population,stellaris pop growth tips