最近算是心浮气躁,每天工作的内容总是不在一个点上,需要搜索一个问题,总是从一个x跳到另一个x,一天下来,虽然感觉貌似知道了很多,但是,实际细思,又发现好多人物没有完成。也许,人总是需要迷茫一段时间吧,今天无意看到了这个问题,刚好前几天媳妇大人也问我这个问题,大概想了一下觉得模拟仿真难度不大,所以就大概仿真得出了如下结果。
- 问题描述
在一个教室中,教授让学生选择1-100中任何一个整数字,优胜者为最接近全班平均数2/3的人.
- 问题分析
因为是模拟,所以必然包括一些假设,同时也得考虑假设的合理性,基于此,大概有如下假设:
- 假设教师里边学生比较多,大家都是有一定的判断力,同时存在某个最聪明的学生,他可以得到最佳答案;
- 假设大家刚开始觉得对方(包括自己)都会随机均匀的从1-100之间选数字;
- 假设思考过程是迭代过程,每次选取的数字都会在前次选择数字的均值周围选取,服从高斯分布;
- 问题仿真
% 在一个教室中教授让学生选择1-100中任何一个整数字,优胜者为最接近全班平均数2/3的人.
% 这个游戏很有意思,因为当1-100随机选择,如果人数够多,平均数肯定是50,那么获胜的数字就是
% 33.而当大多数人选择33时,获胜的数字就该是22,以此类推。所以最优方案应该是:所有学生都选
% 择1.
% 目的:迭代模拟过程
% 作者:姜志宇
% 时间:2014/10/30
% A Starting Point for Myself
% 1 Parameters
num_people = 1000000;
digit_choice = zeros(num_people,1);
num_iter = 100;
var = 10;
figure(1);
% 2.1 Initialization
digit_choice = randi(100,[num_people 1]);
digit_mean = mean(digit_choice);
subplot(311);hist(digit_choice,100);
% 3.1 Iteration
temp_stop = digit_choice;
for iter =1:num_iter
var_iter = round(min(var,digit_mean/3));
digit_choice = round(2/3*digit_mean)+(randi(2*var_iter+1,[num_people 1])-var_iter-1);
digit_mean = mean(digit_choice);
pause(0.3);
[nelements,xcenters] = hist(digit_choice,100);
nelements(find(xcenters<1 & xcenters>100)) = [];
xcenters(find(xcenters<1 & xcenters>100)) = [];
subplot(312);bar(xcenters,nelements);
subplot(313);hold on;plot(iter,digit_mean,'ro');plot(iter,var_iter,'*');
if(temp_stop == digit_choice) % 判断终止条件
disp(sprintf('The last interation is %d\n',iter));
disp(sprintf('The mean of last iteration is %d\n',digit_mean));
break;
else
temp_stop = digit_choice;
end
end
- 结论
最终仿真显示,最优结果应该是1,也满足实际情况。关于参数高斯分布的方差,通过测试多个不同方差,发现对实验结果没有影响,只会影响迭代收敛次数。