写在前面
忙忙碌碌,不知不觉步入职场已经6个月,自认为优化算法小有所成,但所从事的工作是开发。
在6个月里面掌握了很多开发知识,但自觉时间久了会逐渐忘记这些算法知识,不愿放弃这些“屠龙之术”,故在此对学生时代的一些运筹优化知识做一个总结。
开发是生活,算法是加分,算法是有限的,最终归宿都是开发。
感慨的废话少说,开始总结自己的知识。
优化算法的分类
初学优化算法,可能并不清楚各个算法的分类,那么首先在这里给大家明确概念。
什么是算法?
算法,最直白最简单的概念,给定输入,以某种流程计算,得到输出。其中这个某种流程就称之为算法。所以算法不拘泥于任何形式,例如手工算账,给定了输入,通过手算得出了结果,那手算这个过程就算一种算法。当然,算法只代表了这个流程,而怎么使用算法就分为了手工和代码,甚至各种奇怪的操作(比如算卦)。
算法的分类
算法以其目的不同,可能有分为多种形式的算法,例如用于预测的预测算法(最小二乘法、函数拟合、统计算法等),用于加工数据获取结果的应用型算法(比如计税),以及用于辅助决策、优化收益的优化算法等,本质上都可以互相的包含,希望大家不要拘泥于这些算法名称。
本人在研究生三年阶段有一个很好的老师,因此优化算法的基础还是比较扎实的。
优化算法分类
优化算法是算法当中一个重要的分支,优化算法旨在通过不同的算法流程,得到更优的结果。通常的优化目的是得到一个能够获得更大利益的优化方案,因此优化算法可以细分为多种算法,如下:
- 启发算法:以现实的经验出发,设定某种规则去得到方案,最典型的为贪心算法。
- 元启发算法:元启发算法与启发算法不同体现在“元”上,其也是源于现实的经验,与启发算法那不同的是,这个经验更为的普适性。启发算法在不同问题上的启发规则是不同的,而元启发算法只需要关注输入和输出,其流程或计算规则对所有问题都相同。
- 精确算法:基于数学,能够验证所得结果是最优的,即为精确算法。常见的运筹学精确算法有:线性规划、整数规划、混合整数规划、列生成算法(存疑)、benders分解、拉格朗日对偶算法等。此外,启发算法是可以被证明为是精确算法的,例如dijkstr算法、最小树生成算法等。
- 非精确算法:无法从数学上证明得到的结果是最优的算法。
- 近似算法:一类特殊的算法,从数学上证明了可以设定某一个近似参数
,能够获取误差不超过特定值的算法,当近似的这个参数趋于无穷时,算法的无限趋于精确算法。
总结来说,优化算法根据
- 规则的普适性分为了启发和元启发算法。
- 得到结果是否数学上证明最优,分为了精确和非精确算法
优化算法的经验总结
1.遇到线性问题,直接建模求解;
2.遇到非线性问题,将非线性部分展开,使用运筹学经典方法通过枚举、生成的方式进行求解。
3.遇到非线性问题,可采用启发、元启发算法尝试求解。
4.能否获得更好的解的方式,在于非线性部分展开的方式。
对于神经网络的总结:
1.神经网络的本质,在于对未知函数的近似,故明确地规则不如直接启发,未知的函数采用神经网络进行拟合。
对于当前生成式人工智能的评价:
DeepSeek采用了强化学习的方式去训练AI,强调”过程“也很重要,不禁让我联想到了以前的断定。当前的生成式大模型都是只有右脑的家伙,没有掌握方法,只是掌握了大量的记忆。
因此,当时我断定大模型的出路是强化学习,而不是监督是学习,我希望建立一个可以自主与外界环境进行交互,可以独立增减自身网络,维持自身多个网络模型,通过统一的调度网络,去决定调用某一部分的能力。
实际上,我只断定了一半,并且以往的观点只对了一半。
生成式模型,以Transformer架构为例,它只是对于后生成的数据重新计算了,再填入继续预测下一个词的概率。
而DeepSeek的训练方法有点点醒我了。
我们可以维持一个模型,并让这个模型的一次输入,作为这个模型的下次输出,直至这个模型得出结论,结束循环过程,这个过程不就是推理吗?
DeepSeek将推理描述为过程(可能有误),并采用强化学习的方式奖励其过程,感觉和人脑的逻辑更加相近了。
以后仍会持续总结。。。包括对各个方法的理解。
实际上,线性规划和整数规划,与传统贪心、模拟费用流、dijkstr、对偶、线性代数等,都在表述着一个数学原理,数学是自然的抽象,因此所有的算法可能都指向一个自然事实。
凹凸函数,我们经常会困扰于这个概念,都会说凹函数、凸函数就可以获得其最优解,但实际上优化问题的解空间,就是由凹函数和凸函数连续构成的(连续问题),所以,原问题本身就是一段凹一段凸绑在一起的。
那么NPC问题的本质是什么呢?就是坑太多了,随着变量的数量增加,坑的数量呈指数级增长。
在每一个坑中,都是一个局部问题,我们可以使用很多方法获得最优解。例如梯度下降,坐标轮换。
想想KKT条件,找鞍点即导数为0的点,实际上就是极值点,就是每一个坑底和山顶,所以使用KKT条件实际上就是遍历每一个坑底(最小化问题)和山顶(最大化问题)