按照指定的權重求隨機數

來源:互聯網
上載者:User

標籤:

原文:http://fatelei.github.io/2015/09/08/按照指定的權重求隨機數

描述:通常取隨機數,取到每個數位機率都是一樣,比如取 n 次,取到某個數的機率都是 1/n。現在情況發生了變化,要隨機取的數,每個數字都被設定了一個權值(weight),比如:

上面這個圖表的含義是:進行隨機取數,取到 1 的機率是 1/5,取到 2 機率是 2/5,取到 3 的機率是 2/5。現在要求你使用程式碼完成這個按照不同權值進行取值的過程。

一開始想到方法是:

使用一個數組 value ,數組的下標對應於這個權重的範圍,下標對應的值就是要求的值,比如還是上面這個例子,比如在 1 < x <= 3這個區間範圍內,然後對整個區間長度求隨機值,rand(1, 5) 會得到一個下標值,然後根據這個下標值去擷取想要的值。這個解法的問題是,如果某個值的權值很大,那麼需要一個很大的數組,這樣會非常非常消耗記憶體,顯然不是一個很好的解決方案。不過當時也沒有想到更好的方法。

晚上回來想了想,有沒有可以最佳化的方向

1
2
3
p(x = 1) = 1/5  (x <= 1)
p(x = 2) = 2/5 (1 < x <= 3)
p(x = 3) = 2/5 (3 < x <= 5)

轉換成累積機率:

1
2
3
cp(x = 1) = 1/5 (x <= 1)
cp(x = 2) = 3/5 (1 < x <= 3)
cp(x = 3) = 1 (3 < x <= 5)

有上面這個映射關鍵,在 0 - 1 隨機取一個數 x,如果 x <= cp[i] ,i 就是所要求的結果:

Python 實現

1
2
3
4
5
6
7
import random

def random_by_weight(values, cp):
for v, w in zip(values, cp):
rand = random.randint(0, 1)
if rand <= w:
return v

 

選自:http://blog.csdn.net/v_july_v/article/details/6132775

3.1、選擇運算元

遺傳演算法使用選擇運算對個體進行優勝劣汰操作。

適應度高的個體被遺傳到下一代群體中的機率大;適應度低的個體,被遺傳到下一代群體中的機率小。

選擇操作的任務就是從父代群體中選取一些個體,遺傳到下一代群體。

 

基本遺傳演算法(SGA)中選擇運算元採用輪盤賭選擇方法。

 

Ok,下面就來看下這個輪盤賭的例子,這個例子通俗易懂,對理解選擇運算元協助很大。

輪盤賭選擇方法
輪盤賭選擇又稱比例選擇運算元,其基本思想是:
各個個體被選中的機率與其適應度函數值大小成正比。

設群體大小為N,個體xi 的適應度為 f(xi),則個體xi的選擇機率為:

 

 

輪盤賭選擇法可用如下過程類比來實現:
(1)在[0, 1]內產生一個均勻分布的隨機數r。
(2)若r≤q1,則染色體x1被選中。
(3)若qk-1<r≤qk(2≤k≤N), 則染色體xk被選中。 
其中的qi稱為染色體xi (i=1, 2, …, n)的積累機率, 其計算公式為:

 

積累機率執行個體: 

 

輪盤賭選擇方法的實現步驟:
(1)計算群體中所有個體的適應度值;
(2)計算每個個體的選擇機率;
(3)計算積累機率;
(4)採用類比賭盤操作(即產生0到1之間的隨機數與每個個體遺傳到下一代群體的機率進行匹配)
來確定各個個體是否遺傳到下一代群體中。

例如,有染色體
s1= 13 (01101)
s2= 24 (11000) 
s3= 8   (01000)
s4= 19 (10011)

假定適應度為f(s)=s^2 ,則
f (s1) = f(13) = 13^2 = 169
f (s2) = f(24) = 24^2 = 576
f (s3) = f(8) = 8^2 = 64
f (s4) = f(19) = 19^2 = 361

染色體的選擇機率為:

 

染色體的累計機率為:

 

 

根據上面的式子,可得到:

 

 

例如設從區間[0, 1]中產生4個隨機數: 

 

   r1 = 0.450126,    r2 = 0.110347 

   r3 = 0.572496,    r4 = 0.98503 

 

 

 

按照指定的權重求隨機數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.