临时抱佛脚——国模前三天(2)

2011 CUMCM-B

这篇论文相对来说比之前那篇友好太多,主要是一方面他们用的模型的类型实际上不算多,一是对图论用非线性模型,核心内容是floyd算法,另一方面由于lingo计算较为费事费时,因此由原来的非线性模型改为后面的贪心算法,以此减少算法运行的时间,找到次优解。
但是这篇论文又非常高级,因为它用人人都知道的模型去解题,每个条件列出来都有理有据,每一个问题都得到了确定的答案,展示这个队伍有纯熟的编程和建模技巧,写手的笔力也可见一斑,总体上描述清晰而不拖沓,非常值得初学者学习。
这道题,属于图论的范畴,很多图论问题,比如旅行商问题,往往是TSP问题或者说NP问题,也就是那种有n!或者2^n种情况的题目。这种情况下基本上不可能在有限时间内求得最优解(即使你借到全世界最快的超级计算机),通常我了解到的就是非常常见的那些,比如Dijkstra算法、floyd算法、Kruskal算法(求最小生成树)。
那么有一类算法叫做贪心算法,这个算法,有点神。

贪心算法

其实,与其说贪心算法是一种算法,不如说它是一种考虑问题的思路。因为我们要得到的最优解难以计算,所以我们找到的一个次优方法,当然,有时候贪心算法也可以得到最优解,比如Dijstra算法等等,但是大多数情况下得到的可能都是次优解,但是它的运算速度很快,所以大家更加习惯去用这样一种算法来得到解,尤其是那些规模比较大的解。
另外,贪心算法通常是和它附近的最值进行比较,这也就导致了它会被“一叶障目”,通过比较原则以为自己找到了最优解,但是大部分情况下可能找到的是局部最优解,也就是次优解。

第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大
类比到刚刚的例子,限制值就是重量不能超过 100kg,期望值就是物品的总价值。这组数据就是 5 种豆子。我们从中选出一部分,满足重量不超过 100kg,并且总价值最大。
第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据。
类比到刚刚的例子,我们每次都从剩下的豆子里面,选择单价最高的,也就是重量相同的情况下,对价值贡献最大的豆子。
第三步,我们举几个例子看下贪心算法产生的结果是否是最优的。大部分情况下,举几个例子验证一下就可以了。严格地证明贪心算法的正确性,是非常复杂的,需要涉及比较多的数学推理。
实际上,用贪心算法解决问题的思路,并不总能给出最优解。
主要原因是,前面的选择,会影响后面的选择。如果我们第一步从顶点 S 走到顶点 A,那接下来面对的顶点和边,跟第一步从顶点 S 走到顶点 B,是完全不同的。所以,即便我们第一步选择最优的走法(边最短),但有可能因为这一步选择,导致后面每一步的选择都很糟糕,最终也就无缘全局最优解了。
————————————————
原文链接:https://blog.csdn.net/liushengxi_root/article/details/86676382

最优化方法

因为这篇文章主要是逻辑上非常优秀,我也只能再读一遍,去领会竞赛团队清晰的思路,这里就先记录几个最优化问题中常用的模型。

拟Newton算法

拟牛顿法和最速下降法(Steepest Descent Methods)一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法(Newton’s Method)更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。拟牛顿法是解非线性方程组及最优化计算中最有效的方法之一.它是一类使每步迭代计算量少而又保持超线性收敛的牛顿型迭代法。

emem,好吧,这个超出我的知识范畴了,先记在这里以示敬意。

模拟退火算法

在热力学上,退火(annealing)现象指物体逐渐降温的物理现象,温度愈低,物体的能量状态会低;够低后,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。大自然在缓慢降温(亦即,退火)时,可“找到”最低能量状态:结晶。但是,如果过程过急过快,快速降温(亦称「淬炼」,quenching)时,会导致不是最低能态的非晶形。

还是不太理解?我觉得这个比喻挺有意思。

关于普通Greedy算法与模拟退火,有一个有趣的比喻:
普通Greedy算法:兔子朝着比现在低的地方跳去。它找到了不远处的最低的山谷。但是这座山谷不一定最低的。这就是普通Greedy算法,它不能保证局部最优值就是全局最优值。
模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向低处,也可能踏入平地。但是,它渐渐清醒了并朝最低的方向跳去。这就是模拟退火。

也就是说,模拟退火,实际上就是在找到次优解之后,有一定的概率否定目前的次优解,从而找到新的最优解。

遗传算法

遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。

下面是一个例子,比较爬山算法、模拟退火和遗传算法:

爬山算法:一只袋鼠朝着比现在高的地方跳去。它找到了不远处的最高的山峰。但是这座山不一定是最高峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
模拟退火:袋鼠喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高峰跳去。这就是模拟退火算法。
遗传算法:有很多袋鼠,它们降落到喜玛拉雅山脉的任意地方。这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰。但每过几年,就在一些海拔高度较低的地方射杀一些袋鼠。于是,不断有袋鼠死于海拔较低的地方,而越是在海拔高的袋鼠越是能活得更久,也越有机会生儿育女。就这样经过许多年,这些袋鼠们竟然都不自觉地聚拢到了一个个的山峰上,可是在所有的袋鼠中,只有聚拢到珠穆朗玛峰的袋鼠被带回了美丽的澳洲。

这个例子感觉非常生动形象了,突然觉得之前的统计学家都是人才啊,实际上用的就是“物竞天择”,于是我们也光荣地当一回上帝了。这个算法的优点,非常明显,就是我们不用刻意去找最优解,只需要不断淘汰不好的结果,这样,最后算出来的结果会自动跑到最优解去。

原文链接:https://www.jianshu.com/p/ae5157c26af9## 蚁群算法
这篇写得超赞,之后还要再拜读一遍!

总结

今天看的这篇文章的确是不错的,语言表达简单易懂,模型也容易推广,贪婪算法用得炉火纯青,解决图论问题,可能这一个方法就够了哈哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值