打順を変えたときの得点

MikuHatsune2011-01-24

避難所

# パラメータ
library(MCMCpack)
library(gtools)
library(expm)
Nbase<- 4
Nout<- 3
Ninning<- 9
people<- 9
hitp<- 1-colMeans(team)[1]
Vnum<- 100   
cut<- 0.95
# 比較してみたいチーム
Tigars<- rbind(c(0,0,0,0,1),
               c(0.6508972,0.2593801,0.05709625,0.004893964,0.027732463),
               c(0.6504065,0.2926829,0.04471545,0.010162602,0.002032520),
               c(0.6991304,0.2034783,0.05391304,0.010434783,0.033043478),
               c(0.7039007,0.1861702,0.02659574,0.000000000,0.083333333),
               c(0.7592068,0.1614731,0.03399433,0.000000000,0.045325779),
               c(0.6967509,0.1985560,0.05234657,0.000000000,0.052346570),
               c(0.7453416,0.1614907,0.07453416,0.000000000,0.018633540),
               c(0.9000000,0.1000000,0.00000000,0.000000000,0.000000000)
               ) 
b1<- mapply(rep,2:people,1:(people-1))
b2<- mapply(rep,2:people,(people-1):1)
b<-  diag(1,people)
b[upper.tri(b)]<- unlist(b1)
b[lower.tri(b)]<- unlist(b2)
Tigars.array<- array(0,c(people,Nbase+1,2))
team.array<- array(0,c(people,Nbase+1,people))
for(t in 1:people){
  team.array[,,t]<- Tigars[b[t,],]
}
# プログラムに必要な自作関数
num.count<- function(vec){
  counter<- rep(0,Nbase)
  for(result in 1:Nbase){
    counter[result]<- length(which(vec==result))
  }
  return(c(Nout,counter))
}

score<- function(vec){
  runner<- rep(0,Nbase)
  for(k in 1:length(vec)){
      runner<- c(runner,c(1,rep(0,(vec[k] - 1))))
  }
  runner<- runner[1:(length(runner) - (Nbase - 1))]
  return(sum(runner))
}

Prob<- function(vec){
  P<- choose((Nout+length(vec)-1),(Nout-1))*prod((Bprob^num.count(vec)))
  return(c(score(vec),P))
}

multiple.array<- function(Array){
  ArrayMatrix<- Array[,,1]
  for(Ar in 2:dim(Array)[3]){
    ArrayMatrix<- ArrayMatrix %*% Array[,,Ar]
  }
  return(ArrayMatrix)
}

h<- function(vec){
  v<- rep(0,length(vec))
  Ps<- which(vec!=0)
  num<- vec[Ps]
  v[Ps:1]<- Pn[num:(num-Ps+1)]
  if(Ps!=length(vec)){
    v[(Ps+1):length(v)]<- Pn[1:(length(v)-Ps)]
  }else{
    v<- Pn[1:length(v)]
  }
  return(v)
}
# さあ、やろう。
data<- lapply(mapply(rep,0,1:people),unique)
for(q in 1:people){
  team<- team.array[,,q]
  hitp<- 1-colMeans(team)[1]
  m1<- mapply(seq,1:people,people)
  m2<- mapply(seq,1,1:people)
  m<- list(0)
    for(i in 1:(people-1)){
      m<- c(m,list(0))
    } 
    for(y in 1:people){
      m[[y]]<- unique(c(m1[[y]],m2[[y]]))
    }
    TB<- matrix(unlist(m),people,people,byrow=T)           
    team.array<- array(0,c(people,(Nbase+1),people))
      for(k in 1:people){ 
        team.array[,,k]<- team[TB[k,],]
      }
  A<- rep(0,Vnum)
    for(v in 1:Vnum){
      A[v]<- choose((v-1),(Nout-1))*(hitp)^(v-Nout)*(1-hitp)^(Nout-1)*(1-hitp)
    }
  bboxesprob<- head(A,min(which(cumsum(A)>cut)))/
               sum(head(A,min(which(cumsum(A)>cut))))
  Nbatter<- length(bboxesprob)
  Result<- matrix(0,nr=people,nc=(Nbatter-Nout+1))
    dimnames(Result)<- list(1:people,0:(ncol(Result)-1))
    names(dimnames(Result))<- c("1st","Score probability")
  for(ta in 1:dim(team.array)[3]){
    team<- team.array[,,ta]
      if(nrow(team)<Nbatter){
        for(y in 1:(Nbatter %/% nrow(team))){
          team<- rbind(team,team)
        }
      }
    for(batters in 1:(Nbatter-Nout)){
      a<- p<- list(c(2:(Nbase+1)))
        if(batters != 1){
          for(cycles in 1:(batters-1)){
            p<- c(p,a)
          }
        }
    Bpatterns<- expand.grid(p)
    cmb<- combinations(Nout+batters-1,Nout-1)
    Y<- matrix(1,nrow(cmb)*nrow(Bpatterns),(Nout-1)+ncol(Bpatterns))
      for(i in 1:nrow(cmb)){
        for(t in 1:ncol(Bpatterns)){
          Y[(1+nrow(Bpatterns)*(i-1)):((nrow(Bpatterns)*i)),
            (1:ncol(Y))[-c(cmb[i,])][t]] <- Bpatterns[[t]]
        }
      }
    SCORES<- S<- apply((Bpatterns-1),1,score)
      for(i in 1:(nrow(cmb)-1)){
        SCORES<- c(SCORES,S)
      }
    probs<- rep(1,nrow(Y))
      for(NR in 1:nrow(Y)){
        for(NC in 1:ncol(Y)){
          probs[NR]<- probs[NR]*team[NC,Y[NR,NC]]
        }
      }
    probs<- probs*team[ncol(Y)+1,1]
      for(sc in 0:max(SCORES)){
        Result[ta,sc+1]<- Result[ta,sc+1]+sum(probs[which(SCORES==sc)])
      }
  }
  Result[ta,1]<- Result[ta,1]+prod(team[1:Nout,1])
  }
  Result<- Result/rowSums(Result)
#######################################################
  rest<- ceiling(length(bboxesprob)/people)*people-length(bboxesprob)
  bbp<- c(bboxesprob,rep(0,rest))
  bp<- matrix(bbp,nr=ceiling(length(bboxesprob)/people),byrow=T)
  Pn<- colSums(bp)    
  L<- apply(diag(people,people),2,h)   
  t<- c(1,rep(0,people-1))
  R<- matrix(0,people,Ninning)
  R[,1]<- t
    for(i in 2:Ninning){
      R[,i]<- L%*%R[,i-1]
    }
###############################################################
  I<- matrix(0,nr=Ninning,nc=ncol(Result)) # one inning score prob
    for(w in 1:Ninning){
      I[w,]<- colSums(Result*R[,w])
    }
############################################################
  M1<- array(0, 
            c(nr=(ncol(I)-1)*Ninning+ncol(I),
              nc=(ncol(I)-1)*Ninning+1,
              Ninning)
            )
  M <- array(0, 
             c(nr=(ncol(I)-1)*Ninning+1,
               nc=(ncol(I)-1)*Ninning+1,
               Ninning)
            )
  for(b in 1:Ninning){
    M1[1:ncol(I),1,b]<- I[b,] 
      for(j in 2:ncol(M[,,b])){
        M1[j:(ncol(I)+j-1),j,b]<- I[b,]
      }
      M[,,b]<- head(M1[,,b],n=ncol(M1[,,b]))
  }
  m<- M[,1,1]
  GameResult<- t(multiple.array(M)%*%m)
  data[[q]]<- c(GameResult)
}

xg<- max(unlist(lapply(data,length)))
yg<- max(unlist(lapply(data,max)))
xx<- 0:(xg-1)
color<- c("black","red","orange","yellow","green","blue","skyblue","purple","violet")
for(pl in 1:people){
  plot(xx,data[[pl]],type="l",lwd=2,frame=F,xlim=c(0,xg),ylim=c(0,yg),col=color[pl],
       xlab="score",ylab="probability",main="One Game Score Probability"
      )
  par(new=T)
}
axis(1:2)
legend(25,yg,c("1st","2nd","3rd","4th","5th","6th","7th","8th","9th"),
       col=color,lty=1,lwd=3)