-1

RPSゲームを書こうとしています。以下は私のコードです。Rstudio で実行しても何も起こりませんが、基本的な R では、29 行目で「true/false が必要な場所に値がありません」という評価エラーが発生し、プロットでも x、y 軸が等しくない場合にエラーが発生します。なぜそれが間違っているのかについて、私が見逃している単純なものがあるに違いありません。御時間ありがとうございます。

Np<-1200    #pop size
Ng<-300 #generation time    

P<-matrix(data=NA, nrow=Np/2, ncol=2)   #matrix of pop
strategy=c('Ro','Pa','Sc')
P1<-sample(strategy, size=Np, replace=TRUE, prob=c(1/3,1/3,1/3))    #pop with equal probs of any strategy

# "res <- matrix(P1, nrow=Ng, ncol=3)  #matrix for results" # defunct remove!
fR=c()
fP=c()
fS=c()
# result vectors for each strategy

# res<-matrix(NA, ng,3) # matrix as per example. results vectors returned null.

pR<- 0.5
pP<- 0.5
pS<- 0.5
# probabilities of success in each encounter of pX winning.

for(i in 1:Ng) {
    for(j in 1:(Np/2)){
  if(P[j,1]=='Ra'& P[j,2]=="Sc"& runif(1)<pR){P[j,2]<-"Ra"
    }
    if(P[j,1]=='Pa'& P[j,2]=="Sc"& runif(1)<pS){P[j,1]<-"Sc"
    }
    if(P[j,1]=='Sc'& P[j,2]=="Ra"& runif(1)<pR){P[j,1]<-"Ra"
    }
    if(P[j,1]=='Ra'& P[j,2]=="Pa"& runif(1)<pP){P[j,1]<-"Pa"
    }
    if(P[j,1]=='Pa'& P[j,2]=="Ra"& runif(1)<pP){P[j,2]<-"Pa"
    }
    if(P[j,1]=='Sc'& P[j,2]=="Pa"& runif(1)<pS){P[j,2]<-"Sc"
    }
}   # each row fights and winner replaces with appropriate probability.

P[,2]<-sample(P[,2])  #randomise interactions 
fR=c(fR, sum(P=="Ra"))
fP=c(fP, sum(P=="Pa"))
fS=c(fS, sum(P=="Sc"))
}


plot(x=fR,y=Ng, ylab="frequency", xlab="Generation", col="black", type="l")
lines(fP, Ng, col="green")
lines(fS, Ng, col="red")
4

1 に答える 1

1
Error in if (P[j, 1] == "Sc" & P[j, 2] == "Ra" & runif(1) < pR) { : 
  missing value where TRUE/FALSE needed
> i
[1] 1
> j
[1] 1
> str(P)
 logi [1:600, 1:2] NA NA NA NA NA NA ...

ianが 1 の場合はエラーになりjます (他の関数とは異なり、ループが異常終了した場合、for ループのインデックスは最後の割り当てに残ります)。P行列がすべて NA の場合、「==」でテストすることはできません。ifテストが を返すと、関数はエラーを発生させますNA。内側のループ テストをP1?で書くつもりだったのかもしれません。おそらく、これはより幸せなセットアップ メタ戦略になるでしょう。

P<-matrix(data=NA, nrow=Np/2, ncol=2)   
strategy=c('Ro','Pa','Sc')
P[]<-sample(strategy, size=Np, replace=TRUE, prob=c(1/3,1/3,1/3))    
于 2013-02-18T17:29:08.693 に答える