Safety
The first step to recommending a move is to filter by safety; safety overrides all other factors when deciding which move to take. For each tile, I simply check that tile in every solution; the tile(s) that have the fewest solutions giving them voltorbs are the safest.
Value
The next filter is by estimated value; this is done by going through each solution for each tile, and seeing which tile averages the highest value across all the solutions (in the actual code, I don’t use averages, I just use sums, because the relative magnitude of the averages is the same as the relative magnitude of the sums, since they all divide by the same number).
Helpfulness
So far we’ve found the safest tiles, and within those tiles, found the ones that are likeliest to be high. Now there’s a third filter, which hasn’t yet been built in to the released code. This filter determines how much the tiles are likely to help the computer. Basically, it looks at each tile, and determines which tiles will most reduce the number of remaining solutions (if it takes out half the remaining solutions, then we’ll be that much more accurate with future calculations).
So we look through each remaining tile, and find the one that maximizes the average number of reductions by putting it into the formula
avg_reductions = P1 * R1 + P2 * R2 + P3 * R3, where P is the probability of an event, and R is the amount of reduction it gives. P can also be expressed as N/T, where N is the number of solutions that have that specific number, and T is the total number of solutions.
Further Math For Efficiency’s Sake
Since the amount of reductions R for any given value is (T –N), this leads to a formula I prefer:
avg_reductions = (N1/T)(T – N1) + (N2/T)(T – N2) + (N3/T)(T – N3)
or
avg_reductions = (Tsum(N1..N3)-sum(N1^2..N3^2))/T
Since all the tiles are going through the formula using the same T, and we only care about relative magnitude, we can forget about the division by T altogether, and it ends up being much simpler to calculate overall.