2

我正試圖在遺傳算法中實現非均勻概率分佈。如何實現非均勻概率分佈?

在遺傳程序的執行情況,我有具有3分的結果,其中,每個結果具有不同的概率實驗。假設一個結果的概率是0.85,另一個是0.01,最後一個是0.14?

P.S:我最近才知道,它被稱爲概率的非均勻分佈。我正在用Java實現它,任何人都可以告訴非統一概率背後的理論。也可以分發&實現它的任何Java包。

隨意問我,如果u需要對這個問題的任何詳細信息!

在此先感謝!

+0

可以解釋,爲什麼你需要的非均勻概率分配?你是否想要預測你的計算機生成的隨機瓦倫斯?此外,在你的第一句話中,你說你正在創建一個遺傳算法,而在你的第二句話中,你說你正在創建一個遺傳程序......兩者之間略有不同,因此澄清哪一個是好的你在執行嗎? – Kiril 2010-06-22 17:04:17

+0

我的意思是我正在寫一個Java程序實現遺傳算法。 我需要實現非統一的概率是因爲我需要對要執行的操作做出決定。這裏的運作是交叉,突變和繁殖,分別爲0.85,0.01和0.14。我認爲盧卡斯和梅西克斯回答了它!我假設他們的答案是正確的。請隨時讓我知道,如果你有另一個... – Reddy 2010-06-23 18:30:11

+0

我的回答是更好的http://stackoverflow.com/a/15237795/1698887 – 2013-03-07 17:44:12

回答

9

對於一個簡單的離散分佈,你可以寫一個採樣器,將通過累積概率與所需的頻率回報你的成果。

Random r = new Random(); 
double v = r.nextDouble(); 

if (v <= 0.85) { return 0; } 
if (v <= 0.86) { return 1; } 
return 2; 

這將返回數字0,1和2,概率爲0.85,0.01和0.14。

至於非均勻概率分佈的理論,你可以與probability distributions這個維基百科文章開始;請特別注意頁面底部的可摺疊部分。你會發現有幾十個具有不同屬性的不均勻分佈(連續和離散)。

+0

嘿盧卡斯!你能證明你的答案是正確的嗎?不是編碼而是邏輯的東西! – Reddy 2010-06-22 17:01:44

+2

您從[0.0,1.0)上的均勻分佈值開始,然後將間隔切片成與您的概率成比例的部分。 – Lucas 2010-06-22 17:25:14

+1

@Reddy您是否點擊Lucas提供的維基鏈接?如果你通過鏈接挖掘,你會明白爲什麼它的作品。你也可以運行Lucas建議的算法,並且滿足Prob(draw = 0)= 0.85等等。 – vad 2010-06-22 18:31:10

4

在你的特殊情況下,最好在[0; 100)使用均勻分佈,然後檢查它落入的範圍:[0; 85),[85; 99),[99,100)

+0

謝謝nalixx!我猜你和盧卡斯是一樣的... – Reddy 2010-06-23 18:22:49

2

根據您的描述,在我看來,你所談論的健身比例選擇(也稱爲賭輪選擇)。
http://en.wikipedia.org/wiki/Roulette-wheel_selection

我認爲nailxx的答案是一個非常緊湊的描述你需要做的。

又見 Roulette Selection in Genetic Algorithms
Roulette wheel selection algorithm

如果我錯了,這裏是你可能會發現一些有用的庫:
http://www.ee.ucl.ac.uk/~mflanaga/java/Stat.html
http://commons.apache.org/math/apidocs/org/apache/commons/math/random/package-summary.html