所谓模拟法,就是编写程序模拟现实世界中事物的变化过程,从而完成相应任务的方法。模拟法对算法设计的要求不高,需要按照问题描述的过程编写程序,程序按照问题要求的流程运行,从而求得问题的解。
转盘赌选择策略是先将个体的相对适应值
记为
p
i
,然后根据选择概率{
p
i
,
i
=1,2,…,
N
},按图3
-
1所示把圆盘分成
N
份,其中第
i
扇形的中心角为2π
p
i
。在进行选择时,可以假想转动如图3
-
1所示的圆盘,如果某参照点落入第
i
个扇形内,则选择个体
i
。这种选择策略可以实现如下:先生成一个[0,1]内的随机数,如果
p
1
+
p
2
+…+
p
i
-1
<
r
≤
p
1
+
p
2
+…+
p
i
,则选择个体
i
。显然,小扇区的面积越大,参照点落入其中的概率也越大,即个体的适应值越大,它被选择到的机会也就越多,其基因被遗传到下一代的可能性也越大。
图3-1 转盘器选择
假设各奖项在轮盘上所占比例为
·'一等奖':0~0.08
·'二等奖':0.08~0.3
·'三等奖':0.3~1.0
递进的两个题目如下:
(1)转动轮盘(随机产生一个0~1的数)1万次,输出每个奖项的分布。
提示: 使用字典来完成,首先定义一个字典salary来表示几等奖和它的中奖概率,再构造一个字典now来表示中几等奖的情况(键为几等奖,值为次数)。
运行程序,输出如下:
{'一等奖':(0,0.08),'二等奖':(0.08,0.3),'三等奖':(0.3,1.0)} 中奖情况分布: ('三等奖',6952) ('二等奖',2248) ('一等奖',800)
(2)模拟一个用户转动轮盘的过程。
①输出用户转动10次轮盘的奖项分布情况。
②已知积分:转到一等奖,得5分,转到二等奖,得3分;转到三等奖,得1分。输出用户转动10次的得分情况;
③根据积分领奖品(自己构造奖项就可以)。
·如果大于或等于30分,输出,奖励奥运会吉祥物。
·如果大于或等于20分,小于30分,输出,奖励饮水壶。
·如果大于或等于10分,小于20分,输出,奖励水杯。
·如果大于或等于0,小于10分,输出,奖励小奖品。
运行程序,输出如下:
欢迎参加轮盘赌游戏: 中奖情况分布: ('三等奖', 9) ('二等奖', 1) 积分:12分 奖励水杯!