今天不码代码!-- 浅谈求解最优化问题的方法(2)

今天不码代码!– 浅谈求解最优化问题的方法(二)

0. 写在最前面

上次写到最优化问题的概念和分类,以及把现实问题抽象成数学问题的方法。这次来聊一聊解法。

1. 高中时候的求解方法

对,你并没有看错,我们高中时候就曾经解过一部分简单的最优化问题。让我们回顾一下
举例:
maxz=x+y m a x z = x + y
st.x2+y21 s t . x 2 + y 2 ≤ 1

解法1:
x=cos(t),y=sin(t),t[0,2π] x = c o s ( t ) , y = s i n ( t ) , t ∈ [ 0 , 2 π ]
则规划问题化为 z(t)=cos(t)+sin(t),t[0,2π] z ( t ) = c o s ( t ) + s i n ( t ) , t ∈ [ 0 , 2 π ] 的最大值问题,求导=0即可得到可能的极值,结合二阶导可以判断极大还是极小,再结合端点值可以得到最值。

解法2:
z=x+y z = x + y 变形成 y=x+z y = − x + z , x2+y21 x 2 + y 2 ≤ 1 可以看成一个圆面,
最优化问题
如上图所示,一条斜率为-1的直线向上运动,直到红线(与圆相切)的时候,达到最大截距。此时z最大。

解法3:
均值不等式

解法4:
。。。。。。

2. 精确解

简单回顾了一下高中的解法,我们发现,高中的知识只能解决比较简单的特定问题,对于更复杂的问题,我们就只能换些其他的思路。
1. 枚举
当然,最简单的思路,当然也是最”暴力”的,那就是把所有可能的情况都列举出来然后去选择最优的方案。我们把这种解决思路叫做”枚举”、”穷举”,或者”暴力搜索”。之所以称之”暴力”,就是因为它”简单粗暴”。但是在这里补充一下,有些萌新以为for循环就是枚举,实际上不是。枚举是一种解决方案,for循环–乃至整个循环结构,是实现的手段,两者不能混为一谈。

枚举对于大部分整数规划来说是一种解决方案,尤其是方案数量比较少的时候。而当方案量大(有限大)的时候,也是可以通过并行运算来解决(但是并行处理难度上不小)。对于一般规划而言,我们会给出一个精度范围,这样虽然不能叫做”精确解”,但是也是一种解决方案。
2. 分支限界
[分支限界法是一种在问题的解空间树上搜索问题界的算法,其目的是找出满足约束条件的一个解,或者是在满足约束条件的解中找出使目标函数达到极大或极小的解,即最优解。分支限界法以广度优先或者以最小耗费优先的方式搜索解空间树,分支限界法的策略是,在扩展结点处,先生成其所有的儿子结点,以加速搜索进程,在每一活结点处,计算一个函数值,并根据这些已经计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索向着解空间树上最优解的分支推进,以便尽快找出一个最优解。][1]
有兴趣的可以参考文献[1],在此不做展开。而且,文献过于古老,新版本的matlab已经支持linprog做整数规划,(笔者matlab2012a亲测可用)。
3. 拉格朗日乘数法
这个在大学高数课上都应该学过了基本思想是通过引入拉格朗日乘子来将含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题。拉格朗日乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数。拉格朗日乘数法主要针对连续型的规划问题,不做展开。可以[参考][2]

3. 数值解

数值解法主要有梯度下降法、牛顿法和拟牛顿法、共轭梯度法、启发式搜索方法等。在此不赘述,参考[文献3][3]
简单谈一谈对数值解的理解。事实上,梯度下降法、牛顿法和拟牛顿法、共轭梯度法在不是很适合”水论文”,毕竟出来写法比较成熟。而启发式搜索,包括遗传、模拟退火、蚁群等,这一个”等”字,有包含了成百种算法–几乎你能想到的动物都成了算法的名字。这样,就给”水论文”提供了空间–毕竟做了创新,毕竟别人没有做过把XX算法(一个新的启发式搜索算法)应用到XX场景下的。有人批评这些启发式搜索没有理论基础–事实上这类算法是基于马尔科夫链的,应该算是有理论基础的。但是至于效果,在变量较少,约束比较简单的时候,这些算法得到的结果还能说得过去。随着数据规模的扩大,启发式搜索不仅变的异常缓慢,而且效果并不理想。个人建议,如果决策变量数量超过3个,约束超过3个时候,尽量不要使用这种方式处理最优化问题(当然你不是水论文的话)。

4. 求解工具

对于求解方法,首推lingo,这个lingo虽然是门“小众语言”(甚至算不上语言),确实是个专门解决优化类问题的软件。网上有破解版,也比较好用。数据可视化略显不足,但是解比较精确。而且只要给定优化方程,自动判断规划类型,很是方便。
其次,我推荐matlab,这门语言在科学计算上应用广泛。其中提供了linprog,intlinprog,quadprog等函数供代码调用,还做了optimtool工具箱,可是界面还是比较方便。缺点自然也是不开源。
最后推荐python,其中三方包pulp, scipy都提供了强大的规划函数。虽然开源,但是亲测比matlab慢一点。
当然,其他语言也有各自的工具,由于没有亲测,暂不做推荐,留待日后补充。

P.S.

本来打算早点完稿,时间拖了两天,唉,,可怜一下三天憋出7个字的宝宝。。
[1]: 王京辉, 乔卫民. 线性整数规划的分支限界解法及其MATLAB实现[J]. 计算机工程, 2005, 31(6):20-21.
[2]: cnblogs http://www.cnblogs.com/maybe2030/p/4946256.html 2018-07-16
[3]: cnblogs https://www.cnblogs.com/maybe2030/p/4751804.html#_label4 2018-07-16

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A.Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值