[HN Gopher] Pokemon Team Optimization
       ___________________________________________________________________
        
       Pokemon Team Optimization
        
       Author : nchagnet
       Score  : 167 points
       Date   : 2025-12-27 13:38 UTC (5 days ago)
        
 (HTM) web link (nchagnet.pages.dev)
 (TXT) w3m dump (nchagnet.pages.dev)
        
       | yjftsjthsd-h wrote:
       | Small typo(?):
       | 
       | > Mewtwo (#151)
       | 
       | Should be 150
        
         | nchagnet wrote:
         | Thank you, you're right! For some reason I always forget mew
         | comes after mewtwo in the pokedex...
        
           | saghm wrote:
           | I think it's a common mistake. It would be much more
           | intuitive for the one literally labeled "two" to come after;
           | I imagine it doesn't work like that because they wanted the
           | mythical one last.
        
       | tweakimp wrote:
       | Why is y+2x optimal at (0,3) with a value of 3? Isnt it (3,0)
       | with a value of 6?
        
         | abhishekbasu wrote:
         | you're right, it should be (3,0) with optimal obj value of 6.
        
         | nchagnet wrote:
         | Good catch! Especially since I ended up drawing y - x = C but
         | didn't update the legend. I updated it!
        
           | tomtom1337 wrote:
           | Haha, I started reading this, got interrupted, came back and
           | got confused by the graph. Then came to the comments, saw
           | your comment, reloaded the post and voila!
           | 
           | Thank you for a lovely post!
        
       | abhishekbasu wrote:
       | this was a great read to start the new year! having worked
       | extensively with mixed integer programs, it is always a bit
       | disheartening to see them not used enough for everyday decision-
       | making. one of my goals this year is to create a layer to make it
       | easier to formulate mips and test them, via plain text input.
       | this would hopefully increase adoption through a lower barrier to
       | entry.
        
       | stevekemp wrote:
       | Lots of people working in IT have tattoos, I like to see what
       | theme/image overlap they have.
       | 
       | Three people in my current workplace have a balloon tattoo
       | (interestingly all of them are red balloons). Five people in my
       | current workplace have a Pokemon tattoo that is easily visible.
       | 
       | Edit: Including myself, on both counts, I should have said.
        
         | 867-5309 wrote:
         | which Pokemon? gotta name them all! (5)
        
           | stevekemp wrote:
           | I wish I could remember, but offhand all I can say is that we
           | definitely have two pikachus and one snorlax.
        
             | 867-5309 wrote:
             | cool, so probably all first-gen sub 150(?), I lost count
             | after the original lot. I wonder if the generation of
             | person can roughly predict the generation of tattoo :)
        
         | u8080 wrote:
         | >balloon tattoo
         | 
         | What does it mean?
        
           | stevekemp wrote:
           | A tattoo of a balloon! Unless you meant what the meaning of
           | the design was, and in that case different people have
           | different associations and meanings.
           | 
           | One of my forearms is covered in things my son used to be
           | obsessed by when he was young, which is why I have a lego
           | figure, a pikachu, and a red balloon as depicted in the book
           | "Goodnight Moon" which I read to him every night for 3+
           | years.
        
       | unpopularopp wrote:
       | Now all we need is a quick vibe coded web GUI front end
        
         | HelloUsername wrote:
         | Username checks out
        
       | HelloUsername wrote:
       | I would've liked to see in conclusion a recommended starter team
       | per generation! Very nice article!
        
         | nchagnet wrote:
         | I was planning in a future sequel/update to do this but with
         | "better" constraints like only including Pokemon available in a
         | game, etc... Maybe even separate it into early/mid/late-game
         | availability since most optimal Pokemon are late-game anyway.
        
       | reddalo wrote:
       | An interesting thing of this article is that the SVG image of the
       | type matchup [1] has embedded automatic translation.
       | 
       | The type labels will be displayed in the language your browser is
       | set to. I didn't even know this was possible.
       | 
       | [1]
       | https://upload.wikimedia.org/wikipedia/commons/9/97/Pokemon_...
        
         | nchagnet wrote:
         | Oh that's really cool, I didn't know about this! I just linked
         | to the wikimedia-hosted illustration, but that's a good perk
         | too.
        
         | scrollaway wrote:
         | It's using the <switch> tag for this
         | 
         | https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/E...
         | 
         | However, like with many of these obscure features, I am not so
         | sure it works well in practice. I have the Windows 11 laptop
         | I'm viewing that SVG from set with support enabled for english,
         | french and russian, and I'm getting, among most of the English
         | tags, a few stray "Psychique" and "Prividenie" types in the
         | svg. I have no idea how it chooses which one to show, there.
        
           | Sardtok wrote:
           | Just a wild guess, but perhaps the order of the translations
           | vary across cells. Perhaps the browser just picks the first
           | one that matches your supported locales.
        
         | coolness wrote:
         | Wow thats very cool, i was puzzled at first as to why the
         | pokemon types were in Finnish!
        
       | oceansky wrote:
       | Base stat total alone is a bad metric, because stat distribution
       | is equally as important.
       | 
       | If the stats are distributed heavily both on attack and special
       | attack, it's usually bad because you generally want specialist
       | attackers and these stats could be better somewhere else like
       | speed.
        
         | nchagnet wrote:
         | Absolutely! In general I would expect a better model to
         | incorporate a lot of weighed terms in the objective to choose
         | less "extreme" solutions, but here I was mostly interested in
         | illustrating the method.
        
           | oceansky wrote:
           | It was very impressive at that, congratulations.
        
         | TZubiri wrote:
         | You can go for smogon tiers as a proxy for pokemon strength.
        
       | mparnisari wrote:
       | My uni course on optimization was so much fun but I forgot all of
       | it. This was a nice reminder that I should probably revisit the
       | basics :)
        
       | arealaccount wrote:
       | Slaking can only attack every other turn making it a bad choice
       | outside of niche teams.
        
         | nchagnet wrote:
         | I do comment on that in the article, I think it's a nice
         | example of how your model can only know what you tell it (the
         | one I used in the article doesn't know about abilities).
        
       | s_trumpet wrote:
       | Great article but I'd say you're optimizing for the wrong metric
       | here. For in game playthroughs, offense > defense and especially
       | speedy offense beats anything else.
       | 
       | I'd state it as, Given any type, we should be able to hit it for
       | super-effective damage with at least 1 move. And instead of
       | taking raw BST, I'd take Max(SPD+ATK, SPD+SPA) to favour speedy
       | offense.
       | 
       | Of course this does not take into question the thorny question of
       | availability. Metagross is a top tier but only available post
       | game in its debut. On the other hand Crobat and Gyarados are
       | readily available in many of the games early on and evolve fairly
       | quickly.
       | 
       | Please look into the competitive Nuzlocke community, there are a
       | lot of damage calculations and viability spreadsheets all around,
       | you'll find it interesting.
        
         | nchagnet wrote:
         | Thank you for your suggestion, I agree with you (and another
         | commenter) that base stat is not that useful, and availability
         | is actually what I would prioritise on in a next iteration. I
         | tried to keep it simple here, mostly because it was interesting
         | enough as an analysis. But if I were to redo this to get _the
         | best_ team in a generation, I'd definitely go with what you
         | suggested!
        
         | saghm wrote:
         | If we're really trying to optimize for _everything_ , I'd argue
         | two of the biggest factors are move sets and (in generations
         | after 2) abilities. There are Pokemon with great stats but
         | abilities that quite literally are intended to be drawbacks
         | (e.g. Slaking and Regigigas).
        
       | yunusabd wrote:
       | If you find the base game too easy, I can recommend the IronMON
       | challenge: You can only use one mon, permadeath, stats are
       | randomized, all trainer levels are buffed by 1.5x and you can't
       | level up on wilds. Along with numerous other rules to make it
       | harder. There are variants that are borderline impossible to
       | beat, like Super Kaizo IronMON. Out of hundreds of thousands of
       | attempts, it has only been beaten once. Would make for an
       | interesting optimization problem.
       | 
       | https://github.com/PyroMikeGit/SuperKaizoIronMON
        
       | saagarjha wrote:
       | I'm curious how it would rank existing teams-for example, are
       | there trainers who pick better teams (of course, I am sure the
       | bug catchers get soundly trounced). Surely Cynthia or Red have a
       | strong team?
        
       | huevosabio wrote:
       | Love this!
       | 
       | My general problem with Pokemon (at least the older versions,
       | haven't played the latest) is that when playing against others it
       | frequently just boils down to the same set of legendary and
       | overpowered mons.
       | 
       | You sort of addressed this running the milp without certain mons
       | as options, which makes sense.
       | 
       | But you already have the machinery for a better constraint: max
       | total base stat. You could think of it as "weight classes" in
       | box.
       | 
       | So, for a given weight class, your team can only add up to Y in
       | total base stat. You can squeeze one of the OP mons, but then the
       | rest are slackers. Or you could balance them.
       | 
       | It makes it a lot more interesting and invites for diversity. And
       | you could run it for many different values of Y.
        
         | nchagnet wrote:
         | That's a great idea!
        
         | huevosabio wrote:
         | Follow up thought: it would be cool if you imagine a match to
         | consist of three sets each for a different class.
         | 
         | So each player comes with three teams of small, mid and large
         | base stat classes. You can't repeat monster across teams.
         | Whoever wins 2/3 wins the match.
         | 
         | ...
         | 
         | And if this was my college house, we would have a price system
         | for the mons so you wouldn't be able to repeat mons even
         | between players. But that's a different thing altogether.
        
         | oceansky wrote:
         | In competitive Pokemon there are usually different tiers of
         | which Pokemon are accepted. In most legendaries are limited or
         | fully banned.
         | 
         | For the mainline games it usually does not matter. You can beat
         | it with any single Pokemon pretty much.
        
           | 666lumberjack wrote:
           | The median legendary pokemon in any given generation is
           | typically quite mediocre in terms of viability/power, so I'm
           | not sure it's quite correct to say that most tiers are free
           | of legendaries. Even in ZU, the lowest possible tier, you
           | have Pokemon like Mesprit, Regirock and Articuno kicking
           | around in spite of their relatively high stats.
           | 
           | It is completely true to say that the so-called 'box
           | legendaries' specifically - with base stat totals in the
           | 670-700 range - tend to be excellent Pokemon and with rare
           | exceptions are banned from 'standard' formats for being
           | overcentralizing.
        
             | oceansky wrote:
             | I did say "free or restricted" because of that. Like VGC
             | itself limiting to one or two box art legendary.
        
           | scott_w wrote:
           | If anyone wants to see an example of this, JRose11 on YouTube
           | is doing exactly this for Pokemon Red/Blue and putting a list
           | together of completion times. It's been a multi year project
           | but I'd totally recommend starting at the beginning and
           | losing yourself in the rabbit hole.
           | 
           | He also does some bad Pokemon challenges to see if it's
           | possible to finish with, say, a Weedle (mostly no).
        
         | TZubiri wrote:
         | That property is true in most games though, unless it is
         | heavily optimized for 'balance'. Consider Chess, or Poker, or
         | Soccer, if both players play correctly a huge range of
         | strategies are just easily exploitable and thus unplayed.
         | 
         | That said, complexity emerges and explodes in the tiny
         | differences, even if there's like 8 pokemon that are in 95% of
         | teams, and 10 situational pokemon that appear 5% of the times,
         | that's like C(6,8) teams which is like 56 possible teams of
         | Uber pokemon, and a buttload of possible teams with situational
         | pokemon like choice scarf ditto, eviolite Chansey, nuzzle
         | u-turn super fang pachirisu, etc...
         | 
         | Even if the teams were the same, just the possible differences
         | in movesets create a lot of different sets, suppose 6 possible
         | moves for each mon, you have C(4,6) sets for each mon, each
         | with their own probability weight as well.
        
         | j-bos wrote:
         | It's a good idea but base stats aren't everything:
         | https://youtu.be/gEkMi_y3Wzo
         | 
         | That's why the competitive scene maintains a listing of tiers
         | across generations derived from analyzing the actual usages
         | across thoughful battles.
         | https://www.smogon.com/sm/articles/sm_tiers
        
           | JonathonW wrote:
           | There's even a clear example of this in the non-legendary
           | teams: both of them include Slaking, presumably because it
           | has a particularly high base stat total (the highest of any
           | non-legendary, and matching some legendaries).
           | 
           | But Slaking doesn't get that for free-- it has an ability
           | (Truant) that means it can only use moves every other turn.
           | That limits its usefulness outside of a couple very specific
           | scenarios, and means that it'll usually be outperformed by
           | significantly "weaker" Pokemon (going purely by numbers).
           | 
           | And that's just _one_ of the factors you 'd need to take into
           | account to build a team optimizer that's actually useful.
           | Actually building a team has to take into account a massive
           | number of factors: roles for each Pokemon (not just what
           | types they can counter), available movesets, any advantages
           | or disadvantages provided by abilities, your opponents' team
           | composition, etc... it's a big problem to try to solve.
        
         | mort96 wrote:
         | You'd need something which better encapsulates the power level
         | of a pokemon; move pools, abilities, typing and synergies all
         | play a role. There are bad pokemon with a huge base stat total,
         | and a hypothetical pokemon with a tiny base stat total of 50
         | but with ground/poison typing and the wonder guard ability
         | would be an absolute nightmare.
         | 
         | The Smogon tiers (NU, RU, UU, UUBL, OU, Uber) is a thorough
         | attempt at placing all pokemon in tiers based on overall power
         | level and to make interesting balanced matches at different
         | tiers.
        
       | the-smug-one wrote:
       | The SVG chart has internationalization built-in, with multiple
       | languages available. I thought that was cool.
        
       | HelloUsername wrote:
       | Right on time for 30th anniversary!
       | https://xcancel.com/Pokemon_cojp/status/2006379822012911872
       | 
       | Translated text:
       | 
       |  _The 30th anniversary of Pokemon begins! It 's been 30 years
       | since the release of "Pokemon Red and Green." Pokemon will
       | celebrate its 30th anniversary on Friday, February 27, 2026. This
       | year is going to be the best year yet! Stay tuned!
       | #Pokemon30thAnniversary_
        
         | WJW wrote:
         | Red and Blue, surely?
        
           | calumcl wrote:
           | Red and Blue are the international releases of Gen 1 that
           | came out about 2 years after Red/Green.
        
           | Tzk wrote:
           | No. Red and green were released in Japan first. Only
           | afterwards it was red/blue worldwide (and iirc in 98, not
           | 96).
        
       | TZubiri wrote:
       | For games that are as complex as pokemon, it's usually necessary
       | to restrict analysis to some subset. In this case team typing was
       | used.
       | 
       | I personally like restricting to generation 1, as it is very
       | cannonical, very static, and one of the simplest.
       | 
       | Furthermore I like the 1v1 format, which instead of a team, it's
       | just 1 pokemon vs the other. Otherwise you have to resort to
       | heuristics.
       | 
       | But even with a 1v1 and generation 1 restriction it still isn't
       | solved!
       | 
       | Even a single matchup it's very complex to arrive to a
       | theoretical mathematical problem, and still quite burdensome to
       | write a montecarlo simulation.
       | 
       | For example:
       | 
       | Tauros vs gengar (Not an uncommon matchup in competitive gen 1)
       | 
       | Hypnosis has a 60% accuracy, tauros can sleep for 1 to 6 turns
       | with equal probability. Tauros can 2HKO with Earthquake, but can
       | also crit. Gengar can 4HKO, with each crit counting as a double
       | hit (both crits having roughly 20% chance).
       | 
       | The question of who has the advantage is to my knowledge unsolved
       | (also consider that in 1v1 the answer is different, as in teams
       | you only have 1 sleep, so Gengar wastes it). It's also different
       | from the problem of choosing the actual correct move, not only do
       | you need to find the best first move, but in the game decision
       | tree, you need a decision for each node. For example, if Tauros
       | has 60% HP and Gengar has 100%HP, is it still better to go for
       | hypnosis, or better to go for damage and hope for 1 out of 2
       | crits. This is all made more complex by the fact that both mons
       | have a speed tie, so it's yet another probability event of who
       | will attack first.
       | 
       | https://www.smogon.com/forums/threads/gengar-vs-tauros-1v1-w...
       | 
       | For a simple gen 1 with hidden teams, I think there's a bigger
       | game tree than chess, and even Poker. The fact that it's non-
       | stochastic with hidden information makes it very similar to poker
       | analysis wise, I bet Counter Factual Regret Minimization
       | approaches would work as well.
        
       | TobiasJBeers wrote:
       | This thread is a great example of how quickly "optimize X" turns
       | into "define X" when modeling intuition meets player intuition.
        
       | faitswulff wrote:
       | > I was always hunting for Pokemon with better abilities, better
       | type coverage, analyzing synergy between moves... If you've ever
       | played a mainline Pokemon game before, you must know how utterly
       | unnecessary this is. Twenty years ago, I would have just powered
       | through on Blastoise or Typhlosion alone.
       | 
       | I definitely beat the first Pokemon games with a level 100
       | Charizard. I even defeated gyms that were strong against fire
       | types, often KO'ing Pokemon in one hit. The text would say "It's
       | not very effective..." and then the opponent's health bar would
       | drop to zero. So yeah, these games are easy enough that a 10yo
       | can get by with twinking out a single pokemon. Makes the blog
       | post even funnier
        
       | mgaunard wrote:
       | Would have been nice to see with only first gen pokemon which
       | were much better balanced IMHO.
        
         | saghm wrote:
         | I'm not sure that theory bears out. At least in terms of
         | competitive meta, my understanding is that gen 1 is pretty much
         | always the same Pokemon on most teams (although that's also
         | partially from fewer choices and the lack of newer features
         | that provide ways to build alternative strategies like held
         | items and abilities).
        
       | thiago_fm wrote:
       | Meanwhile I like the optimization analysis, the initial
       | assumptions are very wrong. I know the author mentioned that they
       | are optimizing for stats + being resistant to other Pokemon
       | types, but that analysis will lead to very bad results.
       | 
       | There are Pokemon with certain abilities or tricks that makes it
       | much better than legendary ones, with certain move sequences that
       | could wipe the entire other team.
       | 
       | There are also Pokemon with certain types that are actually good
       | against what the 'data' would say otherwise.
       | 
       | Maybe the analysis could be better done if you instead analyzed
       | matches data.
       | 
       | BTW, the way people pay Pokemon since many years is to also
       | divide the Pokemon into tiers and in a competitive setting, you
       | are only allowed to pick Pokemon from the same tier or lower.
       | This adds another level of complexity.
        
         | nchagnet wrote:
         | I generally agree with you on the point that a "good Pokemon
         | team" can be better encapsulated by other attributes, including
         | those you mentioned. I would disagree on assumptions being very
         | wrong, because I am not assuming that the objective and
         | constraints chosen are ideal or even good enough, I am choosing
         | them simple for illustration purposes.
         | 
         | I actually found it interesting that in spite of what is a
         | clearly overly simple model, the non-legendary non-multi-
         | starter you eventually get is quite a good one, in my opinion
         | better than what the naive constraints would lead me to think.
         | 
         | Also, keep in mind that I'm not talking about competitive
         | matches here, just mainline gaming. For that end, types are
         | usually all you need, and in that area the main thing I would
         | do is generalize type constraints to not be just defensive but
         | also ensure each resistant Pokemon has a good enough attack
         | against that type.
         | 
         | In my opinion, abilities, nature, objects are: 1. Too complex
         | for such models (MIPs are still exponential-time) 2. Overkill
         | strategy when all you wanna do is beat the league
         | 
         | But that last part is just my opinion.
        
       | snackdex wrote:
       | damn, everyone is having such well thought out conversations, and
       | I just scrolled to see the Pokemon that were selected.
       | 
       | I think I'm one of those people who worries that if i understand
       | the math of it all, it'll lose some of the magic that made me
       | keep my raticate for no other reason than because it was the
       | first pokemon that accepted me without me dealing any damage to
       | it.
        
         | xlbuttplug2 wrote:
         | I have very fond memories of playing the Pokemon games, but I
         | always saw the battling aspect as a hurdle to unlocking more of
         | the story/world, which was the true appeal to me. I was content
         | turning my brain off and overleveling my mons. Different
         | strokes, I guess.
        
       | erhuve wrote:
       | my goat tyranitar will always be relevant no matter the
       | generation
        
       | vmazi wrote:
       | In professional Pokemon competition, winning is not only
       | dependent on stat distribution of Pokemon in/ev but also the move
       | pool they have access to. Strategies are built up using moves
       | that setup Pokemon in play or Pokemon that will be switched to in
       | such a manner that the stat distributions and or move priority is
       | modified in the users favor. I wonder if there's a way to
       | calculate ideal team not just from stat distributions but the
       | likelihood the available move pool can be linked to a coherent
       | win strategy like stall, trick room switchup, flip turn into
       | swift swim priority and other matchup strategies
        
       ___________________________________________________________________
       (page generated 2026-01-01 23:01 UTC)