How the mixer decides matches
Behind the scenes, every participant (you and the virtual characters) gives each person on the other side a score from 0 to 10. Think of this as “how happy I would be to be paired with this person.” So for any possible pair A–B, there are two numbers: A’s score for B and B’s score for A.
For each possible pair, the mixer turns those two one-way scores into a single compatibility value. This value is built to reward mutual attraction and to punish lopsided crushes. Roughly speaking, the lower of the two scores counts more heavily than the higher one, and then the average of the two scores nudges the value up or down. Two people who both rate each other highly get a large compatibility number. If one side is very enthusiastic and the other side is not, the pair’s value is pulled down sharply.
Once all pairwise compatibility values have been computed, the mixer builds a grid (a matrix) where each row is one person on one side and each column is one person on the other side. The entry in row i and column j is the compatibility value for that specific possible pairing.
The problem the mixer then solves is: “Choose a perfect set of one to one pairs so that everyone is matched exactly once, and the sum of all chosen compatibility values is as large as possible.” In algorithm terms, this is a maximum weight matching problem on a bipartite graph. The code solves it using a variant of the Hungarian algorithm (also known as the Kuhn–Munkres algorithm), which is a classic method for optimally assigning items from one set to items in another based on a cost or weight matrix.
Concretely, the algorithm treats high compatibility as “good weight,” flips it into an equivalent “cost” view, and then runs the Hungarian algorithm to find the matching with the smallest total cost. Because of how the flip is done, the matching with the smallest cost is exactly the matching with the largest total compatibility. This gives you a mathematically optimal pairing pattern, according to the mutual liking scores everyone provided.
The virtual characters’ scores are generated using hidden preference profiles and hidden trait profiles. Each virtual person has an internal “type” they tend to like, and each portrait has its own hidden features. The simulator computes how well a given partner fits a given preference profile and then adds a bit of randomness, turning that into a 0–10 score. Your scores are taken exactly as you set them in the UI and treated on equal footing with the virtual scores inside the same matching algorithm.
The end result is that the mixer does not simply reward the most “popular” faces or the loudest crushes. Instead, it systematically tries to pair people so that mutual satisfaction across all pairs is as high as possible, and heavily lopsided pairs tend to appear only when there is no better global arrangement available.