虽然设计一个好的求解算法更像是一门艺术,而不像是技术,但仍然存在一些行之有效的能够用于解决许多问题的算法设计方法,你可以使用这些方法来设计算法,并观察这些算法是如何工作的。一般情况下,为了获得较好的性能,必须对算法进行细致的调整。但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。
本章首先引入最优化的概念,然后介绍一种直观的问题求解方法:贪婪算法。最后,应用该算法给出货箱装船问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题、最小代价生成树等问题的求解方案。
1.1 最优化问题
本章及后续章节中的许多例子都是最优化问题( optimization problem),每个最优化问题都包含一组限制条件( c o n s t r a i n t)和一个优化函数( optimization function),符合限制条件的问题求解方案称为可行解( feasible solution),使优化函数取得最佳值的可行解称为最优解(optimal solution)。
例1-1 [ 渴婴问题] 有一个非常渴的、聪明的小婴儿,她可能得到的东西包括一杯水、一桶牛奶、多罐不同种类的果汁、许多不同的装在瓶子或罐子中的苏打水,即婴儿可得到n 种不同的饮料。根据以前关于这n 种饮料的不同体验,此婴儿知道这其中某些饮料更合自己的胃口,因此,婴儿采取如下方法为每一种饮料赋予一个满意度值:饮用1盎司第i 种饮料,对它作出相对评价,将一个数值si 作为满意度赋予第i 种饮料。
通常,这个婴儿都会尽量饮用具有最大满意度值的饮料来最大限度地满足她解渴的需要,但是不幸的是:具有最大满意度值的饮料有时并没有足够的量来满足此婴儿解渴的需要。设ai是第i 种饮料的总量(以盎司为单位),而此婴儿需要t 盎司的饮料来解渴,那么,需要饮用n种不同的饮料各多少量才能满足婴儿解渴的需求呢?
设各种饮料的满意度已知。令xi 为婴儿将要饮用的第i 种饮料的量,则需要解决的问题是:
找到一组实数xi(1≤i≤n),使n ?i = 1si xi 最大,并满足:n ?i=1xi =t 及0≤xi≤ai 。
需要指出的是:如果n ?i = 1ai < t,则不可能找到问题的求解方案,因为即使喝光所有的饮料也不能使婴儿解渴。
对上述问题精确的数学描述明确地指出了程序必须完成的工作,根据这些数学公式,可以对输入/ 输出作如下形式的描述:
输入:n,t,si ,ai(其中1≤i≤n,n 为整数,t、si 、ai 为正实数)。
输出:实数xi(1≤i≤n),使n ?i= 1si xi 最大且n ?i=1xi =t(0≤xi≤ai)。如果n ?i = 1ai <t,则输出适当的错误信息。
在这个问题中,限制条件是n ?i= 1xi =t 且0≤xi≤ai,1≤i≤n。而优化函数是n ?i= 1si xi 。任何满足限制条件的一组实数xi 都是可行解,而使n ?i= 1si xi 最大的可行解是最优解。
例1-2 [装载问题] 有一艘大船准备用来装载货物。所有待装货物都装在货箱中且所有货箱的大小都一样,但货箱的重量都各不相同。设第i 个货箱的重量为wi(1≤i≤n),而货船的最大载重量为c,我们的目的是在货船上装入最多的货物。
这个问题可以作为最优化问题进行描述:设存在一组变量xi ,其可能取值为0或1。如xi 为0,则货箱i 将不被装上船;如xi 为1,则货箱i 将被装上船。我们的目的是找到一组xi ,使它满足限制条件n ?i = 1wi xi ≤c 且x i ? {0, 1}, 1 ≤i≤n。相应的优化函数是n ?i= 1xi 。
满足限制条件的每一组xi 都是一个可行解,能使n ?i= 1xi 取得最大值的方案是最优解。
例1-3 [最小代价通讯网络] 城市及城市之间所有可能的通信连接可被视作一个无向图,图的每条边都被赋予一个权值,权值表示建成由这条边所表示的通信连接所要付出的代价。包含图中所有顶点(城市)的连通子图都是一个可行解。设所有的权值都非负,则所有可能的可行解都可表示成无向图的一组生成树,而最优解是其中具有最小代价的生成树。
在这个问题中,需要选择一个无向图中的边集合的子集,这个子集必须满足如下限制条件:所有的边构成一个生成树。而优化函数是子集中所有边的权值之和。
分享到:
相关推荐
贪婪算法是一种解决问题的有效策略,它基于“每一步都选择当前看起来最优”的决策原则。这种算法在许多实际问题中都有应用,比如最小化成本、最大化收益等。贪婪算法并不保证总能得到全局最优解,但它的简单性和高效...
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。贪婪算法的特点在于它总是做出局部最优的选择,期望这些局部最优的选择能导出全局最优解。然而...
贪婪算法是一种局部最优策略,每次选择当前最优的解决方案,直到问题得到解决。在OFDM资源分配中,这种策略可能涉及为每个用户分配尽可能多的带宽或功率,同时保持系统整体性能的平衡。具体步骤通常包括: 1. 初始...
贪婪算法是计算机科学中一种重要的算法思想,常用于求解优化问题。在处理问题时,它遵循“每一步都采取当前看起来最优的选择”这一原则,即局部最优解,期望通过一系列局部最优解来达到全局最优解。然而,贪婪算法并...
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。在易语言中实现贪婪算法,可以帮助我们解决很多优化问题,比如任务调度、网络路由、...
贪婪算法是一种在程序设计领域广泛应用的解决最优化问题的方法。其核心思想是在问题求解的过程中,每一步都选择当前看起来最优的决策,即贪婪准则,以此逐步构建全局的最优解。然而,这种决策一旦做出就无法更改,这...
一个具体的贪婪算法matlab程序代码,可以作为子程序嵌入到多种程序中,方便实用
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。在数据结构领域,贪婪算法经常用于解决资源分配、任务调度等问题,它追求局部最优解,...
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法策略。它通常用于解决优化问题,尤其是在时间或空间复杂度上需要高效求解的问题。贪婪算法的核心...
贪婪算法是一种解决问题的策略,它在每一步决策中都选择当前看起来最优的选择,而不考虑长远的整体最优解。这种算法在很多情况下能得出全局最优解,但并非对所有问题都能保证。贪婪算法通常包括四个步骤:建立问题的...
### 贪婪算法在分页式存储管理中的应用 #### 实验背景与目的 本实验旨在通过编写一个模拟分页式存储管理程序,帮助学习者深入理解分页式存储管理的基本概念及其实现方法。实验重点是实现最近最久未使用(LRU)页面...
贪婪算法是一种解决问题的方法,特别是在数学建模中,它通过每一步选择局部最优解来尝试达到全局最优解。这种策略在一些问题中非常有效,但在其他问题中可能无法找到全局最优解,因为它通常不考虑未来的决策可能带来...
贪婪算法是一种解决问题的策略,它在每一步都选择局部最优解,希望通过一系列局部最优的选择达到全局最优解。这种算法的特点是决策不可逆,一旦做出选择,就不能改变。贪婪准则则是指导这种决策过程的标准,通常是在...
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在许多情况下,这种方法不能保证得到全局最优解,但通常可以得到近似最优解。在MATLAB环境...
本篇文章将深入探讨标题和描述中提到的一些核心算法,包括动态规划、分治算法、概率算法、模拟退火算法、搜索算法、贪婪算法、在线MATLAB应用、遗传算法以及组合算法。 1. **动态规划**:动态规划是一种解决具有...
贪婪算法是一种用于解决最优化问题的有效策略,它通过在每个步骤中选择当前看起来最优的解决方案来逐步构建全局最优解。这种算法的核心在于它的贪婪准则,即在每一步选择局部最优解,期望这些局部最优解组合起来能...
本算法用遗传算法和贪婪算法解决了背包问题,产生解得方法用贪婪算法,然后引入了一个错解的修复算法,搜索的时候用遗传算法。保证了快速收敛和解的完备性。包含源程序,算法介绍以及一份详细的报告,希望对读者有很...
而在这个复杂的信号处理过程中,贪婪算法作为一种简单而有效的优化方法,常常被用来解决资源分配、功率控制等问题,以达到系统的最优性能。本文将深入探讨OFDM系统中贪婪算法的应用及其原理。 一、OFDM技术简介 ...