一、什么是轮盘赌算法
1、先看一段代码
我在ABC中使用的
% 适应度越高(目标值越小),最终选中概率越高
fitness = [18 19 20];
roulette_wheel = cumsum((1 ./ fitness) / sum(1 ./ fitness)) % 推荐写法
% roulette_wheel = cumsum(1 ./ fitness) / sum(1 ./ fitness) % 也可以,结果完全一样
selected_index = find(roulette_wheel >= rand(), 1);
简单解释下代码:
1)1 ./ fitness 表示数组里每个元素都调用[1/18, 1/19, 1/20]
2)sum() 即数组求和
3)cumsum 表示逐个累加,比如 cumsum([10 20 30]) = [10 10+20 10+20+30] = [10 30 60]
4)roulette_wheel >= rand(),首先rand()为0-1的随机数,假设为0.32, roulette_wheel 假设是 [0.35 0.33 0.31]
则 roulette_wheel >= rand() = [1 1 0]
find([1 1 0], 1) 表示从数组里找第一个不是0的数的下标,返回 1
另外
无论是 fitness = [18 19 20] 或 [20 19 18]; 选择18的概率都是最高的,也就是与顺序无关
2、公式如下
公式1、选择概率(归一化适应度倒数)
即 1 ./ fitness) / sum(1 ./ fitness
即最后一行 selected_index 等于1,2,3的概率
公式2、累加概率分布
即调用 cumsum 函数
3、计算逻辑如下
累计概率分布即 roulette_wheel 的值
二、对比一下不同顺序的影响
我好奇为什么这两个顺序不同,生成的累计概率分布也不同,但是最终获得的概率Pi是基本相同的。
即适应度越高(目标值小的)概率更大
1、查看下累计概率分布
2、概率比较
r = rand()
选择 roulette_wheel >= r 中第一个个体
情况 1:
fitness = [18, 19, 20]
roulette_wheel = [0.352, 0.684, 1.0]
1)当 0 <= r < 0.352 时,命中第一个,即选18的概率为 0.352
2)当 0.352 <= r < 0.684 时,命中第二个,即选19的概率为 0.684-0.352=0.332
3)当 0.684 <= r < 1.0 时,命中第三个,即选20的概率为 1.0-0.684=0.316
情况 2:
fitness = [20, 19, 18]
roulette_wheel = [0.316, 0.648, 1.0]
1)当 0 <= r < 0.316 时,命中第一个,即选20的概率为 0.316
2)当 0.316 <= r < 0.648 时,命中第二个,即选19的概率为 0.648-0.316=0.332
3)当 0.648 <= r < 1.0 时,命中第三个,即选18的概率为 1.0-0.648=0.352
综上比较,发现无论什么顺序,18,19,20的取值概率都是一样的
三、总结
尽管累积概率分布不同,但每个个体的选择概率(归一化后的适应度值)保持一致。
这说明轮盘赌选择法的公平性不受个体顺序的影响,而是由适应度值决定的。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏