1/31 MIKUセミナー

MikuHatsune2011-01-31

打順最適化をして確率計算で出した得点分布と、対戦シミュレーションの結果がおかしい話。
(リンクでは総当たり戦しか書いていない。_{people}C_{2}通りの対戦もすぐできる。)
チーム1T_{1}とチーム2T_{2}が、1イニングである得点k点(0\leq{k})を取る確率がp(k)だとすると
P_{T_{1}}=(p_{1}(0),\hspace{5}p_{1}(1),\hspace{5},p_{1}(2),\hspace{5},,,\hspace{5},p_{1}(\infty))
P_{T_{2}}=(p_{2}(0),\hspace{5}p_{2}(1),\hspace{5},p_{2}(2),\hspace{5},,,\hspace{5},p_{2}(\infty))
(実際には\inftyまで得点は取れないけど。)
一般にチームiでは
P_{T_{i}}=\{p_{i}(k)\hspace{5}|\hspace{5}(0\leq{k})\}
\sum_{i=0}^{\infty}{p_{i}(k)}=1
ここで、チーム1がチーム2に勝つ確率は、
T_{1}がi点取ったときに、T_{2}が(i-1)点以下の得点
のときだから
E_{T_{1}win}=\sum_{i=1}^{\infty}p_{1}(i)\hspace{3}\sum_{j=0}^{i-1}p_{2}(j)
R的には行列として処理できそう

p1*t(p2)

とでもすれば得点確率の総当たりは簡単に出せて
\begin{matrix}&p_{1}(0)&p_{1}(1)&p_{1}(2)&\dots&p_{1}(k)&\dots&p_{1}(\infty)\\p_{2}(0)&draw&win&win&&win&&win\\p_{2}(1)&lose&draw&win&&win&&win\\p_{2}(2)&lose&lose&draw&&win&&win\\\vdots\\p_{2}(k)&&&&&draw\\\vdots\\p_{2}(\infty)&lose&lose&lose&&lose&&draw\end{matrix}
となり

diag
upper.tri
lower.tri

ですぐ拾ってこれる。
で、今まではちょっと楽しいからって2010年の阪神を使っていたけど、バグ取りが面倒くさい難しいので

Nbase<- 4
people<- 9
T<- rbind(c(rep(0,Nbase),1),matrix(c(1-0.1*Nbase,rep(0.1,Nbase)),people-1,Nbase+1,byrow=TRUE))
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]<- T[b[t,],]
}

という分かりやすいチームアレイ使っていこうぜ!

par(mfrow=c(3,3))
for(i in 1:people){
  image(team.array[,,i],main=i)
}

少なくともチームアレイ作成は問題ない。