算法其实不好分类,因为概念有点宽泛。你不妨百度“十大算法”,其中就有一些不是优化算法,例如密码学算法、随机数生成算法等。但是如果限定只在优化算法中做分类,则会大致有点方向。因为所有的优化算法都是在一个可行域中找到一个解,这个解对应的目标函数值是最优的(最大或者最小)。
可以依据“理论体系”是否完善将算法分为“理论体系内算法”和“理论体系外算法”。根据是否使用目标函数“梯度”信息又可分为“连续优化算法”和“离散优化算法”。具体划分如下:
一、理论体系之内算法
这部分算法有比较完善地理论体系,可以从理论算解释算法收敛到哪里,收敛的速度怎么样。而且不管是离散优化还是连续优化,都可以写成目标+约束的统一数学模型。除此之外,对偶理论是该理论体系中的一大亮点,常常在理论推导和算法设计中扮演去足轻重的角色。
1:连续优化算法
这类算法用到了一个东西,那就是——“梯度”。“梯度”告诉我们往哪个方向走,如果步长足够小的话,则一定是更优的。利
用这个“梯度”信息,我们就可以从当前迭代点迭代至下一个迭代点。
根据二阶信息使用的区别,又可由最基本的最速下降法改进至牛顿法、拟牛顿法、信赖域法、BFGS、Limited-BFGS等。
2:离散优化算法
这类算法基本都归结为一类专门的优化算法——网络优化算法。其最典型最核心的算法设计思路便是动态规划。如果动态规划实
现成本过高,则会放弃部分精度而衍生出近似动态规划。如果最优子结构无法建立成功,则设计相应的贪婪算法。
二、理论体系之外算法
1:基本算法
遗传算法、粒子群算法(鸟群算法、鱼群算法、蜂群算法)、蚁群算法。其中遗传算法作为代表,他的迭代用到了“遗传”、“交叉”、“变异”三个迭代策略,这三种迭代都是概率形势的“乱来”,没有依赖于任何优化信息,这一点跟连续优化和离散优化中的动态规划策略截然不同。然后通过个体“适应度”函数(实质就是目标函数或者其变形)进行筛选。这种迭代不是点到点的迭代,而是一个“种群”到另一个“种群”的演化(进化),且目标函数不影响迭代步,只是影响迭代后(事后)的筛选。
一般来讲给类启发式算法目的是为了将原来大的没边的求解空间缩小到一个较小的求解空间,然后再通过有理论保证的精确优化技术做一个“局部搜索”。
如果求解一个网络的最短路问题,当网络过于庞大且网络结构过于复杂时,动态规划算法基本就难以在一个合理地时间范围内求解出最优解了。这时有两种策略,一种是近似动态规划技术。另一种就是启发式“群智能”优化,例如蚁群算法。
2:框架算法
这类算法单独做没有什么意义,一般都要作为框架,结合其他算法来用,在其框架中不断调用其他算法。
分支定界算法,模拟退火算法。其中分支定界算法结合连续优化算法可以将松弛问题的连续解“过渡”到整数解。针对非凸优化目标函数,一般连续优化算法(凸优化算法)只能收敛到一个“局部最优解”,如何使跳出这种“局部最优解”,慢慢找到“全部最优解”呢?这时,你就要结合模拟退火算法来做了。