A game theory approach to the Conquest tournament format.

I was bored and ran this problem with a Monte Carlo simulation.

I first programmed a weighted sampling approach as you are suggesting.

Upon just testing values I found weighting the first deck at .99, the second deck at 0, and third deck at 0.01 provided a more optimal win percentage (note the probability of 0 for deck two is only when there are more than one deck). First, the code for the weighted sampling approach using your suggested weights (Written in R):

# Set seed.
set.seed(3009283)

# Create Matrix of probs
probs <- matrix(0,3,3)

probs[1,] <- c(.65,.65,.3)
probs[2,] <- c(.2,.45,.8)
probs[3,] <- c(.9,.45,.25)


# Monte Carlo function for one Match
# Returns 1 if P1 wins, returns 0 if P1 loses
# x: not used
# prbs: probaility matrix
# weight: weights for probability of selecting
oneMatchWeights <- function(x,prbs,weight) {

  # Players start with 3 decks
  p1.deck <- 1:3
  p2.deck <- 1:3

  # Loop until one player wins
  while(length(p1.deck) != 0 & length(p2.deck) != 0) {

    # Calculate weights for remaining decks
    wts <- (1/sum(weight[p1.deck])) * weight[p1.deck]

    # Check if one deck is left
    if(length(p1.deck) > 1) {
      # Sample from weights
      p1 <- sample(p1.deck,1,prob = wts)
    }else {
      # Only one deck to use
      p1 <- p1.deck
    }

    # Assumes Player 2 picks his deck completely random
    if(length(p2.deck) > 1) {
      p2 <- sample(p2.deck,1)
    }else {
      p2 <- p2.deck
    }

    # Draw from binomial with prob equal from matrix based on decks
    result <- rbinom(1,1,prbs[p1,p2])

    # Check for result and eliminate deck
    if(result) {
      p1.deck <- which(p1.deck != p1)
    } else {
      p2.deck <- which(p2.deck != p2)
    }
  }

  # 1 if P1 has no decks left, 0 if P2 has no decks left
  return(as.numeric(length(p1.deck) < length(p2.deck))) 

}

# Run simulation on weights
sim1 <- sapply(1:100000,oneMatchWeights,prbs=probs,weight=c(.19,.37,.44))

# Displays deck selection order followed by probability of winning
mean(sim1)

## OUTPUT FOR THE LAZY
# [1] 0.54309

As you can see I replicated within simulation error the results you achieved for the weights.

I decided to more accurately represent what I was trying to achieve by doing a selection strategy. Deck X will always be first, Deck Y will always be second, Deck Z will always be third. Thus I ran another small simulation that permuted all options Below are the code and results at the bottom (Written in R):

# Load Library for quick permutation
library(gtools)

# Set seed.
set.seed(9732983)

# Create Matrix of probs
probs <- matrix(0,3,3)

probs[1,] <- c(.65,.65,.3)
probs[2,] <- c(.2,.45,.8)
probs[3,] <- c(.9,.45,.25)


# Monte Carlo function for one Match
# Returns 1 if P1 wins, returns 0 if P1 loses
# x: not used
# prbs: probaility matrix
# dOrder: order of deck selection
oneMatchHighLow <- function(x,prbs,dOrder) {

  # Players start with 3 decks
  p1.deck <- 1:3
  p2.deck <- 1:3

  # Loop until one player wins
  while(length(p1.deck) != 0 & length(p2.deck) != 0) {

    # Select deck based on order
    p1 <- which(min(dOrder[p1.deck]) == dOrder)

    # Assumes Player 2 picks his deck completely random
    if(length(p2.deck) > 1) {
      p2 <- sample(p2.deck,1)
    }else {
      p2 <- p2.deck
    }

    # Draw from binomial with prob equal from matrix based on decks
    result <- rbinom(1,1,prbs[p1,p2])

    # Check for result and eliminate deck
    if(result) {
      p1.deck <- which(p1.deck != p1)
    } else {
      p2.deck <- which(p2.deck != p2)
    }

  }

  # 1 if P1 has no decks left, 0 if P2 has no decks left
  return(as.numeric(length(p1.deck) < length(p2.deck)))

}


# Function to run simulation with order vector
# Returns probability after 100,000 samples
simPerm <- function(dOrder) {

  return(mean(sapply(1:100000,oneMatchHighLow,prbs=probs,dOrder=dOrder)))

}

# Obtains a matrix of all permutation order of 1 to 3
perms <- permutations(3,3,1:3)

# Run simulation on all permutations
sim9 <- apply(perms,1,simPerm)

# Displays deck selection order followed by probability of winning
cbind(perms,Probs=sim9)

## OUTPUT FOR THE LAZY
#             Probs
# [1,] 1 2 3 0.45903
# [2,] 1 3 2 0.69414
# [3,] 2 1 3 0.46990
# [4,] 2 3 1 0.49756
# [5,] 3 1 2 0.61420
# [6,] 3 2 1 0.55041

Thus, by this method, the optimal solution for this specific problem is choose deck 1 first (Druid) until you win, choose deck 3 (Warrior) until you win, and finally choose deck 2 (Oil Rogue) until you win.

This gives you an estimated probability of 0.70

Some limitations, this assumes your opponent chooses his deck at random. 100,000 replications per conditions was used (ought to be good enough).

Next I'll permute the weights by increments of 1.

Cheers.

/r/CompetitiveHS Thread