一点优化论 - 没覆盖运筹学的内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一点优化论 - 没覆盖运筹学的内容相关的知识,希望对你有一定的参考价值。
参考技术A因为教书,所以,在讲解相关的概念和技术的时候,总是习惯首先 从大处着眼 ,然后 在小处入手 。所谓 从大处着眼 ,就是梳理下概念和技术的源流和历史; 在小处入手 就是总是使用具体的例子来讲解。
前面 也谈AI简史 简单梳理了AI(作为人类追寻智慧的一部分)的Big Picture(还真没找到合适的描述 - 大图景?怪怪的);此文简要梳理下AI的核心技术 - 优化( 注意: 不仅仅是 优化论 )。如果你不了解点优化的知识,还真够呛能深入AI,尤其是机器学习(Machine Learning),以及现在的火热的深度学习(Deep Learning)。
要强调的是:真正想要精通机器学习,意味着你必须要了解优化!
还有:此处涉及到的数学知识,仅作陈述,不再给出证明!如对证明感兴趣,请自行搜索。
这个...还真不好说,因为涉及的太多了。简单地说, 所谓优化,宽泛地说,就是找到需要解决的问题的最佳方案 。
问题有很多:大到 宇宙到底是如何形成和演化的? ,小到 某种茶用水的最佳温度? 。在尝试解决这类问题的过程中,会提出很多的方案。优化,就是找到那个最佳的方案。
而与AI和ML的学习紧密相关的优化,则是依赖于数学手段的处理方式,尤其是依赖于数学分析的优化(突出的代表就是 凸优化 ),也是此文所关注的。
按照上面对优化的理解,那么,优化的历史就很久了!大致分为三个时期(个人观点):数学分析出现之前,数学分析和变分法时期,以及非线性时期。
定理的陈述很简单,"边长固定,在长方形中,正方形(正方形是长方形的特例)面积最大"。但是,那是在公元前300年!你试试?
这一时期的优化,很多时候是依赖个人的灵性,没有一套比较好的数学套路来 完美 求解那些问题。这得一直到 数学分析 这一强大的工具出现后才得以突破。
数学分析的历史就不赘述了 - 网上有很多的趣闻和轶事(关于牛顿和莱布尼兹,关于欧拉的工作等)。数学分析的重要性毋庸置疑,它也大大促进了优化问题的求解(如果可以使用数学分析的方法求解的话)。在这里不得不提的是所谓的 变分法(Calculus of Variations) 。感兴趣的话可以自己找找看 ,在此只是给出下面的示例,以助于读者直观感受下。
数学分析的技术用于优化,其思想还是很简单的(说过:证明其正确性才是挑战!),主要的就是 极值定理 :通过函数的一阶和二阶导数的性质,可以确定不动点(Stationary Point)是局部极大还是极小。
这一现象在多元变量函数上也有类似的规律,留到后面 (凸)优化的框架 再做介绍。
此外,当函数是凸函数的时候,极值点(不动点)也就是该函数的全局极值了。也留到后面 (凸)优化的框架 再做介绍。
说起来,简单点的优化问题解决的还是不错的,其集大成者就是所谓的 凸优化 。不过,问题有时候总是比方法多!现实中还有许多的问题是在凸优化覆盖的范畴之外的。
上图是网上找到的了关于优化论覆盖的问题范畴:整个矩形对应所有的优化问题,其中的CP就是 Convex Programming (凸规划问题。在数学领域往往习惯成为Convex Optimization),PP对应多项式规划(Polynomial Programming)问题(要注意,PP中有些问题会是非线性的),此外就是非线性问题了。而且非线性问题更多。反过来说,非线性优化问题才是 很难的 问题。
不过,难问题毕竟是难,按照陆吾生先生的说法,PP现在得到了很大的关注,就是因为它覆盖了部分的非线性问题。相关的研究就想从这类非线性问题的求解中找找规律,以推进对其他非线性问题的求解。
另一方面,大规模的全局优化问题,也得益于计算机的发展有了有趣的推进,1980年代提出了Genetic Algorithm [遗传算法],Simulated Annealing Algorithm[模拟退火算法],Ant Algorithm [蚁群算法]等方法。
在前面知道,对于一元函数而言,极值定理既能够帮助我们求解极值点(一阶导数为零的点,也就是局部最优点。仅当函数是凸函数时,才是全局最优点),在极值点的二阶导数能够进一步确定极值点的性质(是极大还是极小)。
这种现象在多元变量函数中也存在,分别对应 一阶偏导数 和 Hessian 矩阵 (对应一元函数的二阶导数)。下面只是给出个例子体会下,更深入的理论请自行查找。
其中, f(x) 是目标函数; g(x) 是不等约束条件; h(x) 是等值约束条件; x 是多元变量的向量形式。
** 注意:这种描述也同样适用于 被CP覆盖的其他形式的优化问题。
** 强调 :后面描述的求解套路并不适用线性规划(Linear Programming)。为什么?因为线性规划的一阶导数是常数 :slightly_smiling_face:
无约束问题,也就是只有一个目标函数,而没有任何约束条件。这类问题的求解,就是求解一阶和二阶的套路:一阶定极值,二阶定性质。
也就是只含有等值约束的问题。这类问题的求解就需要所谓的拉格朗日(Lagrange Multiplier)算子的帮助,借助它能将此类问题的求解转化为无约束问题的求解。
在构造了拉格朗日函数后,分别对两个变量求一阶偏导数,然后再加上等式条件,我们就有三个方程和三个变量(新引入的ν变量就是所谓的拉格朗日乘子),也就可以求的三个变量的值。
在得到三个变量的值后,进一步求解兰格朗日函数在两个点处的二阶偏导数(也就是黑森矩阵 - Hessian Matrix),进而可以知道黑森矩阵的性质 - 正定,负定,还是不定。由于此优化问题是求解目标函数的最小,那么,对应正定黑森矩阵的点也就是最小值了。
一定要记住 :KKT 是求解不等约束问题的必要条件!
注意:此处仅仅简单地给出概貌和样例,不做数学证明!证明确实很难的!
有了前面的理论,想要手工实际得到结果仍然是很费劲的,好在有计算机。不过,下面提到的各种计算机算法(数值方法)主要是针对前两个层次的求解,不等约束问题的求解,因为依赖具体的情况(前面例子里的很多Cases),所以很难有统一的求解算法。
梯度下降法(Gradient descent),顾名思义,就是自变量沿着梯度向量的反方向进行移动,因为梯度的方向是上升的方向。
最速下降法(Steepest descent)是梯度下降法的一种更具体实现形式,其理念为在每次迭代中选择合适的步长,使得目标函数值能够得到最大程度的减少。
对于机器学习中的分类问题,都需要基于数据来训练所选模型的参数(不管是著名的支持向量机,还是神经网络的参数训练 - 从简单的感知机到现在火热的深度学习)。
假设训练集中含有 N 个数据样本,对上面的的 n 取不同值(即一次性计算 loss 的样本个数取不同值),实际计算时会有不同的影响。如果 n=1,这就是 随机梯度下降法(Stochastic Gradient Descent);如果 1<n<N,这就是 小批量梯度下降法(mini-batch gradient descent。batch size 一般不会很大);如果 n=N,这就是(批量)梯度下降法([Batch] gradient descent)。
在确定搜索方向时,梯度下降和最速下降只用到了目标函数的一阶导数(梯度),而牛顿法(Newton\'s method)用到了二阶(偏)导数。
其他的求解方法还有很多,比如共轭梯度法(Conjugate Gradient Method), 拟牛顿法(Quasi Newton)等,请自行搜索。
前面提到了机器学习中的梯度下降法,有时候为了使得所得到的的参数满足某些预设的要求,会人为引入所谓的正则项。比较有名的是LASSO, 好的Ridge 等。
在优化研究领域,有两个著名的国际奖项, George B. Dantzig Prize 和 John von Neumann Theory Prize 。
重新发布|《运筹优化常用模型算法及案例实战:Python+Java实现》 代码手册 开始预购啦!!!
◆ ◆ ◆ ◆
《运筹优化常用模型、算法及案例实战:Python+Java实现》
【代码手册】
开始预购啦!!!
---------------------------------
之前预定过的无需再次预定
(大家手速也忒快了,好多人都没来得及备注)
----------------------------------------
订购链接见文末
6月15日24:00前订购的读者将会享受85折!!!!!
另:之后可能会从订购的小伙伴中选取一小部分免费赠送哦
2021
◆ ◆ ◆ ◆
昨天推文里提醒了多次,大家手速还是太快,没有备注转账信息。小编的锅,小编的锅。一会儿功夫收到了70多个预定,小编也是受宠若惊,但是这来来回回确认可给小编累坏了,哈哈哈
今天重新发一下,改成
微店购买链接+调查问卷
的形式,之前预定过的无需再次预定(但是如果想在微店拍,能看到成功与否的话,可以联系小编退款重新去微店拍,这个so easy)
各位从事运筹优化的小伙伴们
您是否对运筹优化非常感兴趣,准备要系统的学习时,却发现没有较系统的进阶版中文资料?
中文的没有,英文的论文很多。但是看文献的时候你引他,他引他,为了追溯一个源头,花了一下午,最后还是无功而返?很多论文自解释性不强,这让初学者极为头疼。
不看文献,那就去看看英文课本呗,看了课本,理解了原理,但,是不是又会苦于只了解理论,到编程阶段却又无从下手?学了一大堆理论,但还是停留在纸上谈兵的阶段。
那行,那咱就去Github上呗,但是你又会发现,为了学习一个精确算法的代码,在github上找了又找,犹如大海捞针,即使找到了,别人的代码多数时候也是无头无尾,学习困难?
.....
.....
哎。。。 • 太难了,该怎么办呢
如果你有以上任何一种困惑,那么,你的解决方案来啦!!!
我们通过几年的积累和不懈的努力,终于将运筹优化领域常用的模型、算法、常用的求解器的使用以及经典案例及实战,整理成了一系列的教程,并编成了一本书,准备出版啦!想要系统的学习运筹优化建模、算法、编程实现的小伙伴们到时候阔以有很好的解决方案啦。
整套教程内容太多
我们只能将其分成
三个大的部分
01.
在出版社出版的教材部分
本部分手稿有560+页
内容简介
本书主要介绍了运筹优化领域常用的数学模型、精确算法以及相应的代码实现。本书首先简要介绍了大量基本理论,然后用丰富的配套案例讲解了多个经典的精确算法框架,最后结合常用的优化求解器(CPLEX和Gurobi),介绍了如何用Python和Java语言实现书中提到的所有精确算法。
全书共分为3部分。第1部分(第1-4章)为运筹优化常用模型及建模技巧。该部分着重介绍了整数规划的建模技巧和常见的经典模型。第2部分(第5-7章)为常用求解器API详解及应用案例。该部分主要介绍了两款常用的商业求解器(CPLEX和Gurobi)的使用方法,包括Python和Java的API详解、简单案例以及复杂案例。第3部分(第8-17章)为运筹优化常用算法及实战。该部分详细的介绍了几个经典的精确算法的理论、相关案例、伪代码以及相应的代码实现。
本书适合作为高等院校工业工程、管理科学与工程、信息管理与信息系统、数学与应用数学、物流工程、物流管理、控制科学与工程等开设运筹学相关课程的高年级本科生、研究生教材,同时可供在物流与供应链、交通、互联网、制造业、医疗、金融、能源等相关企业中从事有关运筹优化的开发人员、以及广大科技工作者和研究人员参考。
本书的三个部分更具体的介绍如下。
运筹优化常用模型及建模技巧部分不需要读者有任何的编程基础,只需要掌握本科的运筹学线性规划相关理论和基本的对偶理论以及整数规划基础知识即可顺利读懂。本部分分为4章。第1章介绍了一些数学规划模型的分类和后面章节的精确算法会涉及到的一些凸优化领域的概念,包括凸集、凸包等。由于本书的重点不在此,因此本章介绍的非常简略。第2章介绍了一些非常常见的运筹学问题,例如指派问题、旅行商问题、车辆路径规划问题和多商品网络流问题。这些问题非常经典,并且具有代表性,当下很多实际问题都可以转化为这些问题的变种和拓展。第3章讲解了整数规划中常用的建模技巧,包括逻辑约束等约束的写法、非线性项的线性化方法等,这些技巧频繁的出现在业内顶级期刊发表的论文中,因此本书专门设置了一章来介绍这些内容。第4章讲解了运筹优化中一个非常重要的理论——对偶理论。不同于其他教材,本书中这一章主要聚焦如何写出大规模线性规划的对偶问题,是作者通过自己探索总结出的方法,目前国内外的各种教材和网站,鲜有看到类似的方法介绍。
第一部分是为后续的算法部分做铺垫,之后章节中会多次用到这一章介绍的概念和模型。
常用优化求解器API详解及应用案例部分分为3章,主要是介绍常用优化求解器(CPLEX和Gurobi)及其应用案例。这部分将为之后的算法实战作好技术铺垫,本书第三部分的章节,都需要用到这一章的内容。要顺利读懂这一部分,需要读者有一定的编程基础,至少需要掌握Java或者Python中的一门语言。第5章详细地介绍了CPLEX的Java接口的用法。这部分的主要内容是根据CPLEX提供的用户手册整理而来,包括基本的类、callback、以及例子库中部分例子代码的解读。该章能够帮助读者快速的掌握CPLEX的Java接口的使用,读者无需直接去研读厚厚的英文版用户手册,可以通过该部分快速入门。第6章系统的介绍了Gurobi的算法框架以及其Python接口的用法。包括常用类、Python调用Gurobi的完整建模过程、日志信息、callback等部分。最后还附以简单的案例帮助读者理解。第7章提供了带时间窗的车辆路径规划(VRPTW)的代码实现。详细的给出了如何调用求解器,建立VRPTW的模型并求解。这个案例略微复杂,掌握了这个案例,其余更高难度的案例也就可以迎刃而解。但是本章的案例都是直接调用求解器得到模型的解,并没有涉及到自己实现精确算法的内容。
运筹优化常用算法及实战部分是本书最为重要,干货最多的部分。该部分全面、系统的将运筹优化中常用的精确算法以通俗易懂的方式讲解给读者,尽量避免晦涩的解读。为了方便读者自己实现算法,我们为每一个算法,都提供了详细完整的伪代码,这些伪代码可以帮助读者自己从0到1动手实现相应的算法。在第8章,我们简要回顾了单纯形法,并给出了伪代码和Python代码实现。第9章,我们介绍了求解最短路问题的Dijkstra算法及其实现。Dijkstra算法也是一个非常常用的基础算法。第10章到第17章,我们以理论+详细小案例+伪代码+复杂大案例+完整代码实现的方式,为读者介绍了Branch and Bound, Branch and Cut,Column Generation, Dynamic Programming,Branch and Price, Dantzig-Wolfe Decomposition, Benders Decomposition,Lagrangian Relaxation这8个经典且常用的精确算法。这些算法经常出现在运筹学领域各个期刊的文章中,以及在工业界的具体项目之中。为了便于读者理解,我们尽量避免复杂的数学推导,着重讲解基本原理和算法迭代步骤,真正意义上帮助读者从理论到实践,一步到位,无需到处寻找零散资料,做重复性的整合工作。
相信认真研读这本教材的读者,一定会大有收获。尤其是对刚入门的硕士生和博士生们,
可以凭借这本教材,系统的掌握本领域的精确算法,更好的胜任自己的科研工作。对于
已经从业的运筹优化算法工程师,本书也可以作为一本非常详尽的学习工具书。
书的暂定目录
(出版社的版本最终会删减部分目录及内容)
是不是内容比较系统呢,嘿嘿,有没有心动
02.
随书附赠代码手册
本部分手稿有200+页
内容简介
本部分内容基本全部是较长的代码,不便放入书的正文中,因此我们将做成PDF提供给出版社,随书附赠给读者。
本部分附赠代码主要作者为本书作者,以及华中科技大学博士生黄楠同学、杉树科技算法工程师伍健、华中科技大学邓发珩同学。
再次对他们表示衷心的感谢!
章 |
章节名称 |
内容 |
第10章 |
分支定界算法 |
10.11 Java 调用CPLEX 实现分支定界算法求解VRPTW |
第11章 |
分支切割算法 |
11.5.3 Java 调用CPLEX 实现分支切割算法求解VRPTW 完整代码 |
第12章 |
拉格朗日松驰 |
12.7.2 Python 代码实现:版本1 |
|
|
12.7.3 Python 代码实现:版本2 |
第13章 |
列生成算法 |
13.3.4 Java 调用CPLEX 实现列生成求解下料问题:官方文档示例代码解读 |
章 |
章节名称 |
内容 |
第17章 |
Benders 分解算法 |
17.4 Java 调用CPLEX 实现Benders 分解求解FCTP(Fixed-cost transportation problem) |
|
|
17.7 Python 调用Gurobi 实现Benders 分解求解FLP(Facility location problem) |
内容样例
下面是随书赠送的代码部分截图。
这些代码是配套书中的理论和解释的。在理解书中理论和算法、伪代码、详细案例的基础上学习这些进阶版本的代码,效果会更显著。
是不是更加心动了 :)
03.
拓展/进阶代码手册
敲重点:这部分才是我们自己要卖的
声明
拓展/进阶版本的代码手册,虽然是配套书中的理论和代码的,但是没有这些,并不影响原书的学习。
这些代码是给读者进一步学习使用,在学习了书本的内容基础上,再学习这些,会对能力的增长有非常大的帮助。
本部分代码主要由本书作者完成。
为了保护书的销量,代码手册的代码的配套模型、理论、算法介绍都在出版社出版的书中。
但是要说明的是,本部分是作者自行售卖的,与出版社无关。本部分代码的版权归作者所有,之后如果出现任何版权问题,代码的原作者将追究法律责任。
另外,本书的代码,作者很有可能会在1年或者2年后全部开源。在此先跟各位读者说明一下。
代码手册作者
本代码手册的作者如下。
刘兴禄:硕士毕业于清华大学工业工程系,目前为清华大学深圳国际研究生院,清华-伯克利深圳学院博士生。
熊望祺:硕士毕业于清华大学工业工程系。
臧永森:硕士毕业于清华大学工业工程系,目前为清华大学工业工程系博士生。
段宏达:目前为清华大学工业工程系博士生。
曾文佳:目前为清华大学工业工程系硕士生。
四位在读研究生目前的研究领域均为运筹优化,具体包括鲁棒优化、大规模整数规划、港口运作优化、共享出行优化、车辆路径规划、服务网络设计、仓库运作优化、智慧交通等。
代码手册内容简介
章 |
章节名称 |
内容 |
第10章 |
分支定界算法 |
10.12 Java 调用CPLEX 实现分支定界算法求解VRPTW(callback实现版本) |
章 |
章节名称 |
内容 |
第11章 |
分支切割算法 |
11.6 Python 调用Gurobi 实现分支切割算法求解 VRPTW 完整代码 |
|
|
11.7.3 Java 调用CPLEX 实现分支切割算法求解CVRP 完整代码 |
第13章 |
列生成算法 |
13.3.5 Java 调用CPLEX 实现列生成求解下料问题:版本2 |
|
|
13.4.4 Python 调用Gurobi 实现列生成求解TSP |
|
|
13.5.4 Java 调用CPLEX 实现列生成求解VRPTW |
章 |
章节名称 |
内容 |
|
|
13.5.5 Python 调用Gurobi 实现列生成求解VRPTW |
第14章 |
动态规划 |
14.4.7 Java 实现标签算法求解ESPPRC |
|
|
14.5.3 Python 实现标签算法结合列生成求解VRPTW 完整代码 |
第15章 |
分支定价算法 |
15.3 Python 调用Gurobi 实现分支定价算法求解VRPTW |
|
|
15.4 Java 调用CPLEX 实现分支定价算法求解VRPTW |
章 |
章节名称 |
内容 |
第17章 |
Benders分解算法 |
17.5 Java 调用CPLEX 实现Benders 分解求解FCTP:版本2 (FCTP: fixed-charge transportation problem) |
|
|
17.6 Java 调用CPLEX 实现Benders 分解求解UFLP (Uncapacitated Facility Location Problem) |
目录
目录如下。
为了与原书的目录保持一致,方便读者对应,我们保留了目录结构。
用红框框起来的部分是代码手册中的完整内容。
代码手册部分内容截图
具体以实物为准。
这里需要声明的一点,代码手册的代码主要是为读者自己实现这些算法提供一个参考,并不保证100%没有Bug,也不保证代码的效率。
追求效率,要发论文的小伙伴们需要自己做针对性的优化和重构哦。
啰嗦了那么多
直接进入订购环节
订购环节
微店订购+问卷
注意
本次订购的对象是我们这本书的拓展/进阶版本的《代码手册》(纸质打印版)。
这本代码手册的价格预计在100元到300元之间,视打印成本而定。
我们将定金设置为40元。我们将利用定金提前联系打印厂家打印,因此定金一旦支付,若无特殊情况(如重复支付等),我们不接受退款。请读者悉知。
等书出版后我们会尽快将代码手册邮寄给您。
订购问卷
声明:本书的拓展/进阶代码手册,版权归作者所有,任何其他单位和个人不得将其用作商业用途,且不得扫描并发布在网络上,也不得进行其他其他侵权活动。一旦我们发现有侵权的单位或者个人,我们将追究其法律责任。
为了保护版权,我们会在每本手册中不定地点对购买信息进行加密标注,一旦发现有人扫描上传至网上,我们可以迅速得知侵权者。请悉知。
订购方法:
微店购买链接支付定金+填写问卷
支付完定金,待我们定好最终价格,且出版社
正式出版后,订购的读者通过补齐差价
获取代码手册。届时我们会通知大家。
微店购买链接预付定金
(定金40元,似乎只能微信支付)
订购链接(扫描下图即可):
商品介绍
支付完后,一定要填写下面的问卷哦!不然我们无法提前印制手册。
订购信息问卷链接
https://www.wjx.cn/vj/rfWheKu.aspx
或者扫描二维码
本代码手册接受手册封面投稿投稿!!!
有兴趣的读者可以投稿至
hsinglul@163.com
封面被录用的读者将不用补齐差价即可获得代码手册,并且我们将在代码手册致谢中提及此事。欢迎大家积极投稿呀。
我们接受LaTeX版本和PDF等版本的投稿,前提是封面中的元素均为原创且清晰度足够。
致谢
非常感谢各位读者的支持和鼓励!!!
感谢本书的各位校稿人。
(感谢老师等的内容还是 就放在书里吧,不在这里说了)
感谢伍健在DW-分解算法、拉格朗日松弛算法方面提供的资源。也非常感激在算法实现过程中,伍健对我诸多疑惑的耐心解答,同时也非常感谢伍健对这本书出版的大力支持。
感谢华中科技大学博士生黄楠同学和华中科技大学邓发珩同学。他们的代码对本书的完成提供了莫大帮助。
感谢本书中所有参考文献的作者,是你们的研究成果让我学到了许多新的知识,获得了不少新的启发。本书中部分内容参考或者翻译自这些文献,在此向这些研究者们致以崇高的 敬意。
本书的最新进展
以及本书内涉及到的理论的拓展
运小筹
以及读者微信群
以上是关于一点优化论 - 没覆盖运筹学的内容的主要内容,如果未能解决你的问题,请参考以下文章