贪心法解活动安排问题(计算机算法设计与分析)

合集下载

贪心法解活动安排问题(计算机算法设计与分析)

贪心法解活动安排问题(计算机算法设计与分析)

实验报告
课程名称:算法设计与分析实验名称:贪心法解活动安排问题任课教师:专业:计算机科学与技术
班级: 20xx 级x班学号:
姓名:完成日期: 20xx年x月xx日
五、实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理,重新完成本次实验内容也是很顺利,在编程方面没有遇到什么困难。

计算机算法设计与分析第4章贪心算法

计算机算法设计与分析第4章贪心算法

4.1 活动安排问题
算法GreedySelector的效率极高。 算法GreedySelector的效率极高。当输入 GreedySelector的效率极高 的活动已按结束时间的非减序排列时, 的活动已按结束时间的非减序排列时,算法 只需O(n)的时间安排n个活动, O(n)的时间安排 只需O(n)的时间安排n个活动,使最多的活 动能相容地使用公共资源。 动能相容地使用公共资源。 如果所给出的活动未按非减序排列, 如果所给出的活动未按非减序排列,可以 O(nlogn)的时间重排 的时间重排。 用O(nlogn)的时间重排。
O(n)
数组s 数组s和f已按结束时 间f的非减序排列
for (int i=2;i<=n;i++) { if (s[i]>=f[j]) { A[i]=true; j=i; } else A[i]=false; }
} //j用以记录最近一次加入到集合 中的活动 用以记录最近一次加入到集合A中的活动 用以记录最近一次加入到集合
4பைடு நூலகம்1 活动安排问题
设待安排的11 11个活动的开始时间和结束时 例:设待安排的11个活动的开始时间和结束时 间按结束时间的非减序排列如下: 间按结束时间的非减序排列如下:
i S[i] f[i] 1 1 4 2 3 5 3 0 6 4 5 7 5 3 8 6 5 9 7 6 10 8 8 11 9 8 12 10 2 13 11 12 14
4.1 活动安排问题的最优子结构性质 是原问题的一个以贪心选择开始的最优解, 若A是原问题的一个以贪心选择开始的最优解, 是原问题的一个以贪心选择开始的最优解 是活动安排问题E’={i∈E:si≥f1}的 则 A’=A-{1}是活动安排问题 是活动安排问题 ∈ 的 一个最优解。 一个最优解。-最优子结构性质 证明:如能找到E’的一个解 的一个解B’,它包含比A’更多 证明:如能找到 的一个解 ,它包含比 更多 的活动,则将活动1加入 中将产生E的一个解 加入B’中将产生 的一个解B, 的活动,则将活动 加入 中将产生 的一个解 , 它包含比A更多的活动 这与A的最优性矛盾 更多的活动。 的最优性矛盾。 它包含比 更多的活动。这与 的最优性矛盾。

计算机算法设计与分析-贪心算法

计算机算法设计与分析-贪心算法

2023/10/8
计算机算法设计与分析
4
树的基本性质
连通无回路的图G称为树。 树是点比边多一的连通图,G连通且q=p–1 。 树是点比边多一的无回路图:G无回路且q=p–1 树若添条边就有回路:G无回路,但对任意的u,
v∈V(G),若uvE(G),则G+uv中恰有一条回路 树若减条边就不连通:G连通,但对e∈E(G),
图条 出且边 权该。 重回这 较路n小中–的1包n条含–边1e必条1。定边该包(回括在路了实中G现必的中有n体个条现顶不为点是n。e个的这 边样 顶e就 点i。得 的令到 选T’了择={G)T的+。e一1}棵–ei最。小T’生也成是树G的。生成树。又
cc矛K次不 要 是这((TTr盾选行 保 连u’’样))s。≤k择=! 证 通c做a故(cl权因 这 的T算(是T)必重为 或n,法)否定–+较不者T的1c’有可是小能是条(做e图1以G的保无边法) 的G–n证回构呢:的c最–(这路成在?e最1小1条的n树)保,小生–边。,证c生1成(。必条无e成1树)须边回树≤且使构路c包含(这成e的含i有)n树,前了边–?从提e1e1条而下1。。边依
初始化:Path中仅含有源v。
2023/10/8
计算机算法设计与分析
21
最临近算法中的数据结构
图用连接矩阵W[i][j]给出,即W[i][j]为 结点i到结点j的权重。
Path[]记录依次连接的城市,p记录当前 到达的最后一个顶点,cost为当前路径 长度。
如果节点k已经到达,则arrived[k]=true。
3
最小生成树
设G = (V, E)是一个无向连通带权图,即一个网 络。E的每条边(v, w)的权为c[v][w]。

算法分析与设计实验二贪心算法

算法分析与设计实验二贪心算法

实验二:贪心算法
【实验目的】
应用贪心算法求解活动安排问题。

【实验性质】
验证性实验。

【实验要求】
活动安排问题是可以用贪心算法有效求解的很好的例子。

问题:有n个活动的集合A={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。

求解:安排尽量多项活动在该场地进行,即求A的最大相容子集。

设待安排的11个活动的开始时间和结束时间按结束时间的升序排列如下:
将此表数据作为实现该算法的测试数据。

【算法思想及采用的数据结构】
【程序代码】
【运行结果】
【算法分析和心得体会】
附加题:
【实验要求】
需要在某个城市的n个居民区之间铺设煤气管道,则在这n个居民区之间只要铺设n-1条管道即可。

假设任意两个居民区之间都可以架设管道,但由于地理环境的不同,所需经费不同。

选择最优的施工方案能使总投资尽可能少,这个问题即为求网的“最小生成树”问题。

参照以下居民区示意图,使得求解算法为:在可能架设的m条管道中选取n-1条,既能连通n-1个居民区,有使总投资达到“最小”。

网可采用邻接矩阵为存储结构,以定点对(i,j)
应用贪心算法策略,采用普里姆算法或Kruskal算法来求解居民区示意图的最小生成树,采用合适的数据结构。

用C语言或C++语言编写程序代码,选上述居民区示意图中的数据作为测试数据。

并调试输出正确结果。

【算法思想及采用的数据结构】
【程序代码】
【运行结果】
【算法分析和心得体会】。

算法设计与分析第4章贪心算法

算法设计与分析第4章贪心算法


for (i=0;i<n;i++) {

if (d[i].w>c) break;

x[d[i].i]=1;

opt+=d[i].v;
算时间上界为 O(nlogn)。当然, 为了证明算法的正确

c-=d[i].w;
性,还必须证明背包

}

if (i<n){

x[d[i].i]=c/d[i].w;
问题具有贪心选择性 质。
动态规划算法通常以自底向上的方式解各子问题,而 贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求 问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质 ,必须证明每一步所作的贪心选择最终导致问题的整 体最优解。
14
4.2 贪心算法的基本要素

opt+=d[i].w;

c -= d[i].w;

}

return opt;
其中Element类说明为 参见本书P115
•}
23
4.3 最优装载
2.贪心选择性质
可以证明最优装载问题具有贪心选择性质。
3.最优子结构性质
最优装载问题具有最优子结构性质。
由最优装载问题的贪心选择性质和最优子结构性 质,容易证明算法loading的正确性。
7
4.1 活动安排问题
在下面所给出的解活动安排问题的贪心算法greedySelector :
• public static int greedySelector(int [] s, int [] f, boolean a[])

算法设计与分析讲义贪心法

算法设计与分析讲义贪心法
特点
贪心算法在每一步选择时都采取在当前状态下最好或最优( 即最有利)的选择,而不考虑可能出现的后果。
贪心算法与动态规划
贪心算法是一种局部最优策略,即每一步选择在当前状态下 是最优的,但不一定能够得到全局最优解。
动态规划是一种全局最优策略,通过将问题分解为子问题, 逐步求解得到全局最优解。
贪心算法的历史与发展
选择适当的贪心策略
选择适当的贪心策略可以最大程度 地减少计算时间。
空间优化
通过优化算法的空间复杂度,减少 算法的空间占用,以提高算法的效 率。
并行计算
利用并行计算技术,将算法并行化 ,以提高算法的运行速度。
数据结构优化
使用合适的数据结构可以加快算法 的执行速度,如哈希表、堆等。
06
贪心算法的应用扩展
贪心算法的优化策略
总结词
记忆化搜索、动态规划优化、全局状态决策
详细描述
贪心算法虽然能够得到问题的近似解,但在某些情况 下可能无法得到最优解。为了提高贪心算法的性能, 可以采用一些优化策略,例如记忆化搜索,将已经计 算过的状态存储下来,避免重复计算;动态规划优化 ,将问题分解为子问题,通过解决子问题来解决原问 题;全局状态决策,将问题的所有状态作为一个整体 来考虑,利用问题的整体性质来得到更好的解。
在资源分配问题中,贪心算法可以用于求解具有单位资源的最大权值
组合问题、分数背包问题等。
05
贪心算法的实现技巧
贪心算法的编程实现
确定贪心策略
根据问题特性确定贪心策略,通常选择最优解或近似最优解。
编码实现
将贪心策略转化为代码实现,通常使用循环和条件语句实现算 法。
测试样例
设计测试样例,覆盖各种情况,提高算法的健壮性和正确性。

(算法分析与设计)2.贪心算法

(算法分析与设计)2.贪心算法

n
wixi
vixi
28.2
31
31.5
...
i1
[算法思路]1).将各物体按单位价值由高到低排序.
2).取价值最高者放入背包.
3).计算背包剩余空间.
4).在剩余物体中取价值最高者放入背包.
若背包剩余容量=0或物体全部装入背包为止
算法设计与分析 > 贪心算法
背包问题的贪心算法
print tour, cost }
*该算法不能求得最优解. 算法的最坏时间复杂性为O(n2)
该问题为NP难问题.
算法设计与分析 > 贪心算法
4.7 多机调度问题
问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工 处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上 加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小 的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽 可能短的时间内 由m台机器加工处理完成。 该问题为NP完全问题.
A complete tree is filled from the left: • all the leaves are on • the same level or • two adjacent ones and • all nodes at the lowest level are as far to the left as possible.
最大相容活动子集(1, 4, 8, 11), 也可表示为等长n元数组:(1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
算法设计与分析 > 贪心算法
活动安排问题贪心算法
template< class Type > void GreedySelector(int n, Type s[ ], Type f[ ], bool A[] ) { A[ 1 ] = true;

算法设计与分析_ 贪心法(1)_

算法设计与分析_ 贪心法(1)_
| I* {1}| > | I {1} | = | I' |
与 I'是关于N' 和C' 的最优解矛盾.
I* 1 I1
I*-{1} I-{1}
I*-{1} I-{1}=I '
不最 优
8
小结
• 装载问题是0-1背包的子问题 (每件 物品重量为1),NP难的问题存在多 项式时间可解的子问题.
• 贪心法证明:对规模归纳
vi都等于1,轮船载重限制 C 相当于
背包重量限制 b.
2
建模
设 <x1, x2, ... , xn> 表示解向量,xi= 0,1, xi= 1当且仅当第 i 个集装箱装上船
目标函数 约束条件
n
max xi
i=1
n
w xi i C
i=1
xi = 0,1 i = 1,2,...,n
3
算法设计
• 贪心策略:轻者优先 • 算法设计:
贪心法的优势:算法简单,时间和空
间复杂性低
8
最优装载问题
最优装载问题
问题:
n 个集装箱1, 2, … , n 装上轮船,集
装箱 i 的重量 wi, 轮船装载重量限制 为C, 无体积限制. 问如何装使得上船 的集装箱最多?不妨设每个箱子的重
量 wi C.
该问题是0-1背包问题的子问题. 集装
箱相当于物品,物品重量是 wi,价值
实例 v1=1, v2=5, v3=14, v4=18, wi=1, i=1,2,3,4. y=28
最优解:x3=2, x1=x2=x4=0,总重2
fi 4 5 6 7 9 9 10 11 12 13
解:{1, 4, 8}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称:算法设计与分析实验名称:贪心法解活动安排问题任课教师:张锦雄专业:计算机科学与技术班级: 2007 级 1班学号:
姓名:蓝冠恒完成日期: 2011年1月12日
五、实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理,重新完成本次实验内容也是很顺利,在编程方面没有遇到什么困难。

相关文档
最新文档