中国数学建模-编程交流-贪婪算法
wh-ee 重登录 隐身 用户控制面板 搜索 风格 论坛状态 论坛展区 社区服务 社区休闲 网站首页 退出
>> VC++,C,Perl,Asp...编程学习,算法介绍. 我的收件箱 (0)
中国数学建模 → 学术区 → 编程交流 → 贪婪算法
您是本帖的第 889 个阅读者
* 贴子主题:贪婪算法
b
等级:职业侠客
文章:470
积分:956
门派:黑客帝国
注册:2003-8-28
鲜花(0) 鸡蛋(0) 楼主
贪婪算法
第 1 章 贪婪算法
虽然设计一个好的求解算法更像是一门艺术,而不像是技术,但仍然存在一些行之有效的能够用于解决许多问题的算法设计方法,你可以使用这些方法来设计算法,并观察这些算法是如何工作的。一般情况下,为了获得较好的性能,必须对算法进行细致的调整。但是在某些情况下,算法经过调整之后性能仍无法达到要求,这时就必须寻求另外的方法来求解该问题。
本章首先引入最优化的概念,然后介绍一种直观的问题求解方法:贪婪算法。最后,应用该算法给出货箱装船问题、背包问题、拓扑排序问题、二分覆盖问题、最短路径问题、最小代价生成树等问题的求解方案。
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 [最小代价通讯网络]
城市及城市之间所有可能的通信连接可被视作一个无向图,图的每条边都被赋予一个权值,权值表示建成由这条边所表示的通信连接所要付出的代价。包含图中所有顶点(城市)的连通子图都是一个可行解。设所有的权值都非负,则所有可能的可行解都可表示成无向图的一组生成树,而最优解是其中具有最小代价的生成树。
在这个问题中,需要选择一个无向图中的边集合的子集,这个子集必须满足如下限制条件:所有的边构成一个生成树。而优化函数是子集中所有边的权值之和。
----------------------------------------------
plot(100+t+15*cos(3.05*t),t=0..200,coords=polar,axes=none,scaling=constrained);
2004-5-27 19:37:49
b
等级:职业侠客
文章:470
积分:956
门派:黑客帝国
注册:2003-8-28
第 2 楼
1.2 算法思想
在贪婪算法(greedy
method)中采用逐步构造最优解的方法。在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。决策一旦作出,就不可再更改。作出贪婪决策的依据称为贪婪准则(greedy
criterion)。
例1-4 [找零钱]
一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2
5美分、1
0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪婪准则如下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。
假设需要找给小孩6 7美分,首先入选的是两枚2 5美分的硬币,第三枚入选的不能是2
5美分的硬币,否则硬币的选择将不可行(零钱总数超过6 7美分),第三枚应选择1
0美分的硬币,然后是5美分的,最后加入两个1美分的硬币。
贪婪算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习1)。
例1-5 [机器调度] 现有n 件任务和无限多台的机器,任务可以在机器上得到处理。每件任务的开始时间为si,完成时间为fi ,si
< fi 。[si , fi ] 为处理任务i 的时间范围。两个任务i,j 重指两个任务的时间范围区间有重叠,而并非是指i,j
的起点或终点重合。例如:区间[ 1,4 ]与区间[ 2,4 ]重叠,而与区间[ 4,7
]不重叠。一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。最优分配是指使用的机器最少的可行分配方案。
假设有n= 7件任务,标号为a 到g。它们的开始与完成时间如图13-1a 所示。若将任务a分给机器M1,任务b 分给机器M2,. .
.,任务g
分给机器M7,这种分配是可行的分配,共使用了七台机器。但它不是最优分配,因为有其他分配方案可使利用的机器数目更少,例如:可以将任务a、b、d分配给同一台机器,则机器的数目降为五台。
一种获得最优分配的贪婪方法是逐步分配任务。每步分配一件任务,且按任务开始时间的非递减次序进行分配。若已经至少有一件任务分配给某台机器,则称这台机器是旧的;若机器非旧,则它是新的。在选择机器时,采用以下贪婪准则:根据欲分配任务的开始时间,若此时有旧的机器可用,则将任务分给旧的机器。否则,将任务分配给一台新的机器。
根据例子中的数据,贪婪算法共分为n = 7步,任务分配的顺序为a、f、b、c、g、e、d。第一步没有旧机器,因此将a
分配给一台新机器(比如M1)。这台机器在0到2时刻处于忙状态。在第二步,考虑任务f。由于当f 启动时旧机器仍处于忙状态,因此将f
分配给一台新机器(设为M2 )。第三步考虑任务b, 由于旧机器M1在Sb =
3时刻已处于闲状态,因此将b分配给M1执行,M1下一次可用时刻变成fb = 7,M2的可用时刻变成ff =
5。第四步,考虑任务c。由于没有旧机器在Sc = 4时刻可用,因此将c 分配给一台新机器(M3),这台机器下一次可用时间为fc =
7。第五步考虑任务g,将其分配给机器M2,第六步将任务e 分配给机器M1, 最后在第七步,任务2分配给机器M3。(注意:任务d
也可分配给机器M2)。
上述贪婪算法能导致最优机器分配的证明留作练习(练习7)。可按如下方式实现一个复杂性为O (nl o
心兰相随引导者
- 粉丝: 1149
- 资源: 5639
最新资源
- 绿色建筑基本情况表.docx
- 矛盾纠纷大排查大化解切实专项行动分类台账.docx
- 民办培训机构设立核准表.doc
- 母婴保健技术服务人员考核审批表.doc
- 母婴保健技术服务执业许可申请表.doc
- 年度考核登记表.doc
- 年度项目绩效自评表(劳务派遣人员经费).docx
- 企业就业高校毕业生实行养老保险过渡费率试点申报表.docx
- 全市重点工作攻坚行动工作台账(1-12月份).docx
- 送达地址确认书(执行).doc
- EtherCAT总线通信学习资料,一手资料 提供基于stm32 mcuAX58100 ESC实现从站的具体方案,有完整的工程文件,提供源码以及工程配置、程序修改的视频,工程在开发板上已测 提供不同
- 基于springboot+vue框架的企业人事管理系统源码(java毕业设计完整源码).zip
- 机械设计芯片读取及激光打码机(sw18可编辑+2D+BOM+电气图+程序)全套设计资料100%好用.zip
- 基于SpringBoot+Vue的志愿者招募管理系统源码(java毕业设计完整源码).zip
- 基于算例IEEE33还有PG69,使用CPLEX+YALMIP进行二阶锥松弛建模的多时间断面潮流,有配电网重构,最优潮流,以及复现文章,模型,注释清晰,保证可运行
- 基于SpringBoot+Vue的校园篮球联赛管理系统源码(java毕业设计完整源码).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈