バグ取りして修正してみた。
N<-10 #ジャンケンする回数 library(gtools) #とりあえず全通り出す cmb<- combinations(5,N,repeats.allowed=T) num<- nrow(cmb) #A→1、B→2、C→3、D→4、E→5 と変換 ABCDE.count<- matrix(rep(0,5*nrow(cmb)),nc=5) for(i in 1:num){ for(k in 1:N){ if(cmb[i,k]==1){ABCDE.count[i,1]<- ABCDE.count[i,1] + 1} else if(cmb[i,k]==2){ABCDE.count[i,2]<- ABCDE.count[i,2] + 1} else if(cmb[i,k]==3){ABCDE.count[i,3]<- ABCDE.count[i,3] + 1} else if(cmb[i,k]==4){ABCDE.count[i,4]<- ABCDE.count[i,4] + 1} else {ABCDE.count[i,5]<- ABCDE.count[i,5] + 1} } #for.k end } #for.i end gain<- matrix(c(rep(2,nrow(cmb)),rep(1,nrow(cmb)),rep(-1,nrow(cmb)),rep(-2,nrow(cmb)),rep(0,nrow(cmb))),nc=5) step<- gain*ABCDE.count #勝ちパターンだけとってくる行列 win.pattern<- matrix(rep(0,5),nc=5) for(j in 1:num){ if(sum(step[j,])>0){ win.pattern<- rbind(win.pattern,ABCDE.count[j,]) } } #for.j end win.pattern<- win.pattern[c(-1),] #負けパターン lose.pattern<- matrix(rep(0,5),nc=5) for(j in 1:num){ if(sum(step[j,])<0){ lose.pattern<- rbind(lose.pattern,ABCDE.count[j,]) } } #for.j end lose.pattern<- lose.pattern[c(-1),] #引き分けパターン equal.pattern<- matrix(rep(0,5),nc=5) for(j in 1:num){ if(sum(step[j,])==0){ equal.pattern<- rbind(equal.pattern,ABCDE.count[j,]) } } #for.j end equal.pattern<- equal.pattern[c(-1),] library(MCMCpack) p<- rdirichlet(1,c(1,1,1)) #p<- t(rep(1/3,3)) #p<- t(c(0,0,1)) q<- rep(1/3,3) step.matrix<- rbind(c(0,3,-6), #1回のじゃんけんでの相手からみた自分の変位 c(-3,0,6), c(6,-6,0)) pq<- t(p) %*% q #pとqが出すグー、チョキ、パーの掛け合わせ確率 p q pq a<- pq[3,1] + pq[2,3] b<- pq[1,3] c<- pq[2,2] d<- pq[1,3] + pq[3,2] e<- pq[1,1] + pq[2,2] + pq[3,3] #勝ちパターンを足す win.probability<- 0 for(m in 1:nrow(win.pattern)){ win.probability<- win.probability + gamma(sum(win.pattern[m,])+1)/(gamma(win.pattern[m,1]+1)*gamma(win.pattern[m,2]+1)* gamma(win.pattern[m,3]+1)*gamma(win.pattern[m,4]+1)*gamma(win.pattern[m,5]+1))* a^win.pattern[m,1]*b^win.pattern[m,2]*c^win.pattern[m,3]*d^win.pattern[m,4]*e^win.pattern[m,5] } #負けパターンを足す lose.probability<- 0 for(m in 1:nrow(lose.pattern)){ lose.probability<- lose.probability + gamma(sum(lose.pattern[m,])+1)/(gamma(lose.pattern[m,1]+1)*gamma(lose.pattern[m,2]+1)* gamma(lose.pattern[m,3]+1)*gamma(lose.pattern[m,4]+1)*gamma(lose.pattern[m,5]+1))* a^lose.pattern[m,1]*b^lose.pattern[m,2]*c^lose.pattern[m,3]*d^lose.pattern[m,4]*e^lose.pattern[m,5] } #引き分けパターンを足す equal.probability<- 0 for(m in 1:nrow(equal.pattern)){ equal.probability<- equal.probability + gamma(sum(equal.pattern[m,])+1)/(gamma(equal.pattern[m,1]+1)*gamma(equal.pattern[m,2]+1)* gamma(equal.pattern[m,3]+1)*gamma(equal.pattern[m,4]+1)*gamma(equal.pattern[m,5]+1))* a^equal.pattern[m,1]*b^equal.pattern[m,2]*c^equal.pattern[m,3]*d^equal.pattern[m,4]*e^equal.pattern[m,5] } p;win.probability;lose.probability;equal.probability #全パターン足すと1だよね probability<- 0 for(m in 1:nrow(ABCDE.count)){ probability<- probability + gamma(sum(ABCDE.count[m,])+1)/(gamma(ABCDE.count[m,1]+1)*gamma(ABCDE.count[m,2]+1)* gamma(ABCDE.count[m,3]+1)*gamma(ABCDE.count[m,4]+1)*gamma(ABCDE.count[m,5]+1))* a^ABCDE.count[m,1]*b^ABCDE.count[m,2]*c^ABCDE.count[m,3]*d^ABCDE.count[m,4]*e^ABCDE.count[m,5] } p;probability
いくつかやってみた結果
[,1] [,2] [,3] [1,] 0.3333333 0.3333333 0.3333333 #グチパ等確率 win.probability;lose.probability;equal.probability [1] 0.4559446 [1] 0.4559446 [1] 0.08811078 p;win.probability;lose.probability;equal.probability #dirichlet at random [,1] [,2] [,3] [1,] 0.05113552 0.6780277 0.2708368 [1] 0.6388502 [1] 0.2795594 [1] 0.08159043 p;win.probability;lose.probability;equal.probability #グーばっかり [,1] [,2] [,3] [1,] 1 0 0 [1] 0.1691477 [1] 0.7571678 [1] 0.07368457 p;win.probability;lose.probability;equal.probability #チョキばっかり [,1] [,2] [,3] [1,] 0 1 0 [1] 0.7571678 [1] 0.1691477 [1] 0.07368457 p;win.probability;lose.probability;equal.probability #パーばっかり [,1] [,2] [,3] [1,] 0 0 1 [1] 0.4241901 [1] 0.4241901 [1] 0.1516198
相手の手が等確率だったとき、期待値は自分のパーによらなかったから
これはいけてそう。
網羅的にp動かそうかな…
勝てるパターンの選択方法は変えていないので、大きくなるとだめです。
ここはまだ改良できそう。
Rは階乗が!ではないらしい
#n! gamma(n+1) #+1を忘れずに
終わり