設P(i),其中i=1..n,為n個個體被選擇的概率 ,在輪盤上表示為所佔扇區的面積百分比,這裡顯然sum(P)=1。select用來保管n次選擇的結果。
1)第一種完成方法:能夠想象一個轉動的輪盤,留意這裡輪盤最多隻轉一圈。每次轉輪盤前,把色子隨機放到輪盤外緣的某處,即色子不隨輪盤轉動,以一個隨機數sel代表它所處的位置。輪盤轉動後,色子所指示的輪盤扇區號不時變化,輪盤中止時色子所指示的輪盤上扇區號,即為本次輪盤賭所選中的個體號。
for i = 1:n %第i次擲色子
sel = rand; %產生一個0、1之間的隨機數,代表色子在輪盤外緣所指示的位置
sumPs = 0; %輪盤初始轉動的位置,從0變化到1
j = 1; %輪盤初始指示的位置
while sumPs
sumPs = sumPs + P(j) %輪盤轉動
j = j + 1; %輪盤指示位置
end
select(i) = j-1; %輪盤中止時色子停留位置所指示的個體
end %循環終了,會對輪盤上由P所劃分出來的n個區間產生n次隨機選擇,扇區越大,該扇區被選中的機率也越大
還需求留意的是:上面的程序中,我們當然能夠把n改成2*n或者10*n,產生的結果都是“個體概率 所表示扇區越大,該個體被選中的機率也越大”,並且隨著實驗次數的增大,這一結果越準確。
2)這種辦法能夠想象成往劃分好扇區的輪盤裡扔色子,事前生成一組滿足平均散佈的隨機數,代表n次擲色子或者n個色子一同扔,輪盤不動,色子所在區域為選擇結果。
r = rand(1,n) %預先產生n個色子的位置,留意這裡r服從0、1之間平均散佈
for i = 1:n %第i次輪盤賭
select(i) = n; %本次輪盤賭的結果初始化為n
for j = 1:n %輪盤開端轉動
if r(j) <=P(i) %若色子停在輪盤第j扇區
select(i) = j; %則第i次輪盤賭的結果為j
break; %第i次輪盤賭完畢
end %~第i次輪盤賭完畢
end %~第i次輪盤賭完畢
end %n次輪盤賭完畢
下面為完好的matlab程序完成
function Select=Roulette(P,num)
%:按輪盤賭戰略選擇下一點,返回num次輪盤賭結果
%:第一種輪盤賭辦法,精度很低,
% m = length(P);
% Select = zeros(1,num);
% for i=1:num
% Select(i) = m;% 初始化為最後一個
% for j=1:m %:按概率 選擇
% if P(j)>rand()
% Select(i)=j;
% break;
% end
% end
% end
%:第二種輪盤賭辦法,精度較高
m = length(P);
Select = zeros(1,num);
r = rand(1,num);
for i=1:num
sumP = 0;
j = ceil(m*rand); %產生1~m之間的隨機整數
while sumP < r(i)
sumP = sumP + P(mod(j-1,m)+1);
j = j+1;
end
%Select(i) = mod(j-1,m)+1-1;
Select(i) = mod(j-2,m)+1;
end