轮盘赌算法

2023-11-11

轮盘赌长这个样子,每个格子的概率是1/37,我们需要用到的模型如右边这个图,即每个有颜色格子的概率是不同的,整体概率为1。


先撇开遗传算法,觉得上来讲染色体群体的选择 有点不地道。通俗的讲一下我对轮盘赌算法的理解。
右上边饼图不同颜色的区域,面积大小对应着不同的概率,面积越大,代表概率越大。假想把这张图打印到一张纸上,随机扔一把小米,落在3区域的小米相对来说数量最多。好了,现在我一粒一粒的扔,扔了10粒米(意味着只选了10个样本),假如5个落在3区域,3个落在1区域,1个落在4区域,1个落在5区域。


在应用中,比方说,7号米粒利用概率38%(因为落在了3号区域),8号米粒利用概率14%,9号米粒利用概率38%,10号米粒利用概率31%。
这样有什么好处?避免了所有的米粒都选择概率最大的区域3(所谓的最优值问题),换句话,各个概率(各种情况)都相应的被使用到了,避免了陷入局部最优的问题。
问题又来了,实际编程中该怎么用?往下看。


把概率整合到一条线上,然后随机产生数据a,a属于[0,1],比方说



这样,不同的数据对应不同的数据概率,并且整体上还保留了“区域概率越大,对应数据越多”这一分布!

附上代码吧,c语言写的

<span style="font-size:18px;">#include<math.h>
#include<stdio.h>
#include<stdlib.h>

float generate_random()
{
	//randomly generate number between [0,1]
	float rand_num = 0.0;
	rand_num = (float)rand()/RAND_MAX;
	//printf("%f\n", rand_num);
	return rand_num;
}

float *generate_probability_band(float *prob_arr, int length)
{
	//产生概率带
	//传入参数是在main函数中指定的概率分布
	//传出参数就是概率带(积累概率)
	//计算累计概率,保存在sum_array数组中,用malloc写了一下。
	
	printf("一共有%d个概率数据\n",length);

	float *sum_array = NULL;
	float *sum_array_tmp = NULL;
	sum_array = (float *)malloc((length+1)*sizeof(float));//多一个是为了保存概率带最左边那个0
	sum_array_tmp = sum_array;
	int i = 0;
	float sum = 0.0;
	sum_array[0] = 0.0;
	for(i;i<length;i++)
	{
		sum = sum + prob_arr[i];
		printf("sum=%f\n",sum);
		sum_array++;//先执行++,目的是把概率带最左边那个0保存在sum_array[0]上
		*sum_array = sum;
		//printf("%x-->%f\n", sum_array,*sum_array);
		
	}
	//sum_array = sum_array_tmp;
	return sum_array_tmp;
	//free(sum_array);
}

//判断随机数位于概率带的哪个位置
int *judge_random_location(float *sum_array, int length)
{
	
	int i = 0;
	int j = 0;
	float rand_num=0;
	int *count=NULL;
	count = (int *)malloc((length-1)*sizeof(int)); //count数组用来统计 落在某个概率上的数量
	for(i=0;i<length-1;i++)
	{
		//初始化为0
		count[i] = 0;
	}

	for(i=0;i<length;i++)
	{
		printf("sum_array[%d] = %f\n", i, sum_array[i]);
	}

	for(j=0;j<1000;j++) //产生1000个随机数
	{
		rand_num = generate_random();
		if(rand_num>0 && rand_num<1)
		{
			for(i=0;i<length;i++)
			{
				if(rand_num>sum_array[i] && rand_num<=sum_array[i+1])
				{
					//对应的概率带 计数器加1
					count[i] = count[i]+1;
				}

			}
		}
	}
	
	return count;
}
void main()
{
	int i=0;

	//probability array
	float prob_arr[] = {0.1, 0.2, 0.3, 0.4}; //按照概率1:2:3:4
	int length = sizeof(prob_arr)/sizeof(prob_arr[0]);
	float *sum_array = NULL;
	int *count=NULL;

	sum_array = generate_probability_band(prob_arr, length);
	count = judge_random_location(sum_array, length+1);

	for(i=0;i<length;i++)
	{
		printf("%d:", count[i]);
		if(i == (length-1))
			printf("\b");
	}
	printf("\n");
	system("pause");
}</span>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

轮盘赌算法 的相关文章

  • Springboot租房管理平台 计算机毕设源码54739

    摘 要 2l世纪 随看全球经济的逢勃发展 众多经济字豕纷纷提出了新的管理理念 信息管理 强调了用信息支持决策 随着社会的发展 人们又提出了一个新的名词 管理信息系统 管理信息系统在强调信息的现代社会中变的越来越普及 它是一个利用计算机软硬件
  • oracle数据库学习之第三篇(权限及一些常用命令的演示)

    接上篇我们创建了新的数据库 test 由于中间出了很多的问题 所以这次的演示均在原来的数据库orcl上进行演示 同时也将我oracle数据库的版本切换到了11g 连接好数据库后 select name from v database v d

随机推荐

  • 数据分析毕业设计 金融数据分析与可视化系统 - python

    文章目录 0 前言 1 金融风控 一 题目理解 1 1 题目概况 1 2数据概况 1 3预测指标 三 查看数据 四 分类指标计算示例 4 1混淆矩阵 4 2准确度 4 3precision 精确度 recall 召回率 f1 score 4
  • 堆排序的C语言实现

    include
  • 机器学习-----聚类kmeans肘部图、轮廓图的绘制、以及聚类和聚类中心散点图的绘制

    1 kmeans肘部图和轮廓图 import pandas as pd import numpy as np import matplotlib pyplot as plt from sklearn cluster import KMean
  • Ubuntu持久化开放某端口

    1 查看Ubuntu防火墙状态 sudo ufw status 可以看到状态是未开启 2 打开443端口 sudo ufw allow 443 3 开启Ubuntu防火墙 sudo ufw enable 4 查看Ubuntu防火墙状态以及所
  • vue类与样式的绑定&&列表渲染

    目录 1 类与样式的绑定 1 1绑定 HTML class 1 2绑定数组 1 3绑定内联样式 绑定数组 2 列表渲染 2 1v for 2 2v for 与对象 2 3在 v for 里使用范围值 1 类与样式的绑定 1 1绑定 HTML
  • hashcat跑包小秘诀

    跑包工具千万种 小编就介绍一款最强的跑包工具hashcat 其实 抓包这些过程都比较简单 跑包是无线密码破解整个过程的重中之重 核心思路就是穷举密码 暴力破解 这个环节很耗时 小编尝试过许多工具均不理想 速度太慢 完全不能用于实际操作 当然
  • 【转】KVM I/O虚拟化分析

    最近在看多队列的东西 看到下面两篇文章 记录下 以后自己也深入写个这方向的知识 0 背景 当今的I O虚拟化主要有几种模式 1 通过设备的模拟 设备的模拟主要分为两种 一种是直接在VMM中完成模拟 如xen vmware 一种是在另一个应用
  • C++知识系列:C++/CLI简介

    总结 无 参考 C CLI简介
  • 诺禾

    前端必备 css超出显示省略号 强制不换行 自动换行 强制断行 H5代码 Document comrem dfgdsgfd sdffafsdafa dsfaf sdfsaf thgwer awdafqew ljj ljljoi hsgfa
  • 点云数据进行边界提取 (附PCL c++ 代码)

    代码的主要作用是对点云数据进行边界提取 并通过可视化展示边界提取结果 代码的主要流程如下 加载点云数据 计算点云中每个点的法向量 使用边界特征估计算法计算点云中每个点的边界特征 遍历点云中的每个点 提取边界点 可视化展示原始点云和边界点云
  • 【大数据】Flink 详解(二):核心篇 Ⅰ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • js逆向-导出md5加密方法实战(简单)

    简单的随机找一个网站密码加密方法 1 先在登陆页面随便输入账号密码 发送个包 看提交的数据 有password 发现是加密 而且密文是32位 初步猜测是md5 如图 2 复制标记 password 搜索 如图 排除掉hm js 这个是百度统
  • 一步步构建大型网站架构

    之前我简单向大家介绍了各个知名大型网站的架构 亿万用户网站MySpace的成功秘密 Flickr架构 YouTube网站架构 PlentyOfFish 网站架构学习 WikiPedia技术架构学习笔记 这几个都很典型 我们可以从中获取很多有
  • [译]一机多屏的虚拟机方案multivisor

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 创建生命和任务
  • Shell极简入门

    文章目录 简单Shell案例 注释 Shell的变量 shell变量的定义 设置环境变量 位置参数变量 预定义变量 运算符 条件判断 判断语句 流程控制 流程控制 read读取控制台输入 函数 简单Shell案例 使用vim创建一个文件He
  • qt中的fromStdString和fromLatin1

    1 注意将char类型的数在qt中进行转换 void data char data QString str QString fromStdString data 注意这个data为char datal类型的数 2 注意将字节类型的数进行转化
  • es8.8 集群安装笔记

    es8 8 集群安装笔记 配置集群 第一步 修改配置文件 本次安装使用centos8 3节点安装 192 168 182 142 192 168 182 143 192 168 182 144 官网 可以查看详细的安装 安装步骤比较简单 h
  • Java(60):Java 正则表达式(Pattern和Matcher)

    Java 60 Java 正则表达式 一 Pattern类和Matcher类 Java的正则表达式是由java util regex的Pattern和Matcher类实现的 Pattern对象表示经编译的正则表达式 静态的compile 方
  • Zookeeper原理及应用汇总

    1 Zookeeper简介 分布式服务框架 ZooKeeper为分布式应用程序提供高效且可靠的分布式协调服务 提供的服务 配置管理 统一命名服务 分布式同步 组服务等 是Google Chubby的开源实现 Hadoop和Hbase的重要组
  • 轮盘赌算法

    轮盘赌长这个样子 每个格子的概率是1 37 我们需要用到的模型如右边这个图 即每个有颜色格子的概率是不同的 整体概率为1 先撇开遗传算法 觉得上来讲染色体群体的选择 有点不地道 通俗的讲一下我对轮盘赌算法的理解 右上边饼图不同颜色的区域 面