IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【算法】轮盘赌法及其 java 实现 -> 正文阅读

[数据结构与算法]【算法】轮盘赌法及其 java 实现

轮盘赌法及其 java 实现


一、轮盘赌法介绍

轮盘赌法是一种常用的随机算法,在计算机模拟随机应用中广泛使用

其目的,是为了让个体被选择的次数,遵循个体在总体中的适应度及选择概率

选择概率与被选次数的关系

在遗传算法的父代筛选过程中,轮盘赌法被广泛使用


二、轮盘赌法的实现

这里我们要先计算个体适应度占到总适应度的比值,即获取其选择概率(选择概率之和要保证为1)

然后,通过随机选取总概率片段,遍历累加种群的个体选择概率,直到累加和大于或者等于之前获取的随机概率片段,我们就选择它

我借助下面的图来说明一下,0.14 的概率想要被选中,只有在随机片段长度为 0 - 0.14 才有可能,0.49 的概率片段想要被选中,只有在随机概率片段长度为 0.14 - 0.63 才会被选中。可以发现,每个概率片段被选中的可能性与其被选概率是一致的

轮盘赌法实现图示

当然,处于计算机精度的考量,使用小数计算可能会导致种群概率总和小于或大于1,在面对海量数据的情况下,这种微小的差距可能带来难以想象的后果,所以我们也可以使用适应度总适应度代替个体被选概率总概率


三、轮盘赌法的实现代码

public class Roulette {
    private static int iterTime = 100;
    public static void main(String[] args) {
        int[] seq = new int[]{13,7,25,41,14};
        System.out.println("迭代次数为100的情况下,各数被选择的次数分别为:");
        HashMap<Integer, Integer> selectTime = getSelectTime(iterTime, seq);
        for (Integer key : selectTime.keySet()) {
            System.out.println(key+" : "+selectTime.get(key));
        }
    }

    /**
     * 使用轮盘赌法,
     * 获取不同适应度在规定迭代次数内被选择的次数
     * @param iterNum 迭代次数
     * @param seq 种群
     * @return
     */
    public static HashMap<Integer, Integer> getSelectTime(int iterNum, int[] seq) {
        HashMap<Integer, Integer> map = new HashMap<>();
        int total = 0;
        for (int elem : seq) {
            total+=elem;
        }
        for (int i = 0; i < iterNum; i++) {
            double slice = total * Math.random();
            int sum = 0;
            for (int j = 0; j < seq.length; j++) {
                sum+=seq[j];
                if (sum>slice) {
                    map.put(seq[j],map.getOrDefault(seq[j],0)+1);
                    break;
                }
            }
        }
        return map;
    }
}

运行结果如下:

结果1

结果2

结果3

结果4

结果5

可以看到,个体被选择的次数,与其适应度是大致对应的


四、为什么遗传算法中要使用轮盘赌法选择父代

我们知道,遗传算法有一步,是选择两个优秀父代,进行位交换,从而生成两个相对优秀的子代的

位交换

如果说,我们不使用轮盘赌法,那么父代的选择就只剩下两种策略:只选最优随机策略

我来分别探讨一下两种策略的缺点

  • 只选最优

如果我们每次只选最优秀的第 1、2个父代(甚至两个都是最优的那个父代),那么,在第二次迭代后,所有子代的相似度就会非常大(这里之所以不说一样,是因为交换位的生成是随机的)

因为不能保证初始种群的最佳父代就包含了最佳结果,那么,因为子代的变化差异不明显,所以迭代次数会成倍增加。极大地消耗我们的算力和时间,不可取

  • 随机策略

使用随机策略,虽然我们的子代差异性大大增加了,但是如果哪次选择,适应度最差的父代撞了大运,每次都被选中,那么相应的,产生的子代种群适应度总和可能不升反降

我们的算法就会变得十分不稳定,最坏的情况,就是迭代结束之后,种群适应度总和甚至会比初始种群还低


综上所述,轮盘赌法即保证了随机策略的差异性,又保证了父代尽量优秀的特点,所以其是遗传算法交叉步骤中必选的方法

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:50:05  更:2022-03-04 15:51:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:26:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码