From release through the present, Netrunner has primarily used double sided swiss as its format for running public tournament. Swiss tournaments means in each round every active player is paired against an opponent. Players are assigned opponents based on the amount of wins they've received so far, such that they're usually playing people with the same overall record. However earlier versions of Aesop's Tables and a lot of evangalism from me have made a few different metas explore Single Sided Swiss. However there were many problems (mostly web dev side) that I couldn't sort out, so I'm going with easier deployment strategies, and hoping it works out better.
Netrunner has historically used Double Sided Swiss, where everyone plays both of their decks against each opponent (in theory, see problems below). So a match has two discreet games of Netrunner in it. Players are awarded points based on the outcome of each individual game. After a certain number of rounds the top N players go into a top cut, which is run as a double elimination bracket. At that point everyone else is done playing, and those 4/8/16 players compete for the top spot. This ends up meaning that the Swiss section is not used to determine final standings (though it does seed the top N), and instead serves as a gating function. The general perception is that seeding does not have a huge impact on the final result, though I'll admit to that particular issue being somewhat less discussed.
As mentioned above, the Swiss into top cut ends up gating peoples performances, and ends up making a gating for what records will be sufficient to make it through to the cut and have a chance to win. For many large events, this record is explicit, for others there is an implicit cutoff. This can be undersirable for many reasons (it's opaqueness to new players should not be understated).
This gating issue becomes particularly problematic in swiss systems because people are matched against people with a similar record. This means that toward the end of the tournament, if say players cannot lose more than X games, every player (called Alex for this example) that has already lost X games will be paired against another player (called Blake) who has also lost X games. If you assume both games are a 50:50 for either player winning, 25% of the time Alex will make it to the cut, 25% Blake will, and 50% of the time they'll both win one of the two games, so neither of them make it into the cut. For both Alex and Blake, they have a higher chance of making the cut if they agree to 2-4-1. Instead of playing both games in their match, Alex and Blake will play the first game, and whoever loses will conceede the second game, guranteeing the other person has enough points to make it through the cut (the loser of the first match already has been eliminated so loses nothing). This means a subset of the players in the top cut will have records with some number of wins, some of which they did not "earn". This distorts placing, and also makes early rounds very impactful relative to later ones.
The main advantage of single sided swiss is that the meta-game element of 2-4-1s is removed. This essentially means the outcome of every game should matter to every player, and meta-gaming the tournament structure should happen in exceedingly rare cases. This reduces the knowledge one needs to have to participate in a tournament, and should better ensure players earn their way to the top cut.
This algorithm is based on an old paper for a chess algorithm, hacked heavily along the way. The basic idea is you make a graph where each player is a node. Then two edges are drawn between every player, with a weight applied to each edge. That weight is determined by the function:
Cost = Score Cost + Side Cost
If two players have already played one set of decks against each other (say Alex has played their corp deck against Blake) that edge is removed from the graph. This way if people have played twice against an opponent, they cannot be paired again. Then an algorithm is used to find the lowest possible total graph weighted sum of pairs.
The score cost is calculated as follows:
Score Cost = (Ascore-Bscore) * (Ascore-Bscore + 1)/2
If player A and B have opposte side biases, the Side Cost is 0, otherwise it is
Side Cost = 8 max(pre-match bias, post-match bias)
Where the pre-match bias is the sum of their two biases before the playing the match, and post-match is their biases after the potential match.
If something breaks, or you want to do this by hand, you can do the following: