【精选】贪心算法的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贪心算法的应用
课程名称:算法设计与分析
院系:计算机科学与信息工程学院
学生姓名:****
学号:**********
专业班级:********************************** 指导教师:******
201312-27
贪心算法的应用
摘要:顾名思义,贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。贪心算法求问题一般具有两个重要性质:贪心选择性质和最优子结构性质。所谓贪心选择性是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法主要区别。当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
背包问题是一个经典的问题,我们可以采用多种算法去求解0/1背包问题,比如动态规划法、分支限界法、贪心算法、回溯法。在这里我们采用贪心法解决这个问题。
关键词:贪心法背包问题最优化
目录
第1章绪论 (3)
1.1 贪心算法的背景知识 (3)
1.2 贪心算法的前景意义 (3)
第2章贪心算法的理论知识 (4)
2.1 问题的模式 (4)
2.2 贪心算法的一般性描述 (4)
第3章背包问题 (5)
3.1 问题描述 (5)
3.2 问题分析 (5)
3.3算法设计 (5)
3.4 测试结果与分析 (10)
第4章结论 (12)
参考文献 (13)
附件 (13)
第1章绪论
1.1 贪心算法的背景知识
贪心算法又叫登山法,它的根本思想是逐步到达山顶,即逐步得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。“贪心”可以理解为以逐步的局部最优,达到最终的全局最优。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。一定要注意,选择的贪心策略要有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的决策影响。也就是说某状态以后的过程不会影响以前的状态,至于当前的状态有关,也称这种特性为无后效性。已经学会在解的范围可以确定的情况下,可以采用枚举或递归策略,找出所有的结果,一一比较它们,可能在有限的时间内找不到问题的解。这时可以考虑用贪心的策略,选取那些最可能到达解的情况来考虑。例如为了使生产某一产品所花费的时间最少,一种贪心的策略就是在生产该产品的每一道工序上都选择最省时的方法。所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。
1.2 贪心算法的前景意义
贪心算法的主要思想是从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时算法停止。该算法存在问题其一是不能保证求得的最后解是最佳的;其二,不能用来求最大或最小解问题;其三,只能求满足某些约束条件的可行解的范围。所以贪心算法是解决最优化问题时的一种简单但适用范围有限的策
略。贪心算法无后向性在解的范围可以确定的情况下,可以采用枚举或递归策略,找出所有的结果,一一比较它们,可能在有限的时间内找不到问题的解。这时可以考虑用贪心的策略,选取那些最可能到达解的情况来考虑。贪婪算法策略在《数据结构》课程中的算法也有广泛的应用,如霍夫曼树、构造最小生成树的Prim算法和Kruskal算法的决策过程,都是使用的贪婪算法策略。
第2章贪心算法的理论知识
2.1 问题的模式
对于背包问题。
重量为w1,w2,w3…wn的若干物品和容量为m的背包,物品的价值分别为p1,p2,p3…pn。要求找出这n个物品的一个子集,使其尽可能是选入背包的物品的价值最大,即:
最大化:w1+w2+w3+…+wn<=m时,也就是如果所选取的货物的总重量小于背包容量就全选进去;但出现了w1+w2+w3+…+wn>m时,对物品先进行按单位价值高到低排序,为了不把物品原来的编码打乱,采用一个数组来存放单位价值从大到小的物品的编码即可。所以就只能选取n个货物中的一部分使其总利润最大。
2.2 贪心算法的一般性描述
贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解或者是整体最优解的近似解。贪心算法的基本思路如下:(1)建立数学模型来描述问题。
(2)把求解的问题分成若干个子问题。
(3)对每一子问题求解,得到子问题的局部最优解。
(4)把子问题的解局部最优解合成原来解问题的一个解。
这就是一个用贪婪算法来解决背包问题课题,我们假设每一种货物都可以分成需要的任意小部分放入背包,要求从中取得最大利润。因为每一个物品都可
以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答。
第3章背包问题
3.1 问题描述
贪心算法解决背包问题:
一个商人带着一个能装m千克的背包去乡下收购货物,准备将这些货物卖到
城里获利。现在有n种货源,且知道第i中货物有w
i 千克,可获利p
i
元。请编
写算法帮助商人收购货物,以获取最高的利润。
3.2 问题分析
首先,输入物品的个数和背包的容量,再对所有物品的重量累加如果总重量小于背包的容量,就将所有的物品装入背包;如果大于背包的总容量将这些物品按照单位价值从高到低的顺序进行排序,然后进行选择。并且要求所选物品的最终总量不能超过背包能承受的重量,要求所选的最终方案为最优。
3.3算法设计
对于本课题我们可一大致分两种情况:当w1+w2+w3+...+wn<=m时,选取所有物品即可,得到总的价值;当w1+w2+w3+...+wn>m的情况,只能选取一部分货物装入背包,这里假设每一个物品都可以分成任意一小部分,所以利用贪心策略,每次优先选取价值与重量比最大的装入背包,就能获得最高的利润,直到背包刚好装满为止,然后输出必要的数据及结果。在对物品按单位价值从大到小排列的具体实现可以使用快速排列算法,并用p1[max]=0来标记已经进行排列的物品,这样可以使搜索的项越来越少。
3.3.1算法分析