最优化问题广泛的存在于社会生产活动当中,我们一直努力寻求更高效、更准确的解决方式来应对这类问题。通常,最优化问题可以表述为一种数学规划的形式,对于变量在可行域中的不同组合进行搜索,以得到目标函数的最优值。在解决常规的最优化问题时,有多种解决方案,如梯度下降法,拉格朗日乘数法等。然而,有一类最优化问题却是人类目前难以逾越的门槛,即NP完全问题(Non-deterministicPolynomial)。本文介绍了最优化问题的常见应用场景和求解方式,并重点对启发式算法在求解NP问题的次优解过程进行了分析。最后通过模拟退火算法和蚁群算法寻求最优化路径的实例,实践了通过启发式算法来求解NP问题的次优解,为我们在日常生产活动中解决此类时间复杂度具有不确定性的最优化问题提供一种成本可控,目标效益更高的解决方案。
在日常生产活动中,我们经常会面临诸如:超市的配货卡车需要给不同的门店送去货物,如何规划卡车的配货路线,使得每个门店均可接收到货物,并且卡车配送所花时间和行驶里程最短;某视频门户网站需要在全国各地设立视频资源存放服务器,一方面要保证服务器部署节点能够覆盖所有的用户,并且要降低从用户到服务器之间的链路成本,提高用户请求视频资源的响应效率,另一方面要尽量减少服务器部署节点,以降低经济成本;这类路线规划和资源配置问题均可归类到最优化问题的求解范畴。解决最优化问题的方法被称为最优化方法,常见的最优化方法有以下几类:1)梯度下降法;2)牛顿法;3)共轭梯度法;4)拉格朗日乘数法;5)启发式算法。这五类算法每一种都有自己适用的场景和其优势,因此在解决最优化问题前,分析应用场景,选取合适的最优化方法是首要任务。
计算机科学的两大基础目标是:发现可证明其执行效率良好且可得到问题的最优解或次优解的算法。而在最优化问题中,有这样一类问题却是目前人类难以逾越的门槛——NP完全问题,该问题也是世界七大数学难题之一(其中庞加莱猜想现已被俄罗斯数学家格里戈里·佩雷尔曼解决)。NP即多项式复杂程度的非确定性问题,所有的在非确定性多项式时间可解的判定问题构成了NP类问题。在解决这类问题时,常规的确定性时间复杂度的算法不再适用,而启发式算法这类非确定性时间复杂度的算法,却能够较好的寻找到该类问题的一个可以接受的次优解。通常,启发式算法搜索得到的问题的解不是最优解,而是随着算法的改进和迭代无限接近最优解的次优解。因为目前,我们找不到一个更好的算法,能够证明其执行效率良好、稳定,并且能得到问题最优解的算法,所以启发式算法是目前我们解决这类问题的一种较好手段。
常用的启发式算法有模拟退火算法、遗传算法、蚁群算法和人工神经网络等。以上这些算法我们都不能给出其确定的执行时间复杂度,也不能证明其求解得到的解是否是问题的最优解。而是能够在大多数情况下,在“可接受”的时间开销内得到问题的一个“较好”的解。评价“可接受”的依据是能够保证生产的基本时间开销要求,评价“较好”的依据是,所得到的虽然不是最优解,却是一个能够满足生产活动需求并且带来更大效益的解。因此学习研究启发式算法对于我们在日常生产活动中解决某些最优化问题有着重要作用和意义。启发式算法领域也在近几年得到了广泛的应用和研究,如人工神经网络应用于机器学习等领域的研究。另外三种启发式算法,均为仿自然界生物现象的算法。模拟退火算法来源于固体退火的过程,用于求解组合优化类问题;遗传算法模拟了达尔文生物进化论的自然选择和遗传学机理的生物进化过程,用于解决搜索类问题;蚁群算法模拟了蚂蚁寻找食物过程中发现路径的行为,用于解决路径优化问题,也是一种比较有趣的算法。
本文的主要工作是;
1)对最优化问题及其常见的应用场景和解决方法进行了介绍和分析;
2)分析讲解了P类问题,NP类问题和NP完全问题(NP-C问题);
3)介绍了常见的启发式算法及其应用,并重点就模拟退火算法和蚁群算法为代表的启发式算法解决NP类问题进行了讲解和实践。
2.1下山最优路径问题与梯度下降法
如下图2.1所示,假设有一座山,四周都是浓雾,看不清任何东西。如何在山顶的A点出发,找到一条去山脚的最快路径,这就是一个最优化问题。在解决这个问题时,我们把这座山看作可微分的函数,山的高度看作函数的目标值,也就是要找到一条路径,使得函数值下降得最快,就可以找到最快下山的路径。
图2.1. 梯度下降法
建立一个平面坐标系后,将山上每个点的高度看作关于的函数:
(1)
站在A点的时候,通过求该点的梯度,梯度是一个向量,该向量的方向指向了函数值增长最快的方向。因此要下山最快,就沿着与梯度方向相反的方向走。当函数是单变量时,梯度即为导数;当函数为多变量时,梯度即为分别对每个自变量求偏导后构成的一个向量。采用梯度下降的算法有SGD,Adam。
2.2非线性函数与X轴交点问题与牛顿法
图2.2. 牛顿法
如图2.2所示,牛顿法主要用于解决研究问题中的目标值是关于变量的非线性函数,且在可行域中只有一个交点,但是通过数学计算方法无法求得精确的交点。牛顿法提供了一种通过迭代的方式无限逼近交点,其思想为从某一点出发,求得该点处函数的切线,得到切线与x轴的交点记作,再次求处的切线,得到下一个交点,就这样无限的逼近函数与x轴的交点。
牛顿法能够快速收敛于最优值的原因是:当函数任意阶可导时,通过展开为泰勒级数,取泰勒级数一阶展开式构建的线性函数来代替曲线,因为从微观的角度看,极小的区间内,曲线就趋近于直线。而牛顿法需要求解函数在区间内的二阶偏倒数,因此要求函数二阶连续可微。LM算法即采用的牛顿法。
2.3牛顿法的改进——拟牛顿法
从上面介绍的牛顿法可知,虽然收敛速度较快,但是需要计算目标函数的二阶偏导数来构建线性函数,该过程计算复杂度较大,并且目标函数的黑塞矩阵不是所有时候都保持正定,牛顿法在这种情况下就失效了。而拟牛顿法就是为了解决计算复杂度大,黑塞矩阵有时不是正定的问题而提出的。拟牛顿法的改进思想是:不用二阶偏导数近似的构造黑塞矩阵(或其逆矩阵)的正定对称阵。使用较多的拟牛顿算法有DFP,BFGS和L-BFGS。
以上介绍的三种最优化算法是机器学习中最常用的三类迭代算法。表格2.1给出了三种算法的特点对比和常见应用场景。
表2.1三种最优化算法的特征对比
算法
|
迭代时间复杂度
|
算法收敛速度
|
初始值要求
|
应用场景
|
梯度下降法
|
需计算一阶导,复杂度为
|
收敛较慢
|
容易逃离鞍点(一阶倒数为0)
|
特征维度较大的场景
|
牛顿法
|
需计算二阶导,复杂度为
|
收敛快
|
有要求,非凸函数容易陷入鞍点
|
特征维度较小的场景
|
拟牛顿法
|
近似Hessian矩阵的逆矩阵,复杂度为
|
收敛快
|
无明显要求
|
比较适合凸优化问题
|
2.4拉格朗日乘数法
拉格朗日乘数法由法国著名数学家约瑟夫·拉格朗日提出,用于求解多元函数在变量受一个或多个限制条件约束下的极值问题。假设一个多元函数有个变量,需要求解个约束条件下的极值,拉格朗日乘数法通过将该最优化问题转化为一个有个变量的函数的极值问题。在这个转化过程中,需要引入一个新的参数,即拉格朗日乘数:新构建的方程组中,每个向量的系数。
下面我们看这样一个最优化问题的情境:有一个纺织工厂主想要尽可能的提高其工厂利润,假设在厂房(足够使用)等外部条件固定时,利润函数与投入的纺织机数量和雇佣的工人数量有关,假设可表示为,因为纺织机的数量和工人数量必须构成一定的比例关系,才能不造成工人空闲或工人照看不了过多的纺织机,该比例关系表示为,由于工厂主的资金有限,最多能够为纺织机购置和工人雇佣支付的金额。因此需要满足:,由于在厂房够用的情况下,工厂主希望能够以最大的资金投入,来获取更多的回报,因此,可以得到。接着,将上面的收益函数在约束条件最大化表示为以下形式:
(2)
此时引入两个新的参数构建方程:
(3)
然后令函数对自变量分别求一阶偏导数的值为0,可得到:
(4)
通过求解上述方程组(4)即可得到工厂主的利润函数z的极值,这里的极值有可能是最小值,也有可能是最大值。如果求得的极值点只有一个,那么该极值点就是问题的最优解,因为不可能是最小值(不投入资金时候收益为0)。当求得的极值点有多个时候,我们很容易把这几个极值点代入到利润函数z中去,通过比较计算得到的值,其中最大值对应的极值点,就是问题的最优解。
2.5启发式算法
启发式算法的定义是:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计(来源于百度百科)。常见的启发式算法有:模拟退火算法,遗传算法,蚁群算法和神经网络,均为仿自然体的算法。
2.5.1模拟退火算法
模拟退火算法是是仿固体退火原理,当固体被加温时,内能增大,粒子的动能增大,处于无序状态,而温度逐渐降低过程中,粒子会逐渐趋于稳定有序,内能达到最低。在这一过程中,粒子的排列组合决定了内能的大小,但固体最终会形成一种内能最低的状态。模拟退火算法就是模拟的这个随着温度下降,内能降低的过程。通常可以用来解决复杂度较高的组合问题。
图2.3. 模拟退火算法示意图
在图2.3中,固体初始温度低,粒子排列较为紧密,但不是最紧密的状态。此时将固体加热,粒子由于吸热内能变大,热运动变强烈,粒子间距离增大。随着温度逐渐降低,最终粒子会趋于平衡状态,粒子排列最为紧密,内能最低。这种粒子排列组合状态,就是使得内能最低的最优状态。
2.5.2遗传算法
遗传算法模拟的是达尔文的生物进化理论,处理方法包括“选择运算”,“交叉算子”和“变异运算”,评价和选择指标则是“适者生存”。因为启发式算法主要用来解决搜索最优解复杂度较高的问题,常规的“蛮力法”搜索通常极为耗费资源,且不能在可接受的时间内得到问题的解。那么,启发式算法必须按照一种更“合理”的搜索方式来逼近问题的最优解,遗传算法就是按照生物进化论的方式来搜索,将每次得到的个体(问题的一个可行解),通过一个适应度来评价,适应度越高,距离最优解的距离也就越近。因此,在每次跌倒过程中,适应度越高的个体,其基因遗传下去的概率会更大,这就是“适者生存”。并且,个体基因遗传下去的方式有:直接遗传给下一代,或者与其他个体配对后遗传(选择运算);当两个个体配对时,必须按照一定的规则来继承上一代的基因,这个规则就是“交叉算子”;在遗传的过程中,个体的基因会有一定概率发生改变,基因改变的过程就是“变异运算”。遗传算法的过程可用图2.4表示。
图2.4. 遗传算法
2.5.3蚁群算法
蚁群算法用于解决寻找最优路径的问题,模拟的是蚂蚁找食物的过程,是一种比较有趣的算法。在自然现象中,我们可以观测到这样的现象:蚂蚁找寻找到食物时,通常能够走一条接近直线的路线到窝,如果直线上有障碍,也能够找到最短的绕过路线。这一现象就说明,蚂蚁寻找食物的过程,一定用一种机制来指导整个蚁群寻找到最优的路径。蚁群算法,就是对这一现象观测研究,然后抽象简化得到的寻找最优路径的算法。
图2.5. 蚁群运食物路线示意图
蚂蚁找食物最重要的两个特征是多样性和正反馈:多样性,即蚂蚁在选择路径时,有一定的概率随机选择任意的方向,以探索新的路径;正反馈则是,蚂蚁在选择路径时,较大的概率选择较多蚂蚁走过的路径。正是这两种机制巧妙的结合在一起,才使得蚂蚁能够找到一条接近最优的路径。如果多样性的影响过大,则会出现整个蚁群过于活跃,无法收敛到一条路径上,如果正反馈影响过于大,则会出现蚁群出现僵化的现象,陷入一个区域无法出来。蚁群算法,对寻路过程抽象为以下几个方面:
1)蚂蚁的感知范围:任何一只蚂蚁只能感知以它为中心的一定半径大小圆形区域的路径。
2)信息素:有代表窝的信息素和代表食物的信息素,分别指导蚂蚁找窝和食物。
3)遗留信息素:蚂蚁寻找到窝时,会在附近遗留下最多窝的信息素,随着距离窝越远,遗留的信息素越少。寻找到食物时,同理,距离食物越远遗留食物信息素越低。所有的信息素会以一定的速率挥发消失。
4)蚂蚁寻路规则:如果周围有信息素,则较大概率走信息素高的地方,否则按照惯性保持直线行走,有小概率会选择其他的方向,并且能够记住最近走过的点,不重复。
5)躲避障碍物:有信息素时候,选取信息素高的地方,否则随机选择其他方向。
2.5.4神经网络
这里所说的神经网络指的是人工神经网络(ArtificialNeural Network,ANN),是近年来人工智能领域的研究热点,模拟的是人脑神经元之间的传递过程,通过构建数学映射模型,在神经元之间通过激励函数来传递信息,从而从输入映射到输出。由于最开始构建的神经网络模型,没有得到任何训练,从输入映射得到的输出可能相对于我们期望的输出误差较大,这时通过把误差反向传播,以调节中间神经元之间的权值,经过大量这种训练和反馈调节过程,最终神经网络系统能够得到准确度较高的结果。
图2.6. 神经网络示意图
图2.6中通过一个形象的例子来示意了神经网络工作的过程,将神经网络系统看做一个复杂的水管管道系统,每一层都有很多节点,每一个节点均与上下邻近的所有节点相邻,且位于节点上的开关可以控制流向下一层的每个节点的水量大小。现在希望神经网络能够识别阿拉伯数字,在图片库中有很多写有数字的照片,我们将照片的数据看做水流,从最上层流入最下层,该系统会将最下层接收到水流最多的桶上的数字判定为输入照片的数字。最开始的时候,误差比较大,经常识别错误,这时我们就调节中间层每一个开关,控制不同方向的流量。经过大量这种训练调节过程,最终我们只要将写有数字的卡片输入,就能非常准确的识别出对应的数字。
3.1 P类问题、NP类问题和NP完全问题
在介绍这三类问题时,首先介绍一下多项式时间复杂度。当我们说起冒泡排序算法,会将其时间复杂度表示为,而快速排序算法,时间复杂度表示为,这两种算法均为多项式时间复杂度。通常,一个算法具有多项式时间复杂度时,均可表示为以下形式:
(5)
P(Polynominal)类问题,即能够在多项式时间复杂度内得到该问题的解。而NP类问题(Non-DeterministicPolynomial Problems),从字面上翻译为“非确定性多项式问题”,即不能在确定的多项式时间复杂度内得到该问题的解。另一方面来定义,NP类问题指的是“能够在多项式时间复杂度内验证问题的一个解”。也就是说,虽然我们不知道是否存在一个算法能够在多项式时间复杂度内得到NP问题的解,但我们可以在多项式时间复杂度内验证某个答案是否是NP问题的一个可行解。旅行商问题(TSP)是一个著名的NP问题,该问题描述了一个商人要去拜访n个城市,要求途中经过每个城市1次且仅1次,最后回到出发城市,如何找到最短的那条回路?该问题,如果用蛮力法来罗列所有的组合,复杂度为,这就不是多项式时间复杂度了。NP完全问题是NP问题的一个子集,如果任何一个NP问题,均可在多项式时间复杂度内转化为某个NP问题,那么就被称为NP完全问题。进而可以推得,如果中存在某个NP问题可以在多项式时间复杂度内求解,那么任何一个NP问题都可以在多项式时间复杂度内求解,即著名的难题“NP=P?”。
3.2 模拟退火算法求解TSP问题
模拟退火算法其实也是一种贪婪算法,只不过加入了随机因素来接受一个比当前解更差的解。由于普通的贪婪算法容易陷入局部最优,因此,以一定概率接受更差的解可以跳出一些局部最优。如下图3.1所示,从A点开始出发搜索最低点,普通贪婪算法搜索到B点时即停止搜索,而B点是一个局部最优解。模拟退火算法会以一个概率接受继续向C点移动,因此有可能会跨过C点,进而到达问题的最优解D。
图 3.1. 模拟退火算法寻求最优解示意图
将模拟退火算法的执行步骤,表示为如下伪代码形式:
算法1:采用模拟退火算法求解组合优化问题的执行步骤
输入:组合优化问题的一个初始解,及目标函数的值。
输出:问题的解(可能为最优解,也可能为次优解)
01:产生问题的一个初始解,目标函数值及初始温度;
02:产生问题的一个新解,并计算其目标函数值和衰减后的温度;
03:当时,接受解,否则,以概率接受解;
04:如果超过一定次数均没有接受新解,结束当前搜索,否则,重复02~03步骤。
算法1所示步骤为在一次温度衰减下的搜索过程,通常会重复执行算法1直到温度衰减到某个较低的值,不断迭代优化当前已经找到的最优解,然后从这些解中选择使得目标值最小的那个解为问题搜索得到的最优解。
图 3.2. 旅行商问题
在求解TSP问题时,需要在如图3.2所示的无向图中,寻求从某点出发并回到该点的一个哈密顿回路。每两个点之间的路径有一个权重,可看作路程里数,现在需要从A点出发,经过图中其他所有点1次回到A点的最短路径。模拟退火算法的做法是,首先我们从一条可行的回路出发,如A—>B—>D—>E—>F—>C—>A,这条回路看做初始解,并将路径长度24记为目标函数初始值。然后将起点与终点之外的路径做一个随机的重排,比如随机交换两点的位置,得到问题的新的解,根据新的解对应的目标函数值的大小判断是否接受新的解,运用算法1来循环执行该优化过程。
本节介绍通过模拟退火算法实现求解TSP问题和蚁群算法模拟蚂蚁找食物的仿真程序及其结果。程序通过C语言编写,在VisualStudio2012中编译通过。在通过图形化界面动态展现蚁群寻找食物过程时,用到了EasyX图形库。
4.1 模拟退火算法应用于求解TSP问题的实践
在该仿真中,解决一个有30个节点的全连通无向图的TSP问题,该问题如果通过暴力求解法,需要判别的组合数量为30!,这是一个非常巨大的数字。程序首先通过一个函数生成了图数据,写入到txt文本中,如图4.1和图4.2所示。第一行表示图中有30个节点,总共有435条边数据。第二行开始,(x,y,m)表示从节点x到节点y的权重为m。图4.3为模拟退火算法参数设定。
图 4.1.图数据
图 4.2.图数据
图 4.3.模拟退火算法参数
首先生成一个初始解,并计算该解对应的TSP回路的总代价,然后经过模拟退火算法优化,对比优化后的解与初始解的总代价。图4.4表示模拟退火过程连续拒绝接受更差解的次数为50,图4.5表示连续拒绝更差解的次数为5000,即在一次温度衰减时,尝试更多次的搜索新解。可以看到,搜索次数更多时,能够得到一个代价更低的TSP回路。
图 4.4.模拟退火算法优化结果(拒绝次数为50)
图 4.5.模拟退火算法优化结果(拒绝次数为5000)
4.2 蚁群算法应用于求解最短路径问题的实践
在本节中,介绍通过C语言编写蚁群算法模拟蚂蚁找食物的过程,并通过EasyX图形库将蚁群的位置动态的显示出来。蚁群活动的区域为一个600x600像素点的区域,每个蚂蚁每次可以移动一个像素点,移动的方向为以它为中心的周围8个方向,如下图4.6所示。
图 4.6.蚂蚁移动方向示意图
蚁群在移动时,初始化时去寻找食物,当寻找到食物的时候,就会寻找窝,寻找窝和寻找食物的过程,均依据不同信息素来表征方向。在没有信息素的时候,大概率直线移动,但会以一定概率选取其他方向。图4.7~图4.10为蚁群算法在模拟蚂蚁找食物过程的结果图。
图 4.7.蚁群算法仿真图1
图 4.8.蚁群算法仿真图2
图 4.9.蚁群算法仿真图3
图 4.10.蚁群算法仿真图4
该次仿真结果得到了蚁群移动区域收敛于食物(黄色圆点)和窝(红色圆点)之间的路径,但结果收敛的效果并不是特别理想。这是因为信息素的损耗系数,蚂蚁犯错的概率,已经遗留信息素的多少,均影响了算法的结果。而在本次实验中,均根据估计设定的参数,另一方面算法实现本身还需进一步优化修正,因此,算法并没有收敛于最优的路径。但从整个结果的趋势可以看出,蚁群是能够依靠信息素使得移动区域收敛于食物和窝之间的路径,并且接近于直线。
本文针对常见的最优化问题及其应用场景进行了分析和实践。首先,介绍了常用最优化方法,包括方法的基本模型,使用步骤,算法特性等。然后,对比分析了P类问题,NP问题,NP完全问题,以及如何通过启发式算法去解决优化此类非确定性时间复杂度问题。最后,在仿真实践部分,通过实现模拟退火算法解决具有NP难度的TSP问题,并得到了一条代价更低的路径。通过实现蚁群算法,模拟了蚂蚁找食物的过程,并得到了蚁群移动区域收敛于食物和窝之间区域的结果。
【参考文献】
[1] ThomasH.Cormen, Charles E.Leiserson, Ronald L.Rivest,CliffordStein著.算法导论[M].机械工业出版社,2012.
[2] 马学森,宫帅,朱建,唐昊.动态凸包引导的偏优规划蚁群算法求解TSP问题[J].通信学报,2018.
[3]https://baike.baidu.com/item/NP%E5%AE%8C%E5%85%A8%E9%97%AE%E9%A2%98/4934286?fr=aladdin