Rozważmy taki problem. Mamy dwie armie. Armia M ma M żołnierzy a armia P ma P żołnierzy. Z prawdopodobieństwem M/(P+M) ginie jeden żołnierz z armii P a z prawdopodobieństwem P(M+P) ginie jeden żołnierz z armii M. W każdej iteracji ginie dokładnie jedna osoba z armii P albo z armii M. Bitwa się kończy gdy liczebność armii M spadnie poniżej 1000 a armii P do zera. Napisałem taki kod:
bitwa=function(M,P){#zdefiniujemy próblem dla różnej liczebności wojska M-Mongole, P-Polacy
SM=c() #stan wojsk mongolskich (w tej chwili pusty wektor)
SP=c() #stan wojsk polskich (w tej chwili pusty wektor)
i=0 #iteracja, zakładamy że zmiany w liczebności będą sie wykonywać po i-tej iteracji
if(M%%1==0 & P%%1==0 && M>=1000 & P>=0){ #liczba wojsk musi byc łiczba całkowita i taka aby spełniac warunki zadania
while(M>999 && P>0){
pM=M/(M+P) #prawdopodobieństwo, że zginie po stronie polskije
a=rbinom(1,1,pM)
pP=P/(M+P)
b=rbinom(1,1,pP)
if(xor(a==1,b==1)==1){
P=P-a
M=M-b
i=i+1
}
else{
i=i
}
SM[i]=M #wpisujemy stan w wosjka w wektor
SP[i]=P
if(i>1000000){#zabezpieczmy się przed nieskończoną bętlą
break
}
next
}
}
else{
print("M musi być wiekszę od 1000 a P od 0. Muszą byc wartości całkowite")
}
par(mfrow = c(1:2))
barplot(SM,main ="Wojska Mongolskie", names.arg = c(1:i), xlab ="iteracja",ylab = "stan wojska", col="green")
barplot(SP,main ="Wojska Polskie", names.arg = c(1:i),xlab="iteracja",ylab ="stan wojska",col="red")
}
bitwa(10000,8000)
Problem w tym kodzie jest taki, iż uwzględnia że w danej iteracji może zginąć żołnierz z armii M i żołnierz z armii P lub może nie zginąć nikt. Takie warunki są niedopuszczalne. Jak to poprawić?