- 前の記事では何回で終了するかわからない打ち切りゲームについて考えた
- 少し複雑にしよう
- こちらで交叉組み換えの計算を行列に乗せていた
- 行列に乗せると個々の計算を忘れられるのがよいのと、行列計算はコンピュータが(Rが)、軽い動作で実行してくれるから
- そのメリットを享受するためには、少し我慢をして、複雑な場合わけをすることにする(推移行列を大きくする)ことにする
- 題材は野球の得点分布(こちら)
- 野球の得点分布を出すのも、「いつになったらスリーアウトになるかわからない」ので、打ち切り型のゲームである
- 野球よりもう少し単純なモデルで考えた上で、野球の1イニングの得点分布を作るソースを書こう
- C枚のカードがある()
- C個の袋がある()
- 今、必ずのカードから始めるのだが、次のカードをどれにするかは、カードを持っているときには番目の袋に入れてある札(0,1,2,...,Cの数字が書いてある)を引いて、札に書いてある数字のカードに持ち替えることにする。ただし、0の札を引いたら、カードは持ち替えない。ただし、番目の袋に入っている札の枚数はそれぞれ違うものとする
- 0のカードをn回引いたら、終了することにする。
- C枚のカードには、それぞれ、減点数が決まっているので、終了時点では、終了までにN回、札を引いたとしたら、を、このときの得点とすることにしている
- さて、何点とる確率がどれくらいになるだろうか
- i回の札を引いた時点で、C枚のうちのどのカードを持っているかは、推移行列Mを用いてで表される。ただしは、C枚のカードのどれを持っているかの確率ベクトル
- また、この時点で0を引いた回数は0,1,2,...,n回のうちのいずれか。
- 子供との「おわりー」と同じように考えよう
- i回引いた時点で、0を引いた回数が0,1,2,...,n回のそれぞれの場合にベクトルSが求まる
- これをすべて格納しつつ、どんどんと回数を増やしていき、0引き回数がn回までの確率を求め続けることは、ただの行列計算
- さて、野球。
- 掲載図は32x32推移行列
- i行j列成分は状態jから状態iへの推移確率
- アウトが3より大きくなる場合も「起こり得る」ものとし、その上で、そのような状態については計算しないことにした「ちぎれた推移行列」であることに注意
- アウトにならない場合(1,2,3,4塁打)はアウト数が同じ領域(8x8スペース)での変化
- アウトになる場合(0)は、アウト数を1つ増やしながら、ベースの埋まり方は変えない変化
- アウト数が減ったり、2個以上増えたりすることはない様子もわかる
library(MCMCpack)
Nmember<-9
Mlist<-list()
for(s in 1:Nmember){
b<-c(rdirichlet(1,rep(1,5)))
m<-matrix(c(rep(b[4],8),c(b[1],0,0,b[1],0,0,0,0),c(b[2],0,b[2],b[2],0,0,b[2],0),rep(b[3],8),
c(0,b[1],0,0,0,b[1],0,0),c(0,0,b[1],0,0,0,b[1],0),c(0,b[2],0,0,b[2],b[2],0,b[2]),c(0,0,0,0,b[1],0,0,b[1])),8,8,byrow=TRUE)
M<-matrix(0,4*8,4*8)
for(i in 1:8){
for(j in 1:8){
M[i,j]<-M[i+8,j+8]<-M[i+16,j+16]<-M[i+24,j+24]<-m[i,j]
}
}
for(i in 1:(3*8)){
M[i+8,i]<-b[5]
}
Mlist[[s]]<-M
}
v<-c(1,rep(0,7+8*3))
library(expm)
TrialMax<-100
vs<-matrix(0,TrialMax,length(v))
vs[1,]<-v
counter<-1
for(i in 2:TrialMax){
effectivevs<-vs[i-1,]
effectivevs[25:32]<-0
vs[i,]<-Mlist[[counter]]%*%effectivevs[]
counter<-counter+1
if(counter==Nmember){
counter<-1
}
}
matplot(vs,type="l")
ZanruiProb<-vs[,25:32]
ZanruiPenalty<-c(0,1,1,1,2,2,2,3)
PointMatrix<-matrix(rep(1:TrialMax,8),ncol=8)
PointMatrix<-t(t(PointMatrix)-ZanruiPenalty)
Points<-c(PointMatrix)
Probs<-c(ZanruiProb)
maxPoint<-max(Points)
ProbPerPoints<-0:maxPoint
for(i in 1:length(ProbPerPoints)){
tmp<-which(Points==i)
ProbPerPoints[i]<-sum(Probs[tmp])
}
plot(0:maxPoint,ProbPerPoints,type="b")