We define a simple game $G = (P, P, M)$. Each player chooses one Pokémon to battle. The payoff for Player 1 if he uses $x$ and Player 2 uses $y$ is the battle score of $x$ against $y$, $F(x, y)$. This way, the utilities of all Pokémon are factored, and the optimal strategy for each player will be a list of probabilities for each Pokémon, which is then an approximation of the equilibrium meta.

Such game is finite since there are finite Pokémon with finite moves, hence the total combinations are finite. By Nash's Theorem, there must exist at least one optimal strategy. Our goal is to find the optimal strategy given the payoff matrix (battle score matrix).

The first step is to set a pool of Pokémon, $P$, with moves specified. Ideally we should include all different combinations of Pokémon; but that would too many of them. We might start with a dozen of meta-relevant Pokémon. The more Pokémon we include the more accurate the result becomes.

Then we need to obtain the battle score matrix, $M$. $M_{i, j}$ is the battle score of Pokémon $p_{i}$ fighting against Pokémon $p_{j}$. This can be done easily by using the "Battle Matrix" tool of GoBattleSim.

Next, we solve for the game. There are game solving tools available online such as this one. I wrote a little program implementing the Pivot Method introduced by Prof. Thomas S. Ferguson from UCLA in his amazing work Game Theory, Second Edition, 2014, which is optimized to directly accept the GoBattleSim battle matrix as input.

The solution to this game, namely the optimal strategy, will be

$$ (p_{1}, w_{1}), (p_{2}, w_{2}), ..., (p_{n}, w_{n}) $$

where $w_{i}$ is the probability of using Pokémon $p_{i}$. This is then our solution to the equilibrium meta.