关于随机数权重的实现
来源:互联网 发布:u3d捕鱼源码 编辑:程序博客网 时间:2024/05/22 11:19
一、问题定义:
问下有一个数组,这些数组中的值都有自己的权重,怎样设计才能高效的优先取出权重高的数??
例如:
如 权重: 8 2 11 79
权重返回的值: 0 1 2 3
二、分析问题:
思路一:创建一个数组数组大小为权重和的大小,如值0的权重是8,则放入8个0值,值1的权重是2,则放入2个1值,依次类推。
然后用用一个权重和大小的随机数,产生随机数,即可。缺点要占用过多的内存。
思路二:
权重和数组 w[i]存储的是[0,i]元素的所有元素的权重和 时间复杂度O(n) 空间复杂度O(n)
随机[0,W[399]] 看随机数 落在哪个Wi 内就选哪个 时间复杂度 O(longn)
所以总的时间复杂度时间复杂度O(n) 空间复杂度O(n)
伪代码:
轮盘赌 并不是一种特别好的选择算子,但它容易实现。
首先要明白一点,由于交叉、变异等算子,并不能控制进化方向,所以进化的重任落在选择算子上。
如果明白了这一点,就好办了。
轮盘赌,就是积累概率来实现的,通常适应度大的被选择的几率较高。
假如:fit为适应度数组,共m个
for i=1 to m '先求和
sum=sum+fit(i)
next i
For i = 1 To n ‘n-是要生成多少个个体
temp = temp + fit(i)
If rnd <= temp / sum Then
输出 i 就是结果
Exit Function
End If
Next i
三、解决问题:
思路二的代码:
package datastruct;import java.util.HashMap;import java.util.Map;/**权重随机数:如 权重:8 2 11 79 权重返回的值:0 1 2 3@author ajian005 79331356@qq.com2014-2-16 21:12输出结果:{2.0=184128, 11.0=348551, 79.0=1308100, 8.0=159221}*/public class WeightRandomTest {private static double[] weightArrays = {8.0,2.0,11.0,79.0}; // 数组下标是要返回的值,数组值为数组下标的权重public static void main(String[] args) {WeightRandom weightRandom = new WeightRandom();Map<Double, Integer> stat = new HashMap<Double, Integer>();for (int i = 0; i < 2000000; i++) {int weightValue = weightRandom.getWeightRandom(weightArrays);if (weightValue < 0) {continue;}System.out.println("按权重返回的随机数:" + weightValue);if (stat.get(weightArrays[weightValue]) == null) {stat.put(weightArrays[weightValue], 1);} else {stat.put(weightArrays[weightValue], stat.get(weightArrays[weightValue])+1);}}System.out.println(stat);}}class WeightRandom {java.util.Random r = new java.util.Random();private double weightArraySum(double [] weightArrays) {double weightSum = 0;for (double weightValue : weightArrays) {weightSum += weightValue;}return weightSum;}public int getWeightRandom(double [] weightArrays) {double weightSum = weightArraySum(weightArrays);double stepWeightSum = 0;for (int i = 0; i < weightArrays.length; i++) {stepWeightSum += weightArrays[i];if (Math.random() <= stepWeightSum/weightSum) {//System.out.println(i);return i;}}System.out.println("出错误了");return -1;}}
四、归纳总结:
俄罗斯轮盘赌就是积累概率来实现
按权重负载调度等
五、参考资料:
关于随机数权重的交流:http://bbs.csdn.net/topics/390422881
能否说说遗传算法中轮盘赌选择方法的过程: http://wenwen.soso.com/z/q514113741.htm
- 关于随机数权重的实现
- 基于权重的随机数JS实现
- [Python]基于权重的随机数2种实现方式
- 基于Java的轮盘赌随机数(或者说权重随机数)的实现
- 关于权重的理解
- Java带权重的随机数(未测试)
- 权重随机的实现
- 关于css样式的权重
- 生成带权重随机数
- 随机数 权重 概率
- java 权重随机数算法
- 熵权法求权重的Matlab实现
- 关于权重
- 关于百度权重的问题猜想
- 关于自学和找工作的权重
- 关于最新Google域名权重的问题
- STL--关于权重问题的解决
- 关于linearLaout的权重,随手笔记
- mysql系列:常用函数
- 基于alsa驱动架构的pcm播放
- struts2 拦截器整理
- nasm汇编之 BITS
- java 程序加载过程---2-创建类实例对象
- 关于随机数权重的实现
- 深度探讨Java字节代码的操纵方法
- IOS event 拦截
- poj 1681 Painter's Problem(高斯消元)
- 带圆角的EditText
- 备战S4!想上钻石必须注意的20个细节
- 串口与modem流量控制大全(1)
- C优化篇之减少运算量
- mongodb 安装