library(dplyr)
library(matchingMarkets)
library(ggplot2)
result_vector <- c(NULL)
for(times in 1:1000){
  student_random_n <- matrix(rep(0,400),nrow = 4)
  for(i in 1:100){
    student_random_n[,i] <- sample(1:10,4)
  }
  
  school_random <- matrix(rep(0,1000),nrow = 100)
  for(i in 1:10){
    school_random[,i] <- sample(1:100,100)
  }
  #match matrix
  match2 <- matrix(rep(0,1000),nrow = 100)
  for(i in 1:100){
    for(j in 1:4){
      k <- student_random_n[j,i]
      match2[i,k] <- 1
    }
  }
  
  for(i in 1:10){
    n=0
    x=1
    rank <- school_random[,i]
    for(j in rank){
      x=x+1
      if(match2[j,i]==1){
        n=n+1
      }
      if(n>=20){
        rank2 <- rank[x:100]
        for(k in rank2){
          match2[k,i] <- 0
        }
        break
      }
    }
  }
  
  #renew preference
  student_random_n2 <- student_random_n
  school_random2 <- school_random
  
  for(i in 1:100){
    for(j in 1:4){
      k <- student_random_n[j,i]
      if(match2[i,k]==0){
        student_random_n2[j,i] <- 0
      }
    }
  }
  for(i in 1:10){
    for(j in 1:100){
      k <- school_random[j,i]
      if(match2[k,i]==0){
        school_random2[j,i] <- 0
      }
    }
  }
  for(i in 1:100){
    for(j in 1:4){
      if(student_random_n2[j,i]==0){
        student_random_n2[,i] <- c(student_random_n2[,i][-j],0)
      }
    }
  }
  
  for(i in 1:10){
    k <- c(NULL)
    for(j in 1:100){
      if(school_random2[j,i]==0){
        k <- c(k,j)
      }
    }
    a <- school_random2[,i][-k]
    b <- rep(0,length(k))
    school_random2[,i] <- c(a,b)
  }
  
  #DA Algorithm
  res_r_r <- hri(s.prefs = student_random_n2,c.prefs = school_random2,nSlots = rep(10,10))
  res2_r_r <- res_r_r$matchings
  res2_r_r <- as.data.frame(filter(res2_r_r,sOptimal==1))
  result <- length(res2_r_r$matching)/length(unique(res2_r_r$matching))
  result_vector[times] <- result
  if(times%%100==0){
    print(times)
  }
}
[1] 100
[1] 200
[1] 300
[1] 400
[1] 500
[1] 600
[1] 700
[1] 800
[1] 900
[1] 1000
resvdf <- data.frame(result=result_vector)
resvdf$times <- c(1:1000)
ggplot(resvdf,aes(result))+
  geom_bar()+
  scale_x_continuous(breaks = c(85:100))+
  geom_vline(aes(xintercept=mean(result)),color="Black", size=1)+
  theme_light()

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobWF0Y2hpbmdNYXJrZXRzKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKYGBge3J9CnJlc3VsdF92ZWN0b3IgPC0gYyhOVUxMKQpmb3IodGltZXMgaW4gMToxMDAwKXsKICBzdHVkZW50X3JhbmRvbV9uIDwtIG1hdHJpeChyZXAoMCw0MDApLG5yb3cgPSA0KQogIGZvcihpIGluIDE6MTAwKXsKICAgIHN0dWRlbnRfcmFuZG9tX25bLGldIDwtIHNhbXBsZSgxOjEwLDQpCiAgfQogIAogIHNjaG9vbF9yYW5kb20gPC0gbWF0cml4KHJlcCgwLDEwMDApLG5yb3cgPSAxMDApCiAgZm9yKGkgaW4gMToxMCl7CiAgICBzY2hvb2xfcmFuZG9tWyxpXSA8LSBzYW1wbGUoMToxMDAsMTAwKQogIH0KICAjbWF0Y2ggbWF0cml4CiAgbWF0Y2gyIDwtIG1hdHJpeChyZXAoMCwxMDAwKSxucm93ID0gMTAwKQogIGZvcihpIGluIDE6MTAwKXsKICAgIGZvcihqIGluIDE6NCl7CiAgICAgIGsgPC0gc3R1ZGVudF9yYW5kb21fbltqLGldCiAgICAgIG1hdGNoMltpLGtdIDwtIDEKICAgIH0KICB9CiAgCiAgZm9yKGkgaW4gMToxMCl7CiAgICBuPTAKICAgIHg9MQogICAgcmFuayA8LSBzY2hvb2xfcmFuZG9tWyxpXQogICAgZm9yKGogaW4gcmFuayl7CiAgICAgIHg9eCsxCiAgICAgIGlmKG1hdGNoMltqLGldPT0xKXsKICAgICAgICBuPW4rMQogICAgICB9CiAgICAgIGlmKG4+PTIwKXsKICAgICAgICByYW5rMiA8LSByYW5rW3g6MTAwXQogICAgICAgIGZvcihrIGluIHJhbmsyKXsKICAgICAgICAgIG1hdGNoMltrLGldIDwtIDAKICAgICAgICB9CiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogIH0KICAKICAjcmVuZXcgcHJlZmVyZW5jZQogIHN0dWRlbnRfcmFuZG9tX24yIDwtIHN0dWRlbnRfcmFuZG9tX24KICBzY2hvb2xfcmFuZG9tMiA8LSBzY2hvb2xfcmFuZG9tCiAgCiAgZm9yKGkgaW4gMToxMDApewogICAgZm9yKGogaW4gMTo0KXsKICAgICAgayA8LSBzdHVkZW50X3JhbmRvbV9uW2osaV0KICAgICAgaWYobWF0Y2gyW2ksa109PTApewogICAgICAgIHN0dWRlbnRfcmFuZG9tX24yW2osaV0gPC0gMAogICAgICB9CiAgICB9CiAgfQogIGZvcihpIGluIDE6MTApewogICAgZm9yKGogaW4gMToxMDApewogICAgICBrIDwtIHNjaG9vbF9yYW5kb21baixpXQogICAgICBpZihtYXRjaDJbayxpXT09MCl7CiAgICAgICAgc2Nob29sX3JhbmRvbTJbaixpXSA8LSAwCiAgICAgIH0KICAgIH0KICB9CiAgZm9yKGkgaW4gMToxMDApewogICAgZm9yKGogaW4gMTo0KXsKICAgICAgaWYoc3R1ZGVudF9yYW5kb21fbjJbaixpXT09MCl7CiAgICAgICAgc3R1ZGVudF9yYW5kb21fbjJbLGldIDwtIGMoc3R1ZGVudF9yYW5kb21fbjJbLGldWy1qXSwwKQogICAgICB9CiAgICB9CiAgfQogIAogIGZvcihpIGluIDE6MTApewogICAgayA8LSBjKE5VTEwpCiAgICBmb3IoaiBpbiAxOjEwMCl7CiAgICAgIGlmKHNjaG9vbF9yYW5kb20yW2osaV09PTApewogICAgICAgIGsgPC0gYyhrLGopCiAgICAgIH0KICAgIH0KICAgIGEgPC0gc2Nob29sX3JhbmRvbTJbLGldWy1rXQogICAgYiA8LSByZXAoMCxsZW5ndGgoaykpCiAgICBzY2hvb2xfcmFuZG9tMlssaV0gPC0gYyhhLGIpCiAgfQogIAogICNEQSBBbGdvcml0aG0KICByZXNfcl9yIDwtIGhyaShzLnByZWZzID0gc3R1ZGVudF9yYW5kb21fbjIsYy5wcmVmcyA9IHNjaG9vbF9yYW5kb20yLG5TbG90cyA9IHJlcCgxMCwxMCkpCiAgcmVzMl9yX3IgPC0gcmVzX3JfciRtYXRjaGluZ3MKICByZXMyX3JfciA8LSBhcy5kYXRhLmZyYW1lKGZpbHRlcihyZXMyX3JfcixzT3B0aW1hbD09MSkpCiAgcmVzdWx0IDwtIGxlbmd0aChyZXMyX3JfciRtYXRjaGluZykvbGVuZ3RoKHVuaXF1ZShyZXMyX3JfciRtYXRjaGluZykpCiAgcmVzdWx0X3ZlY3Rvclt0aW1lc10gPC0gcmVzdWx0CiAgaWYodGltZXMlJTEwMD09MCl7CiAgICBwcmludCh0aW1lcykKICB9Cn0KCgpgYGAKCmBgYHtyfQpyZXN2ZGYgPC0gZGF0YS5mcmFtZShyZXN1bHQ9cmVzdWx0X3ZlY3RvcikKcmVzdmRmJHRpbWVzIDwtIGMoMToxMDAwKQpnZ3Bsb3QocmVzdmRmLGFlcyhyZXN1bHQpKSsKICBnZW9tX2JhcigpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDg1OjEwMCkpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQ9bWVhbihyZXN1bHQpKSxjb2xvcj0iQmxhY2siLCBzaXplPTEpKwogIHRoZW1lX2xpZ2h0KCkKYGBgCgo=