演算法題——投籃比賽獲勝概率問題

萬倉一黍發表於2013-12-05

問題描述:

甲乙兩人比賽投籃。約定甲先投籃,每人投籃投進一球,則繼續投球,若投失一球,則換人投球。初始積分為1分,甲每投進一球,積分加1分;乙每投進1球,積分減1分。若積分達到N分(N>1),甲獲勝;若積分減至0分,乙獲勝。假定甲投進的概率為P1(0<P1<1),乙投進的概率為P2(0<P2<1)。那麼這場投籃比賽,甲獲勝的概率P為多少?

 

 

很顯然的,甲獲勝的概率P是和P1、P2、N相關的。

P1越大,P越大

P2越大,P越小

N越大,P越小

 

不失一般性,假設P1=0.7,P2=0.3,N=4,求甲獲勝的概率P

 

解法一:大數量模擬法(10000000次)

 

在前文 演算法題——投籃比賽獲勝的概率 中介紹的就是這種方法。

用計算機模擬10000000次比賽的過程,統計甲獲勝的次數。然後甲獲勝的次數比上總次數接近甲獲勝的概率。

一共模擬了10批次的比賽,每批次模擬10000000次比賽的過程(P1=0.7,P2=0.3,N=4)

第1批次,甲獲勝8282467次

第2批次,甲獲勝8282839次

第3批次,甲獲勝8283808次

第4批次,甲獲勝8281636次

第5批次,甲獲勝8282652次

第6批次,甲獲勝8283432次

第7批次,甲獲勝8281948次

第8批次,甲獲勝8284125次

第9批次,甲獲勝8284626次

第10批次,甲獲勝8283720次

 

平均10個批次,平均甲獲勝8283125次。那麼甲獲勝的概率大約是82.83125%

 

 

解法二:矩陣法

 

解法一是建立在大量的模擬上,所得的資料離理論值還是有一定的偏差的(模擬的次數越多,偏差值越小)。那麼,本方法就是從理論上來計算甲獲勝的概率P的。

 

分析該問題,可以得出整個問題存在8個狀態(狀態的個數和N有關,狀態的個數為2N個)

分別是

積分0分,乙獲勝

積分1分,乙要投籃;積分1分,甲要投籃

積分2分,乙要投籃;積分2分,甲要投籃

積分3分,乙要投籃;積分3分,甲要投籃

積分4分,甲獲勝

 

這8個狀態之間的關係可以用下圖表示(為了後文表述方便,給這8個狀態起了名字,分別是S1、S2、S3、……、S7、S8

image

 

如圖,比賽初始是在S1狀態,比賽結束在S7(甲獲勝)或S8(乙獲勝)狀態,狀態之間有轉換箭頭。

例如:當前是S3狀態(積分3,甲投籃),那麼下一個狀態可能是S6(甲投失,換成積分3,乙投籃的狀態)或者是S7(甲投進,積分4,甲獲勝的狀態)。再比如當前是S6狀態(積分3,乙投籃),那麼下一個狀態可能是S5(乙投進,換成積分2,乙投籃的狀態)或者是S3(乙投失,換成積分3,甲投籃的狀態)

 

 

用A1、A2、A3、A4、A5、A6、A7、A8表示某次投籃後,各個狀態所佔的比重。那麼再投籃一次後,各個狀態的所佔比重計算如下(等號左邊是新的比重,等號右邊是原來的比重):

A1=A4(1-P2

A2=A1P1+A5(1-P2

A3=A2P1+A6(1-P2

A4=A5P2+A1(1-P1

A5=A6P2+A2(1-P1

A6=A3(1-P1

A7=A3P1+A7

A8=A4P2+A8

 

可以把上面的計算式子轉換為矩陣的形式

令向量Ti=(A1、A2、A3、A4、A5、A6、A7、A8表示第i次(i=0時表示初始狀態)投籃各狀態所佔比重的向量,則

Ti+1=Ti×A

 

其中,A為8*8的矩陣,如下圖所示

image

 

因為

T1=T0×A

T2=T1×A=T0×A×A=T0×A2

T3=T2×A=T0×A2×A=T0×A3

……

TM=T0×AM

 

實際上,本題中的甲獲勝的概率就是當M趨向於無窮時,TM的A7分量。同時,TM的A8分量表示乙獲勝的概率

把上面的矩陣A分成四個小矩陣Q1、Q2、Q3、Q4,如下圖所示:

image

 

image

 

 

由於TM=T0×AM,故在這兒分析AM

 

image

 

 

由於矩陣I-Q1可逆,則上述的表示式可以簡化為

Q1M-1+Q1M-2+…+Q1+I=(Q1M-1+Q1M-2+…+Q1+I)(I-Q1)(I-Q1-1

=(Q1M-1+Q1M-2+…+Q1+I-Q1M-Q1M-1-…-Q1)(I-Q1-1

=(I-Q1M)(I-Q1-1

 

 

於是矩陣AM就簡化成如下形式

image

 

 

對於矩陣Q1來說。由於是非負矩陣,根據G. Frobenius可知,它的譜半徑ρ滿足不等式,r≤ρ≤R。其中r表示G1矩陣中所有行和值(一行所有元素加起來的值)的最小值,R表示G1矩陣中所有行和值最大值。可知R=1,r=MIN(1-P1,1-P2

 

而在李華所著的《非負矩陣譜半徑的一個新估計》中,將譜半徑的範圍縮小

 

得到如下的不等式

r≤ρ≤R-(1-P2)(R-r)/R

 

由此可以得知Q1的譜半徑ρ<1

而利用譜半徑的性質可知,當譜半徑ρ<1時,矩陣Q1的M次方趨向於0矩陣

image

 

於是本問題就得出了結論,令T為TM中M趨向無窮大時的向量,A*為AM中M趨向無窮大時的矩陣。可知

 

T=T0×A*

 

 

本題中P1=0.7,P2=0.3,T0=(1,0,0,0,0,0,0,0)

 

矩陣A和矩陣A*分別為

image

 

於是

T=T0×A*=(0,0,0,0,0,0,0.828302342,0.171697658)

 

甲獲勝的概率是82.8302342%,乙獲勝的概率是17.1697658%

 

和方法一的結論比較(82.83125%),還是非常接近的。也間接說明了方法一的可行性。

 

 

本方法從理論的角度給出了問題的解。本示例中,P1=0.7,P2=0.3,N=4

本方法的計算難點就是求(I-Q1-1,這是一個消耗大量計算時間的過程。Q1是一個2N-2*2N-2的稀疏矩陣,I-Q1也是一個2N-2*2N-2的稀疏矩陣,求它的逆矩陣是非常耗時的

 

 

可以在本方法的理論基礎上,給出簡化的計算方法,也就是接下來講的迭代法

 

解法三:迭代法

迭代法的理論基礎在解法二上

依次計算向量T1、T2、……、TM等等

若TM+1-TM≈0(若每個分量小於10-9,我們就認為兩個向量相等),

 

還是以上面的示例為例(P1=0.7,P2=0.3,N=4)

 

T1=(0,0.7,0,0.3,0,0,0,0)

T2=(0.21,0,0.49,0,0.21,0,0,0.09)

T3=(0,0.294,0,0.126,0,0.147,0.343,0.09)

T4=(0.0882,0,0.3087,0,0.1323,0,0.343,0.1278)

T5=(0,0.15435,0,0.06615,0,0.09261,0.55909,0.1278)

T6=(0.046305,0,0.172872,0,0.074088,0,0.55909,0.147645)

T7=(0,0.0842751,0,0.0361179,0,0.0518616,0.6801004,0.147645)

T8=(0.02528253,0,0.09529569,0,0.04084101,0,0.6801004,0.15848037)

T9=(0,0.046286478,0,0.019837062,0,0.028588707,0.746807383,0.15848037)

T10=(0.013885943,0,0.05241263,0,0.022462556,0,0.746807383,0.164431489)

T11=(0,0.025443949,0,0.01090455,0,0.015723789,0.783496224,0.164431489)

T12=(0.007633185,0,0.028817417,0,0.012350321,0,0.783496224,0.167702854)

T13=(0,0.013988454,0,0.005995052,0,0.008645225,0.803668415,0.167702854)

T14=(0.004196536,0,0.015843576,0,0.006790104,0,0.803668415,0.169501369)

……

T71=(0,4.08706E-10,0,1.7516E-10,0,2.52594E-10,0.828302342,0.171697657)

T72=(1.22612E-10,0,4.6291E-10,0,1.9839E-10,0,0.828302342,0.171697658)

 

T72≈T71,故可以認為T=(0,0,0,0,0,0,0.828302342,0.171697658)

 

也就是甲獲勝的概率是82.8302342%,乙獲勝的概率是17.1697658%

 

本方法相比解法二,計算上來得簡單,僅僅通過迭代計算(加加乘乘),就計算出最後的結果。相比求矩陣的逆來說,要簡單的多。

相關文章