【java】轮盘赌算法原理与实现

1.基本思想

个体被选中的概率与其适应度函数值(或已知频率)成正比。
设群体大小为n,个体i的适应度为Fi,则个体i被选中遗传到下一代群体的概率为:
P i = F i / i = 1 n F i P_{i}=F_{i} / \sum_{i=1}^{n} F_{i}

2.工作过程

设想群体全部个体的适当性分数由一张饼图来代表 (见图)。
在这里插入图片描述
群体中每一染色体指定饼图中一个小块。块的大小与染色体的适应性分数成比例,适应性分数愈高,它在饼图中对应的小块所占面积也愈大。为了选取一个染色体,要做的就是旋转这个轮子,直到轮盘停止时,看指针停止在哪一块上,就选中与它对应的那个染色体。
在这里插入图片描述
若产生的随机数是0.81,则6号个体被选中。

3.算法实现

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Test {
	//String 可以为任意类型 也可以自定义类型
	static Map<String, Integer> keyChanceMap = new HashMap<String,Integer>();
	static{
		keyChanceMap.put("出现比例为10的", 10);
		keyChanceMap.put("出现比例为100的", 100);
		keyChanceMap.put("出现比例为500的", 500);
		keyChanceMap.put("出现比例为1000的", 1000);
		keyChanceMap.put("出现比例为10000的", 10000);
	}
	
	public static void main(String[] args) {
		Map<String, Integer> count = new HashMap<String,Integer>();
        for (int i = 0; i < 100000; i++) {
          
            String item = chanceSelect(keyChanceMap);
            
            if (count.containsKey(item)) {
                count.put(item, count.get(item) + 1);
            } else {
                count.put(item, 1);
            }
        }
        
        for(String id : count.keySet()){
            System.out.println(id+"\t出现了 "+count.get(id)+" 次");
        }
	}
 
	public static String chanceSelect(Map<String, Integer> keyChanceMap) { 
        if(keyChanceMap == null || keyChanceMap.size() == 0)  
             return null;  
          
        Integer sum = 0;  
        for (Integer value : keyChanceMap.values()) {  
             sum += value;  
        }  
        // 从1开始  
        Integer rand = new Random().nextInt(sum) + 1;  
          
        for (Map.Entry<String, Integer> entry : keyChanceMap.entrySet()) {
            rand -= entry.getValue();
            // 选中
            if (rand <= 0) {
            	String item = entry.getKey();
                return item;
            }
        } 
        return null;  
   }
}

结果:

出现比例为10000的	出现了 86157 次
出现比例为100的	出现了 879 次
出现比例为500的	出现了 4422 次
出现比例为1000的	出现了 8461 次
出现比例为10的	出现了 81 次
发布了192 篇原创文章 · 获赞 318 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/zyxhangiian123456789/article/details/102789332
今日推荐