必知C++算法之概率基本问题

概率

概率、期望计算(期望是概率和随机变量乘积的总和)

往往利用古典概率进行计算(组合数学)

概率应用

1.利用随机来改进著名算法(快速排序)

2.随机数的发生器(用给定的随机数发生器构造另外一个)

8只球队,有3个强队,其余都是弱队,随机把他们分成4组比赛,每组两个队,问两强不相遇的概率是多大

1.首先求出8只球队分成4组比赛的方法数

7x5x3x1 = 105种

2.没有两强相遇的方法数

在5只弱队中选出3只与强队配对剩下的2只自行配对

C5 3 x A3 3 = 60

3.求两强不相遇的概率为

(105-60)/105 = 3/7

三只蚂蚁从正三角形的三个顶点沿着边移动,速度是相同的,问他们碰头的概率是多少?

每只蚂蚁2种方向,一共三只,所以总共情况为2x2x2 =8种

只有完全顺时针和完全逆时针2种情况不相遇

故此相遇的概率为: (8-2)/8 = 3/4

某地区重男轻女,一个家庭如果出生一个女孩就一直生,直到生出男孩就停止生育。假设一胎就生一个,问时间足够长后,该地区男女比例是会变为多少

答案:时间足够长后,男女比例依然1:1

假设有n个家庭

n/2的家庭第一胎就生出男孩,所以只有1个孩子。

有n/4的家庭先生1女孩,再生1男孩,有2个孩子。

有n/8的家庭线生2女孩,再生1男孩,有3个孩子。

孩子总数为:

n/2+(n/4)x2+(n/8)x3 +(n/16)x4… = 2xn

每个家庭都会有一个男孩,所以2n的孩子中,男孩数为n,所以女孩数也为n。

所以比列依然为1:1

给定一个等概率随机产生15的随机函数,除此之外,不能使用任何额外的随机机制,请实现等概率随机产生17的随机函数

1.根据1~5的随机函数结果减1,得到f() ->0,1,2,3,4

2.f()x5->0,5,10,15,20

3.f()x5+f()->[这两个f()是分别调用,不能化简] 0,1,2,3,4,…24

4.如果步骤3产生的数大于20,则重复进行步骤3,直到产生的结果在0~20之间

5.步骤4的结果将等概率随机产生020,所以步骤4的结果%7之后等概率产生06

6.步骤5的结果加1,将等概率产生1~7

给定一个以p概率产生0,以1-p概率产生1的随机函数f(),p是固定的值,但你并不知道是多少。除此之外也不能使用任何额外的随机机制,请用f()实现等概率随机产生0和1的随机函数。

产生01和10序列的概率都是px(1-p)

循环调用f(),直到能产生01或10,序列终止。

如果产生了01,返回0.

如果产生了10,返回1.

假设函数f()等概率返回一个在[0,1)范围上的浮点数,在[0,1)区间上的数出现的概率为x(0<x<=1)。给定一个大于0的整数k,并且可以使用f()函数,请实现一个函数依然返回在[0,1)范围上的数,但是在[0,x)区间上的数出现在概率为x的k次方。

本题只用调用K次f(),返回较大的数,即可。

给定一个长度为N且没有重复元素的数组arr和一个整数M,实现函数等概率随机打印arr种的M个数(必掌握小技巧)

将随机打印出的数放到arr的尾部

随机一与尾部N-1位置交换

随机二与尾部N-2位置交换

。。。

直到打印M个数即可

还有一个蓄水池抽样算法可自行了解
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<项目介绍> 基于C++实现的改进版遗传算法解决TSP问题源码+项目说明.zip 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 > 旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。 在本文中使用的数据为来自TSPLIB的`ATT48`,即美国本土48个州首府坐标,TSPLIB的已知最优解为10628。 从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。 # 解决思路 由于NPC问题至今没有得到解决,TSP问题往往是通过启发式搜索(我觉得也可以叫暴力)算法来“猜”出最优解。 使用遗传算法来解决TSP问题,主要思路如下: - 使用一个不重复的,首尾相同的字符串来表示一个解,该字符串即TSP的顺序 - 使用交叉,变异两种方式产生新的解,并根据数据来计算解的适应度 - 种群定义为当前所有解的一个集合,当种群中的每个个体完成一次“进化”(由概率决定)之后,称之为进化一代 - 对每一代种群进行筛选(根据适应度进行排序),择优劣汰,具有更优秀适应度的个体有更高的概率被其他个体选中进行交叉 - 不断重复上述过程,直到出现可以完全适应的个体(最优解) 遗传算法在TSP问题上可以融合多种算法,从而达到不同的效果,比如交叉应该如何交叉,变异应该如何变异等等。同时遗传算法的参数难以调整到最优——包括交叉率,变异率,种群容量等可以对搜索过程产生较大影响的参数都难以调整。限于个人水平,我无法从数学上给出最优参数,只能以经验论,加以多次实验选取表现优秀的样本。 # 解决方案 - 语言:C++ - 个体(解)的表示:用`vector`储存,代表节点遍历顺序 - 距离的计算:取伪欧式(pseudo Euclidean)距离,计算方法如下(向上取整): ![](assets/2.png) 使用`unordered_map`,内部实现为散列表,使得计算个体适应度可以达到*O*(N)​级别的复杂度 - 随机数的生成:设置时间种子,并由此生成随机数 - 交叉对象的选择:轮盘赌 - 交叉算法的选择:顺序移位 - 变异算法的选择:顺序移位 / 贪婪倒位 - 参数的选择:由多次实验得出 # Feature - 种群自动扩增 - 贪心初始化 - 自动调整变异算子 - 自动调整变异率 实验记录 - 实验样本:ATT48@TSPLIB(`att48.tsp`) - 理论最优解:10628 - 实验平台:CLion 2019.3(G++ 8.2.1 x64) ## 1000代 | 序号 | 最优解 | 耗时 / s | | ---- | ------- | -------- | | 0 | 12530 | 0.871 | | 1 | 11965 | 1.061 | | 2 | 12571 | 0.904 | | 3 | 11974 | 0.84 | | 4 | 12295 | 1.108 | | 5 | 12528 | 0.793 | | 6 | 12601 | 1.285 | | 7 | 12505 | 0.82 | | 8 | 11605 | 1.096 | | 9 | 12410 | 0.901 | | AVG | 12298.4 | 0.9679 | ## 5000代 | 序号 | 最优解 | 耗时 / s | | ---- | ------- | -------- | | 0 | 10906 | 3.349 | | 1 | 11122 | 3.899 | | 2 | 11265 | 4.49 | | 3 | 11591 | 5.184 | | 4 | 11407 | 6.562 |

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值