热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化领域算法的分类

优化领域解决问题通常使用三种方法,第一种是精确方法(ExactApproaches),另外还有启发式算法(He

优化领域解决问题通常使用三种方法,第一种是精确方法(Exact Approaches),另外还有启发式算法(Heuristics Algorithm)和以及元启发式算法(Meta-heuristics Algorithm)

1. 精确方法(Exact Approaches),通常使用数学建模的方法建立数学模型(包括决策变量,目标函数以及约束条件),通过优化算法(单纯形法,分支定界,分支切割,割平面方法等)解这个数学模型得出问题的最优解。解的好坏由模型建立的是否合理,优化算法的设计等决定。

对于常见的数学模型,比如线性规划(Linear Programming),整数规划 (Integer Programming),混合整数规划 (Mixed Integer Programming),二次规划 (Quadratic Programming)等,都可以使用优化求解器IBM Cplex,Gurobi,FICO Xpress,SCIP (前两个学术用户可以免费申请,最后一个是开源的)等进行求解,大大节省了求解时间。关于各个优化求解器性能,可参见这个网址,可以看出Cplex 和 Gurobi 的性能总体较好。值得注意的是,这个网站的性能对比仅仅是对比算例的结果,对于其他模型或者算例的结果可能有所不同。比如我最近解决一个问题,同样的求解器,同样的问题,变量和约束少的模型求解时间时间是变量和约束多的模型求解时间近十倍

为什么使用启发式算法呢?使用精确方法虽然可以求得最优解(Optimal Solution),可以从理论上证明求得的解是最优的,但随着问题规模的扩大(可能呈指数级或者阶乘级的增长),对于中等规模或者大规模的问题,在有限的时间内不可能求得最优解(对于我研究的问题,目前可以求得42个机器最优解)。这就需要在求解精读和运算时间之间有一个折衷和权衡(trade off)。对于大规模的问题,我们不需要求得最优解,只需在短时间内求得次优解(Sub-Optimal Solution)或者满意解(Satisfactory Solution)(西南交通大学靳番教授和金炜东教授对满意优化理论做了开创性研究),加之计算机性能的提升,出现了启发式算法。

作者:知乎用户
链接:https://www.zhihu.com/question/29762576/answer/212138630
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

2. 启发式算法(Heuristics Algorithm),启发式算法是以问题为导向(Problem-oriented)程序,根据问题的特殊结构或者性质来改进解。一般情况下,启发式算法比精确方法更容易实现。启发式算法包括构造算法(Construction Algorithm)改进算法 (Improvement Algorithm)等。对于构造算法(Construction Algorithm),针对布局问题,对于和其它机器流量比较小的机器尽量摆在机器序列的两端,这样就可以形成一个启发式规则,基于流量的排列(Flow-based permutation, FBP), 这样就可以根据这个规则得到机器序列;另外还有基于机器长度的排列(Length-based permutation, LBP)规则,尽量把长度小的机器排列到中间,基于这规则也可以得到一个机器序列。这样产生的解都是可行解(Feasible Solution),但一般情况下都不是最优解。对于 改进算法 (Improvement Algorithm),常见的就是使用基于贪婪方法的爬山法(Hill Climbing),见下图,它是由一个初始解开始改进解,爬山法太贪婪,容易陷入局部最优(Local Optimum)。如图所示,从C点搜索到A点,就陷入了局部最优,而问题的全局最优在B点。

                      

3. 元启发式算法(Meta-heuristics Algorithm),相对于启发式算法,元启发式算法是问题独立(Problem-independent)的是针对大范围的优化问题提供通用的流程。一般地,需要提供至少一个初始可行解(Initial Feasible Solution),在预定义的搜索空间高效搜索用以迭代地改进解。可以分为基于单个解(Single solution based)的元启发式算法,例如: 模拟退火算法 (Simulated Annealing)和禁忌搜索算法(Tabu Search); 另外是基于群体(Population based)的元启发式算法,比如遗传算法(Genetic Algorithm),分散搜索算法(Scatter Search Algorithm),粒子群算法(Particle Swarm Optimization)和蚁群算法(Ant Colony Optimization)等。元启发式算法可以使用某些操作跳出局部最优。

现在越来越多的学者使用混合算法(Hybrid Algorithm),包括元启发式算法与精确方法的混合,比如这篇09年的综述文章:Hybridizing exact methods and metaheuristics: A taxonomy。对于双行布局问题,既要确定机器排列顺序,又要确定机器的精确位置,这是一个组合优化和连续优化结合的问题,对于大规模的算例,需要元启发式算法和精确方法协同解决。元启发式算法与启发式算法的混合,元启发式算法的性能非常依赖初始解的质量,可以使用启发式算法为元启发式算法产生初始解,以提高其性能。元启发式算法与元启发式算法的混合,可以参考11年的综述文章:Hybrid metaheuristics in combinatorial optimization: A survey。算法的混合可以发挥各个算法的优点,抵消其缺点,以实现更好的性能。

元启发算法范围内大部分应用了随机优化机构,多目标优化用的蛮多。但是多目标优化中,目标太多时一般会先降维(比如PCA),多于3-5个目标的优化效率低,也没有太多实际的可读性。接近实际的案例里面一般都会涉及多种算法,先用元启发算法求得一个小范围的满意解,再用启发或者精确算法找最优解,这样即提高了计算效率又能有高质量结果。


参考连接:https://www.zhihu.com/question/29762576

 

 

 

 

 

 

 

 


推荐阅读
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了Foundation框架中一些常用的结构体和类,包括表示范围作用的NSRange结构体的创建方式,处理几何图形的数据类型NSPoint和NSSize,以及由点和大小复合而成的矩形数据类型NSRect。同时还介绍了创建这些数据类型的方法,以及字符串类NSString的使用方法。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
author-avatar
心雨1006600
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有