今天下午18:10结束了组合最优化课程的期末考试,虽然之前对这门课的内容都没写过一篇博客,但毕竟学完了,还是想稍微做一点小结。
组合最优化这门课,如果学起来,会感觉自己大部分时间在学数学,因为老师上课讲算法之前,都会解释一下其中的数学原理。
经常开启一个新的理论之前,老师都会先让我们自己自行查百度了解,然后再讲。(之前感觉老师这是在偷懒,后来发现,这种方式与直接从头讲到尾相比,稍微有效一些)
在其中,我们常常是数学原理听起来一头雾水,顺带里面的算法步骤也听不下去,往往这时,老师就会放一道题,让我们自己做一下,老师大部分情况也不会讲,解题方法主要靠自己前面听进去的内容+网上查方法,也不知为何,确实学会了一些算法(可能只是这段时间记住了吧,毕竟只是记住了步骤,会用,并没理解其中的用途与含义呢)。
因为课上的人比较少,而我自己其实还是比较乐意听这门课的,所以遇见不懂的会直接询问老师。
有一回,发现题解和自己的答案有出入(而且刚好老帅哥的答案是对的),和老师(其实主要是和老帅哥)大辩特辩了一节课,最终稍微感觉答案说得通,也就没继续争论了。(现在想起来,题解也还是合情合理的)
再说说这堂课上学会的一些算法吧,只是随便写写:
- 一维搜索:黄金分割法(找极小值点)
给定一个范围[ a , b ]在这个范围内包含一个极小值(我理解成单峰),我们从中取x1 x2,两者的计算公式是 x1 = a + ( b - a ) * 0.382 x2 = a + ( b - a ) * 0.618
并算出两者的函数值f1 f2 ,将f1 f2 进行比较:
- f1 > f2 => a = x1 ; x1 = x2 ; f1 = f2 ; x2 = a + ( b - a ) * 0.618 f2 = f(x2)
- f1 < f2 => b = x2 ; x2 = x1 ; f2 = f1 ; x1 = a + ( b - a ) * 0.382 f1 = f(x1)
- f1 == f2 => a = x1 ; b = x2 ;再重新算一遍x1 x2
直至| b - a | 的值足够小(满足终止条件),得到 x = (a + b) / 2
- 单纯形法(找最优解)
这个说起来有点渊源。
我们组合最优这门课,讲的最多的,其实就是从多种可能解中找一个最优解。
根据实际问题,进行数学建模(目标函数:求某一个数字的最大值或者最小值 ; 约束条件: 实际约束),简单一点的话,就是直接给我们目标函数和约束条件。
下面讲讲给了目标函数和约束条件后的求解步骤:
比如是求约束条件函数的最小值,
我们先从约束条件中,找到系数<0且最小的那一个变量,再看约束条件,假设每一个约束条件中除了这个变量以外的都为0,得到每一个约束条件下该变量的最大值,以这所有最大值中的最小值最为我们的解。
再而,把我们得到解的那一个约束条件函数中,该变量的系数,变为1,带入目标函数和其他约束条件方程,消除该变量,进行下一次迭代。
如此重复,直至目标函数系数全非负。
我们得到的就是最优解,代入目标函数得到的就是最优值。
(这里可以稍微提一点的就是,我们的约束条件必须是标准型,也就是全为等式,等式右边的值非负,变量全非负)
这里配一张转标准型的图:
一点小结吧:对于我自己而言,其实是挺乐意学习算法的,这门课可能算是我听得比较认真的一门课了,以后也要继续加油~~