求解优化问题算法探讨与分析

devtools/2024/11/8 17:47:32/

一、分枝定界法:强大的优化求解工具

(一)起源与发展

分枝定界法由查理德・卡普在 20 世纪 60 年代发明,当时成功求解了含有 65 个城市的旅行商问题,创下了记录。此后,该方法被广泛应用于整数规划问题、生产进度表问题、货郎担问题、选址问题、背包问题等众多领域。其发展历程中,不断有学者对其进行改进和拓展,使其适用范围更加广泛,求解效率不断提高。

(二)基本思想

分枝定界法将问题的可行解展开如树的分枝,再经由各个分枝中寻找最佳解。该方法的基本思想是对有约束条件的最优化问题的所有可行解空间进行搜索。在具体执行时,把全部可行的解空间不断分割为越来越小的子集,并为每个子集内的解的值计算一个下界或上界。通过这种方式,缩小搜索范围,最终找到最优解。例如,在求解整数规划问题时,以一般线性规划之单形法解得最佳解后,将非整数值之决策变量分割成为最接近的两个整数,分列条件,加入原问题中,形成两个子问题分别求解,从而求得目标函数值的上限(上界)或下限(下界)。

(三)求解步骤

  1. 设定最优解初始值为无穷大(如果问题的目标为最小化),然后根据分枝法则,从尚未被洞悉的节点中选择一个节点,并在此节点的下一阶层中分为几个新的节点。
  2. 计算每一个新分枝出来的节点的下限值。接着对每一节点进行洞悉条件测试,若节点的下限值大于等于当前最优解的值,或者已找到在此节点中具最小下限值的可行解且该可行解优于当前最优解,或者此节点不可能包含可行解,那么此节点可洞悉而不再被考虑。
  3. 判断是否仍有尚未被洞悉的节点,如果有,则继续进行步骤二,如果已无尚未被洞悉的节点,则演算停止,并得到最优解。例如,Kolen 等曾利用此方法求解含时间窗约束的车辆巡回问题,当节点数为 6 时,计算机演算所花费的时间大约 1 分钟,但当节点数扩大至 12 时,计算机有内存不足的现象产生,这说明分枝定界法比较适用于求解小型问题。同时,Held 和 Karp 指出分枝定界法的求解效率,与其界限设定的宽紧有极大的关系。

二、动态规划:高效的多阶段决策方法

(一)历史与特性

动态规划在 20 世纪 40 年代起源于人们对于水利资源多级分配和库存多级存储问题的研究。美国数学家贝尔曼逐渐发现了多阶段决策问题的背后结构,并在 1949 年提出了著名的最优化原理,即把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系逐个求解,开始了动态规划的研究。1950 年,贝尔曼确定了 “动态规划” 这一名称。1957 年,贝尔曼出版了书籍《动态规划》,并在 1961 年、1962 年相继再版,进一步阐明了动态规划的理论和方法。

动态规划具有诸多优点。首先,求解更容易、效率更高。它把原问题化成一系列结构相似的最优化子问题,每个子问题的变量个数比原问题少得多,约束集合也简单得多,故比较易于确定最优解。其次,解的信息更丰富。非线性规划或线性规划方法是对问题整体进行一次性求解,只能得到全过程的解;而动态规划将过程分解成多个阶段进行求解,不仅可以得到全过程的解,还可以得到所有子过程的解。再者,对于处理变量为整数的数学规划问题有特别的功效。在其他优化技术中,变量的整数或非负等约束会引出严重的麻烦问题,例如对问题变量加上只能取整数的限制,就不能用经典方法解决。然而,在动态规划中,要求某些或全部变量为整数,还将大大地简化计算过程。同时,动态规划能确定出绝对(全局)极大或极小,而不是相对(局部)的极值,这一点几乎超过了所有现存的计算方法,特别是经典最佳化方法。

然而,动态规划也存在一些局限性。其一,没有一个统一的标准模型。由于实际问题不同,其动态规划模型也各有差异,模型构建存在一定困难。其二,应用条件苛刻、通用性不足。构造动态规划模型状态变量必须满足 “无后效性” 条件,这一条件不仅依赖于状态转移律,还依赖于允许决策集合和指标函数的结构,不少实际问题在取其自然特征作为状态变量时并不满足这一条件,这就降低了动态规划的通用性。其三,状态变量存在 “维数障碍”。最优指标函数是状态变量的函数,当状态变量的维数增加时,最优指标函数的计算量将成指数倍增长,因此无论是手工计算还是电算,“维数障碍” 都是无法完全克服的。

(二)相关概念

在动态规划中,阶段是对整个过程的自然划分,通常根据时间顺序或空间顺序特征来划分阶段,以便按阶段的次序解优化问题。状态描述了研究过程所处的状况,即每一阶段开始时所处的状态。在最短路径问题中,状态既是某一阶段某一支路的始点,又是下一阶段某一支路的终点。通常,一个阶段有一个或若干个状态。动态规划中的状态必须满足无后效性,即如果某一阶段的状态给定后,则在这阶段以后过程的发展不受这阶段以前各状态的影响。过去的历史只能通过当前的状态去影响它未来的发展,当前的状态是以往历史的全部总结。

决策是当各段的状态取定以后,做出的不同决定,从而确定下一阶段的状态。策略是各段决策确定后,整个问题的决策序列。效果函数是用于衡量所选定策略优劣的数量指标,是定义在全过程和后部子过程上的函数。动态规划问题具有最优子结构性质,即问题的最优解包含了子问题的最优解。同时,子问题之间存在重叠性质,这些子问题之间可以共享相同的子问题,避免了重复计算。

(三)求解方法

动态规划的求解有顺序解法和逆序解法等基本方法。寻优方向与多阶段决策过程的实际行进方向相反,从最后一段开始计算逐段前推,求得全过程的最优策略,称为逆序解法;寻优方向与过程的行进方向相同,计算时从第一段开始逐段向后递推,计算后一阶段要用到前一阶段的求优结果,最后一段计算的结果就是全过程的最优结果,称为顺序解法。

动态规划的常见类型有多维动态规划、随机动态规划。变分法是另一种求最优结果的方法,对于复杂的变分问题,也可以利用动态规划法进行求解。

动态规划问题有许多经典的案例,如背包问题、机器负荷分配问题等。动态规划在现实世界的许多领域得到了广泛的应用,例如生产调度、资源分配、设备更新、信息处理、模式识别等,成为了运筹学中的活跃分支。

三、两者区别

(一)应用范围差异

分枝定界法通过搜索解空间的树状结构,利用限界来剪枝,并通过反复分支来逼近最优解。它适用于求解大规模的优化问题,如整数规划、混合整数规划和非线性规划等,并且能够找到全局最优解。例如,Kolen 等曾利用分枝定界法求解含时间窗约束的车辆巡回问题,当节点数为 6 时,计算机演算所花费的时间大约 1 分钟,但当节点数扩大至 12 时,计算机有内存不足的现象产生,这说明分枝定界法在一定规模的问题上具有较好的求解能力。

动态规划则更适用于较小规模的问题,尤其是问题具有重叠子问题和最优子结构性质的情况。例如在背包问题中,通过将问题分解为多个子问题,每个子问题对应不同的背包容量和物品选择情况,利用子问题的解来构建原问题的解。动态规划通过存储子问题的解,避免了重复计算,提高了算法效率。但当问题规模较大时,动态规划可能会面临 “维数障碍”,即随着状态变量的维数增加,计算量呈指数倍增长。

(二)求解思路差异

分枝定界法的核心在于搜索解空间的树状结构。首先设定目前最优解的值,然后根据分枝法则从尚未被洞悉的节点中选择一个节点,并在此节点的下一阶层中分为几个新的节点。接着计算每一个新分枝出来的节点的下限值,并对每一节点进行洞悉条件测试。如果节点不满足条件,则继续进行分枝,直到找到满足条件的节点或者所有节点都被洞悉为止。

动态规划则是将原问题分解成若干个子问题,并把子问题的解合并起来形成原问题的解。它要求问题具有最优子结构性质,即原问题的最优解可以由子问题的最优解来构成。动态规划通常以自底向上的方式解各子问题,通过记录子问题的解来避免重复计算。例如在求解最长公共子序列问题时,通过定义状态和状态转移方程,将问题分解为多个子问题,逐步求解并合并子问题的解。

(三)问题性质适应差异

分枝定界法适用于具有复杂约束条件的大规模优化问题,能够有效地处理整数规划等问题。它通过不断地分枝和定界,逐步缩小搜索范围,找到满足约束条件的最优解。

动态规划适用于具有重叠子问题和最优子结构性质的问题。如果问题不满足这些性质,动态规划可能无法有效地应用。例如,在一些问题中,子问题之间的关系不明显或者不存在最优子结构性质,此时使用动态规划可能无法得到有效的解决方案。

综上所述,分枝定界法和动态规划在应用范围、求解思路和问题性质适应等方面存在明显的差异。在实际应用中,需要根据问题的特点和规模选择合适的方法来求解优化问题。

四、应用场景

(一)分枝定界法的应用场景

分枝定界法在整数规划、混合整数规划和非线性规划等大规模问题中表现出色。例如在生产计划安排中,企业需要确定不同产品的生产数量,同时要满足各种资源约束和整数要求。分枝定界法可以通过将问题分解为多个子问题,逐步缩小搜索范围,找到最优的生产计划方案。假设一家制造企业有多种产品,每种产品的生产需要不同的原材料和加工时间,同时企业的生产能力和原材料供应有限。通过分枝定界法,可以将这个复杂的生产计划问题转化为一系列子问题,每个子问题对应不同的产品生产组合。通过计算每个子问题的下界和上界,逐步排除不可能的生产组合,最终找到最优的生产计划,使得企业的利润最大化。

在物流配送问题中,分枝定界法也能发挥重要作用。例如,物流公司需要安排车辆将货物从多个仓库运送到多个客户地点,同时要满足车辆容量限制和时间窗约束。这个问题可以建模为整数规划问题,使用分枝定界法求解。通过分枝定界法,可以将问题分解为多个子问题,每个子问题对应不同的车辆分配方案和行驶路线。通过计算每个子问题的下界和上界,逐步排除不可行的方案,最终找到最优的物流配送方案,使得运输成本最小化。

(二)动态规划的应用场景

动态规划适用于具有最优子结构和无后效性的问题,在各类具有阶段单调性特征的应用场景中广泛应用。比如在资源分配问题中,假设有一定数量的资源需要分配给多个项目,每个项目的收益与投入的资源量有关。这个问题可以通过动态规划来求解,将问题分解为多个阶段,每个阶段对应不同的资源分配决策。通过定义状态和状态转移方程,可以逐步计算出每个阶段的最优资源分配方案,最终得到全局最优的资源分配方案。

在股票交易问题中,投资者需要在不同的时间点决定买入或卖出股票,以最大化收益。这个问题可以看作是一个动态规划问题,每个阶段对应不同的时间点,状态可以定义为当前持有的股票数量和现金数量。通过定义状态转移方程,可以计算出在每个阶段的最优决策,即买入、卖出或持有股票。通过动态规划,可以找到最优的股票交易策略,使得投资者在给定的时间范围内获得最大收益。

在最长公共子序列问题中,给定两个字符串,需要找出它们的最长公共子序列。这个问题具有最优子结构和无后效性,可以通过动态规划来求解。通过定义状态和状态转移方程,可以逐步计算出两个字符串的最长公共子序列的长度。通过动态规划,可以高效地解决这个问题,在字符串匹配、生物信息学等领域有广泛的应用。


http://www.ppmy.cn/devtools/132364.html

相关文章

Oceanbase学习之一迁移mysql数据到oceanbase

一、数据库环境 #mysql环境 root192.168.150.162 20:28: [(none)]> select version(); ---------- | version() | ---------- | 8.0.26 | ---------- 1 row in set (0.00 sec) root192.168.150.162 20:28: [(none)]> show variables like ‘%char%’; ---…

Django中ListView 和 DetailView类的区别

在Django中,ListView 和 DetailView都是基于类的视图,在处理请求时通常会自动调用render_to_response函数,但由于项目需求不同,实现时需要重写render_to_response函数 ListView 和 DetailView介绍 ListView 介绍主要用于展示一个…

GEE| 对Landsat 8 影像进行主成分分析

对 Landsat 8 影像进行主成分分析并实现可视化 // 定义感兴趣区域 var roi ee.FeatureCollection(users/yongweicao11/Dongguan2022);// 加载 Landsat 8 图像集合,并根据 ROI 和日期范围进行过滤 var imageL8 ee.ImageCollection("LANDSAT/LC08/C02/T1_TOA…

大数据数据存储层MemSQL, HBase与HDFS

以下是对 MemSQL、HBase 和 HDFS 的详细介绍,这些工具在分布式数据存储和处理领域有着重要作用。 1. MemSQL MemSQL(现称为 SingleStore)是一种分布式内存数据库,兼具事务处理(OLTP)和分析处理(OLAP)的能力,专为高性能实时数据处理设计。 1.1 核心特点 内存优先存储…

【MongoDB】MongoDB的Java API及Spring集成(Spring Data)

文章目录 Java APISpring 集成1. 添加依赖2. 配置 MongoDB3. 创建实体类4. 创建 Repository 接口5. 创建 Service 类6. 创建 Controller 类7. 启动 Spring Boot 应用8. 测试你的 API 更多相关内容可查看 Java API maven <dependency><groupId>org.mongodb</gr…

无人机干扰与抗干扰,无人机与反制设备的矛与盾

无人机干扰与抗干扰&#xff0c;以及无人机与反制设备之间的关系&#xff0c;可以形象地比喻为矛与盾的较量。以下是对这两方面的详细探讨&#xff1a; 一、无人机干扰与抗干扰 1. 无人机干扰技术 无人机干扰技术是指通过各种手段对无人机系统进行干扰&#xff0c;使其失去正…

基于卷积神经网络的农作物病虫害识别系统(pytorch框架,python源码)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示&#xff1a; 基于卷积神经网络的农作物病虫害检测&#xff08;pytorch框架&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的农作物病虫害识别系统是在pytorch框架下实现的…

mybatis源码解析-sql执行流程

1 执行器的创建 1. SimpleExecutor 描述&#xff1a;最基本的执行器&#xff0c;每次查询都会创建新的语句对象&#xff0c;并且不会缓存任何结果。 特点&#xff1a; 每次查询都会创建新的 PreparedStatement 对象。 不支持一级缓存。 适用于简单的查询操作&#xff0c;不…