轮盘赌--matlab简单实现

轮盘赌,顾名思义,简单理解就是指赌博中转盘。
轮盘赌算法的基本思想是:各个个体被选中的概率与其适应度函数值大小成正比。
个人的通俗理解是:转盘划分的区域中,那些面积所占比例较大的部分,在转动之后停下来,指针指向它的概率大。
之所以用matlab实现,是因为在遗传算法和蚁群算法中,都涉及到了使用轮盘法则随机选择的问题。

概括起来,是3个步骤:

  1. 根据各部分所占比例(适应度值之间的比例、事件发生的几率等),得到归一化向量
  2. 区间【0,1】上划分区域,即生成区域向量
  3. 生成【0,1】上的随机数,判断其所在区域向量中的位置

举例:
给定A、B、C、D事件的几率数据为 [8 2 7 3],模拟ABCD事件的发生
(其中 ‘8’ 指的是在20次试验中事件A发生8次)

在这个前提下,ABCD中有一个事件发生的话,会是哪一个?

步骤:

  1. 把 [8 2 7 3] 归一化处理,得到 [0.4 0.1 0.35 0.15]
    轮盘赌--matlab简单实现_第1张图片
  2. 设 a = [0.4 0.1 0.35 0.15],利用 cumsum() 函数,得到 b = [0.4000 0.5000 0.8500 1.0000]
    轮盘赌--matlab简单实现_第2张图片
  3. 使用rand,产生【0,1】随机数,再使用find()函数,找到 b 中 大于等于rand的元素的下标,放入select中,select(1)即为所求事件的序号。其中,序号-事件对应关系:1-A,2-B,3-C,4-D , 与原始几率数据一致

matlab代码实现

	data=[8 2 7 3];           % 原始几率数据
	a=data./sum(data);        % 归一化
	b=cumsum(a);              % 区域向量
	select=find(b>=rand);     % 下标数组
	select(1)                 % 事件序号

你可能感兴趣的:(数学建模)