计算机算法基础.ppt
合集下载
计算机算法与程序设计PPT课件
Bellman-Ford算法
适用于有负权边的有向图,通过对所有边进行松弛操作,逐步更新 起点到其它顶点的距离。
最小生成树问题求解方法
Prim算法
适用于无向连通图,通过贪心策略每次选择连接已选顶点和未选顶点中权值最小 的边,逐步构建最小生成树。
Kruskal算法
适用于无向连通图,通过并查集数据结构维护图的连通性,每次选择权值最小的 边加入最小生成树,并保证不形成环。
栈
后进先出(LIFO)的数据结构,支 持压栈和弹栈操作
03
02
链表
非连续内存空间,通过指针连接元 素,插入和删除操作较为方便
队列
先进先出(FIFO)的数据结构,支 持入队和出队操作
04
树和图数据结构简介
树
具有层次结构的数据结构,包括二叉树、红黑树等,用于表示具有父子关系的 数据
图
由节点和边组成的数据结构,用于表示复杂的关系网络,如社交网络、交通网 络等
评估算法执行过程中所需额外空间的数量级,也常 用大O表示法。
评估方法
最坏情况分析、平均情况分析、最好情况分 析等。
02
程序设计基础
编程语言选择与特点
1 2
高级语言与低级语言
解释型与编译型语言的区别,如Python、Java 与C、C等。
面向对象与面向过程
如Java、C与C语言的编程范式对比。
3
动态类型与静态类型
计算机算法与程序设 计PPT课件
目录
• 计算机算法概述 • 程序设计基础 • 基本数据结构及其应用 • 排序与查找算法研究 • 图论相关算法探讨 • 动态规划思想在程序设计中的应用 • 计算机算法与程序设计实践案例分析
01
计算机算法概述
适用于有负权边的有向图,通过对所有边进行松弛操作,逐步更新 起点到其它顶点的距离。
最小生成树问题求解方法
Prim算法
适用于无向连通图,通过贪心策略每次选择连接已选顶点和未选顶点中权值最小 的边,逐步构建最小生成树。
Kruskal算法
适用于无向连通图,通过并查集数据结构维护图的连通性,每次选择权值最小的 边加入最小生成树,并保证不形成环。
栈
后进先出(LIFO)的数据结构,支 持压栈和弹栈操作
03
02
链表
非连续内存空间,通过指针连接元 素,插入和删除操作较为方便
队列
先进先出(FIFO)的数据结构,支 持入队和出队操作
04
树和图数据结构简介
树
具有层次结构的数据结构,包括二叉树、红黑树等,用于表示具有父子关系的 数据
图
由节点和边组成的数据结构,用于表示复杂的关系网络,如社交网络、交通网 络等
评估算法执行过程中所需额外空间的数量级,也常 用大O表示法。
评估方法
最坏情况分析、平均情况分析、最好情况分 析等。
02
程序设计基础
编程语言选择与特点
1 2
高级语言与低级语言
解释型与编译型语言的区别,如Python、Java 与C、C等。
面向对象与面向过程
如Java、C与C语言的编程范式对比。
3
动态类型与静态类型
计算机算法与程序设 计PPT课件
目录
• 计算机算法概述 • 程序设计基础 • 基本数据结构及其应用 • 排序与查找算法研究 • 图论相关算法探讨 • 动态规划思想在程序设计中的应用 • 计算机算法与程序设计实践案例分析
01
计算机算法概述
计算机基础课件ppt-第3讲 计算机软件基础知识(1)
•栈:限定在一端进行插入与删除的线性表。 其 允许插入与删除的一端称为栈顶,用指针top表 示栈顶位置。 不允许插入与删除的另一端称为栈 底,用指针bottom表示栈底。 栈按照“先进后 出”(FILO)或“后进先出”(LIFO)组织数据, 栈具有记忆作用。
•栈的存储方式有顺序存储和链式存储。 栈的基 本运算:
•二叉树基本性质: •(1) 在二叉树的第k层上,最多有2k-1(k≥1)个结 点;
•(2) 深度为m的二叉树最多有2m-1个结点;
•(3) 度为0的结点(即叶子结点)总是比度为2 的结点多一个;即n0=n2+1
•(4) 具有n个结点的二叉树,其深度至少为 [log2n]+1,其中[log2n]表示取log2n的整数部分 •(5) 具有n个结点的完全二叉树的深度为 [log2n]+1;
•线性结构的条件,(一个非空数据结构): (1) 有 且只有一个根结点; (2) 每一个结点最多有一个 前件,也最多有一个后件。 •非线性结构:不满足线性结构条件的数据结构。
树结构:一个元素可以有两个或两个以上的 直接后继元素
1.3栈和队列
•栈 是只能通过访问它的一端来实现数据结构存 储和检索的一种线性数据结构
• 算法的基本要素:一是对数据对象的运算和 操作;二是算法的控制结构。
• 指令系统:一个计算机系统能执行的所有指 令的集合。
• 基本运算和操作包括:算术运算、逻辑运算、 关系运算、数据传输。
•算法的三种基本控制结构:顺序结构、选择结构、 循环结构。
• 算法基本设计方法:列举法、归纳法、递推、 递归、减半递推技术、回溯法。
•算法效率的度量—算法复杂度:算法时间复杂度 和算法空间复杂度。
•算法时间复杂度:指执行算法所需要的计算工作 量。即算法执行过程中所需要的基本运算次数。 通常,一个算法所用的时间包括编译时间和运行 时间。
•栈的存储方式有顺序存储和链式存储。 栈的基 本运算:
•二叉树基本性质: •(1) 在二叉树的第k层上,最多有2k-1(k≥1)个结 点;
•(2) 深度为m的二叉树最多有2m-1个结点;
•(3) 度为0的结点(即叶子结点)总是比度为2 的结点多一个;即n0=n2+1
•(4) 具有n个结点的二叉树,其深度至少为 [log2n]+1,其中[log2n]表示取log2n的整数部分 •(5) 具有n个结点的完全二叉树的深度为 [log2n]+1;
•线性结构的条件,(一个非空数据结构): (1) 有 且只有一个根结点; (2) 每一个结点最多有一个 前件,也最多有一个后件。 •非线性结构:不满足线性结构条件的数据结构。
树结构:一个元素可以有两个或两个以上的 直接后继元素
1.3栈和队列
•栈 是只能通过访问它的一端来实现数据结构存 储和检索的一种线性数据结构
• 算法的基本要素:一是对数据对象的运算和 操作;二是算法的控制结构。
• 指令系统:一个计算机系统能执行的所有指 令的集合。
• 基本运算和操作包括:算术运算、逻辑运算、 关系运算、数据传输。
•算法的三种基本控制结构:顺序结构、选择结构、 循环结构。
• 算法基本设计方法:列举法、归纳法、递推、 递归、减半递推技术、回溯法。
•算法效率的度量—算法复杂度:算法时间复杂度 和算法空间复杂度。
•算法时间复杂度:指执行算法所需要的计算工作 量。即算法执行过程中所需要的基本运算次数。 通常,一个算法所用的时间包括编译时间和运行 时间。
计算机算法ppt
特权说明
VIP用户有效期内可使用VIP专享文档下载特权下载或阅读完成VIP专享文档(部分VIP专享文档由于上传者设置不可下载只能阅读全文),每下载/读完一篇VIP专享文 档消耗一个VIP专享文档下载特权。
年VIP
月VIP
连续包月VIP
享受60次VIP专享文档下载特权,一次发放,全 年内有效。
VIP专享文档下载特权自VIP生效起每月发放一次,每次发放的特权有 效期为1个月,发放数量由您购买的VIP类型决定。
0下载券文档一键搜索
VIP用户可在搜索时使用专有高级功能:一键搜索0下载券文档,下载券不够用不再有压力!
无限次复制特权 内容特权 文档格式转换
VIP有效期内可以无限次复制文档内容,不用下载即可获取文档内容 VIP有效期内可以将PDF文档转换成word或ppt格式,一键转换,轻松编辑!
阅读页去广告
VIP有效期内享有搜索结果页以及文档阅读页免广告特权,清爽阅读没有阻碍。
3、算法解决问题的类型
计算机科学领域的问题大致可分为以下三种类型:
一、判定性问题:这类问题给出的是与否的判别。 例如连通性问题,回路问题,查找与排序问题,字 符匹配问题等。
二、最优化问题:这类问题是在所有可能的解中求 出最优解。例如求函数的极值,最短路径问题,最 小生成数问题等。
三、函数计算问题:这类问题是在一定约束条件下 求数值解,例如方程求根,矩阵运算,函数求值等。
VIP专享文档下载特权自VIP生效起每月发放一次,每次发放的特权有 效期为1个月,发放数量由您购买的VIP类型决定。
每月专享9次VIP专享文档下载特权,自VIP生效 起每月发放一次,持续有效不清零。自动续费, 前往我的账号-我的设置随时取消。
服务特权 共享文档下载特权 VIP累积特权 100W优质文档免费下载
计算机的运算基础分析PPT课件
计算机科学与工程学院
补码补的码用的用途途————整整数数的的编码编码
补码是一种使用最广泛的整数表示方法,其编码规则为: 正数的补码其符号位为0,其余各位与数的绝对值相同, 负数的补码其符号位为1,其余各位是数的绝对值取反 然后在最末位加1。例如:
X=+1000101 [X]补=01000101 X=-1000101 [X]补=10111011
2 100
2 50 0
2 25 0
2 12
1
26
0
23
0
1
1
0
1
0.345 2
0.690 2
1.380 2
0.760 2
1.520
2 1.04
计算机科学与工程学院
八进制
8 100
8 12
4
81
4
0
1
十六进制
16 100
16 6
4
0
6
二进制
3位变1位
4位变1位
十六进
八进制
分别以小数 点为中心, 向前向后每
计算机科学与工程学院
带符号数的表示
假定一个数在机器中占用8位。
(1) 原码——负号用“1”,正号用“0”,其余用七位二进制表示 0X 0<=X +7: 00000111 +0:00000000
[X]原= 1|X| X<=0 - 7: 10000111 - 0:10000000
(2)反码 [X]反=
计数制——计数的方法
计
进
数
位
制
制
计算机科学与工程学院
十进制 二进制 八进制 十六进制 其它进制
基数—— 数码的个数或进位值
补码补的码用的用途途————整整数数的的编码编码
补码是一种使用最广泛的整数表示方法,其编码规则为: 正数的补码其符号位为0,其余各位与数的绝对值相同, 负数的补码其符号位为1,其余各位是数的绝对值取反 然后在最末位加1。例如:
X=+1000101 [X]补=01000101 X=-1000101 [X]补=10111011
2 100
2 50 0
2 25 0
2 12
1
26
0
23
0
1
1
0
1
0.345 2
0.690 2
1.380 2
0.760 2
1.520
2 1.04
计算机科学与工程学院
八进制
8 100
8 12
4
81
4
0
1
十六进制
16 100
16 6
4
0
6
二进制
3位变1位
4位变1位
十六进
八进制
分别以小数 点为中心, 向前向后每
计算机科学与工程学院
带符号数的表示
假定一个数在机器中占用8位。
(1) 原码——负号用“1”,正号用“0”,其余用七位二进制表示 0X 0<=X +7: 00000111 +0:00000000
[X]原= 1|X| X<=0 - 7: 10000111 - 0:10000000
(2)反码 [X]反=
计数制——计数的方法
计
进
数
位
制
制
计算机科学与工程学院
十进制 二进制 八进制 十六进制 其它进制
基数—— 数码的个数或进位值
计算机算法PPT大全
//链式队列
LINKLIST *front;
//队头指针
LINKLIST *rear;
//队尾指针
}QUEUE;
第3章 走在算法的路上之——分析简单的数据结构
3.4 后进先出的栈
3.4.1 什么是栈
栈允许在同一端进行插入和删除操作,允许进行插入和删除操作的一端称为栈顶(top),另一端称为栈底(bottom)。栈底是固 定的,而栈顶浮动的;如果栈中元素个数为零则被称为空栈。插入操作一般被称为进栈(PUSH),删除操作一般被称为退栈 (POP)。 在栈中有两种基本操作,分别是入栈和出栈。 (1)入栈(Push) 将数据保存到栈顶。在进行入栈操作前,先修改栈顶指针,使其向上移一个元素位置,然后将数据保存到栈顶指针所指的位 置。入栈(Push)操作的算法如下: ①如果TOP≥n,则给出溢出信息,作出错处理。在进栈前首先检查栈是否已满,如果满则溢出;不满则进入下一步骤②; ②设置TOP=TOP+1,使栈指针加1,指向进栈地址; ③S(TOP)=X,结束操作,X为新进栈的元素。 (2)出栈(Pop) 将栈顶的数据弹出,然后修改栈顶指针,使其指向栈中的下一个元素。出栈(Pop)操作的算法如下: ①如果TOP≤0,则输出下溢信息,并实现出错处理。在退栈之前先检查是否已为空栈,如果是空则下溢信息,如果不空则进 入下一步骤②; ②X=S(TOP),退栈后的元素赋给X; ③TOP=TOP-1,结束操作,栈指针减1,指向栈顶。
(4)获取队列第1个元素,即将队头的元素取出,不删除该元素,队头仍然是该元素。
(5)判断队列Q是否为空
3.3.4 队列的链式存储
当使用链式存储结构表示队列时,需要设置队头指针和队尾指针,这样做的好处是可以设置队头指的针和队尾的指针。在入
计算机算法基础(第7章)
⑤ 从未检测结点表的表头取一结点作为下一个待检测结 点,重复上述过程。 12
算法7.6 宽度优先检索算法 procedure BFS(v)
//宽度优先检索G,它从结点v开始。所有已访问结点被标记为VISITED(i)=1。//
VISITED(v)←1;u←v
//VISITED(n)是一个标示数组,初始值 VISITED(i)=0, 1≤i≤n //
16
2) 宽度优先周游 算法7.7 宽度优先图的周游算法 procedure BFT(G,n) //G的宽度优先周游// int VISITED(n) for i←1 to n do VISITED(i)←0 repeat for i←1 to n do //反复调用BFS// if VISITED(i)=0 then call BFS(i) endif repeat end BFT 注:若G是无向连通图或强连通有向图,则一次调用 BFS即可完成对T的周游。否则,需要多次调用
至多有n-1个这样的结点考虑,故总共至多做n-1次结点加入队列的 操作。需要的队列空间至多是n-1。所以s(n,e)=Ο(n)(其余变量所需的 空间为Ο(1)) 当G是一个具有v与其余的n-1个结点相连的图,则邻接于v的全部n1个结点都将在“同一时刻”被放在队列上(Q至少应有Ω(n)的空 间)。 同时,数组VISITED(n)本身需要Θ(n) 的空间。 所以s(n,e)=Θ(n)——这一结论与使用邻接表或邻接矩阵无关。Biblioteka 1 124 5 6
3
7 无向图G P162 4
2 5 6
3 7
8
8
G的宽度优先生成树 P165
18
定理7.4 修改算法BFS,在第1行和第6行分别增加语句T←Φ和 T←T∪{(u,w)}。修改后的算法称为BFS*。若v是无向图中任一结 点,调用BFS*,算法终止时,T中的边组成G的一棵生成树 procedure BFS*(v)
算法7.6 宽度优先检索算法 procedure BFS(v)
//宽度优先检索G,它从结点v开始。所有已访问结点被标记为VISITED(i)=1。//
VISITED(v)←1;u←v
//VISITED(n)是一个标示数组,初始值 VISITED(i)=0, 1≤i≤n //
16
2) 宽度优先周游 算法7.7 宽度优先图的周游算法 procedure BFT(G,n) //G的宽度优先周游// int VISITED(n) for i←1 to n do VISITED(i)←0 repeat for i←1 to n do //反复调用BFS// if VISITED(i)=0 then call BFS(i) endif repeat end BFT 注:若G是无向连通图或强连通有向图,则一次调用 BFS即可完成对T的周游。否则,需要多次调用
至多有n-1个这样的结点考虑,故总共至多做n-1次结点加入队列的 操作。需要的队列空间至多是n-1。所以s(n,e)=Ο(n)(其余变量所需的 空间为Ο(1)) 当G是一个具有v与其余的n-1个结点相连的图,则邻接于v的全部n1个结点都将在“同一时刻”被放在队列上(Q至少应有Ω(n)的空 间)。 同时,数组VISITED(n)本身需要Θ(n) 的空间。 所以s(n,e)=Θ(n)——这一结论与使用邻接表或邻接矩阵无关。Biblioteka 1 124 5 6
3
7 无向图G P162 4
2 5 6
3 7
8
8
G的宽度优先生成树 P165
18
定理7.4 修改算法BFS,在第1行和第6行分别增加语句T←Φ和 T←T∪{(u,w)}。修改后的算法称为BFS*。若v是无向图中任一结 点,调用BFS*,算法终止时,T中的边组成G的一棵生成树 procedure BFS*(v)
计算机算法基础(第五章)PPT教学课件
if VISITED(w)=0 then //w未被检测//
call ADDQ(w,Q) //ADDQ将w加入到队列Q的末端//
VISITED(w)←1 //同时标示w已被访问//
endif
repeat
段:LCHILD, DATA,RCHILD//
if T≠0 then call VISIT(T) call PREORDER(LCHILD(T)) call PREORDER(RCHILD(T))
endif end PREORDER
2020/12/11
4
⑵后根次序周游 算法5.2 后根次序周游的递归表示 procedure POSTORDER(T) //T是一棵二元树。T的每个结点有三个信息
2020/12/11
6
注:
一棵二元树可由中根遍历序列+先根遍历序列、或 中根遍历序列+后根遍历序列唯一确定。但不能由先 根遍历序列+后根遍历序列唯一确定。
如已知一棵二元树的中根遍历次序是:
DGBEAFHC
先根遍历次序是:ABDGECFH
A
则这棵二元树唯一确定如下:
B
C
D
E
F
2020/12/11
G
H
② 访问邻接于v且尚未被访问的所有结点——这些结 点是新的未被检测的结点。将这些结点依次放置到一未检 测结点表(队列Q)中(末端插入) 。
③ 标记v已被检测。
④ 若未检测结点表为空,则算法终止;否则
⑤ 从未检测结点表的表头取一结点作为下一个待检
2020/12/11
11
测结点,
算法5.6 宽度优先检索算法
其中,t(0)≤c1。 归纳法证明t(n)≤c2n+c1,其中c2是一使得c2≥2c1的常数。 1)当n=0时,成立
算法PPT课件
2.2简单的算法举例
➢ S1:使p=1,或写成1p
➢ S2:使i=2,或写成2i
➢ S3:使p与i相乘,乘积仍放在变量p中,可表
示为:p*ip
若是1000,求什么?
➢ S4:使i的值加1,即i+1 i
➢ S5:如果i不大于5,返回重新执行S3;否则 ,算法结束
➢ 最后得到p的值就是 5!的值
若2求.21简×3单×的5×算7×法9×举11例
➢ S4:sign=(-1)*sign -1/2
➢ S5:term=sign*(1/deno) 1-1/2
➢ S6:sum=sum+term 3 ➢ S7:deno=deno+1
满足,返回S4
➢ S8:若deno≤100返回S4;否则算法结束
例2.4 求 1 1 1 1 1 1
234
➢ 用ni代表第i个学生学号,gi表示第i个学生成绩 S1:1i S2:如果gi≥80, 则输出ni和gi,否则不输出 S3:i+1i S4:如果i≤50,返回到步骤S2,继续执行, 否则,算法结束
例2.3 判定2000—2500年中的每一年是 否闰年,并将结果输出。
➢闰年的条件:
(1)能被4整除,但不能被100整除的年份都是 闰年,如2008、2012、2048年 (2)能被400整除的年份是闰年,如2000年 不符合这两个条件的年份不是闰年 例如2009、2100年
➢算法是解决“做什么”和“怎么做”的 问题
➢程序中的操作语句,是算法的体现 ➢不了解算法就谈不上程序设计
2.1 什么是算法 2.2 简单的算法举例 2.3 算法的特性 2.4 怎样表示一个算法 2.5 结构化程序设计方法
2.1 什么是算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1i n
1i n
k in
pi yi [( zk yk )wk
( yi zi )wi ] pk / wk
1i n
k in
pi yi
1in
差值=0
由以上分析得,
若
pi zi
pi yi
,则Y将不是最优解;
若
pi zi
4. 最优解的证明
即证明:由第三种策略所得到的贪心解是问题的最优解。
最优解的含义:在满足约束条件的情况下,使目标函数取极(大或
小)值的可行解。
贪心解是可行解,故只需证明:贪心解可使目标函数取得极值。
证明的基本思想:将此贪心解与(假设中的)任一最优解相比较。
● 如果这两个解相同,则显然贪心解就是最优解。
1)一般方法
根据题意,选取一种度量标准。然后按照这种度量标准对n个输入 排序,并按序一次输入一个量。
如果这个输入和当前已构成在这种量度意义下的部分最优解加在一
起不能产生一个可行解,则不把此输入加到这部分解中。否则,将当前 输入合并到部分解中从而得到包含当前输入的新的部分解。
这一处理过程一直持续到n个输入都被考虑完毕,则记入最优解集 合中的输入子集构成这种量度意义下的问题的最优解
在Y中作以下调整:将yk增加到xk,因为yk<xk,为保持解的可行性,
必须从(yk+1,…,yn)中减去同样多的量。设调整后的解为Z=(z1, z2, …, zn),
其中zi=xi,1≤i≤k,且有:
wi ( yi zi ) wk ( zk yk )
k in
Z的效益值有:
pi zi pi yi ( zk yk )wk pk / wk ( yi zi )wi pi / wi
● 如果这两个解不同,就设法去找开始不同的第一个分量位置i,然后 设法用贪心解的这个xi去替换最优解对应的分量 ,并证明最优解在分量代 换前后总的效益值没有任何变化(且不违反约束条件)。
可反复进行代换,直到代换后产生的最优解与贪心解完全一样。这一 代换过程中,最优解的效益值没有任何损失,从而证明贪心解的效益值与 代换前后最优解的效益值相同。即,贪心解如同最优解一样可取得目标函 数的最大/最小值。
② 设j是使xi≠1的最小下标。由算法的执行过程可知,
xi=1 1≤i<j,
0≤xj <1
xi=0 j<i≤n
反证:假设X不是问题的最优解,则必定存在一个可行解 ,设为
Y=(y1, y2, …, yn),使得: pi yi pi xi
且应有:
wi yi M
设k是使得yk≠ xk的最小下标,则有yk< xk,可分一下情况说明:
问题:求这n个作业的一个子集J,其中的所有作业都可 在其截至期限内完成。——J是问题的一个可行解。
位,还剩余空间Δ M=10。同时,背包获得p3=15的效益增量。 其次考虑物品2。就Δ M=10而言有,也只能选择物品2的一部分 装入背包。下一步将放入物品2的10/15装包,即
x2=10/15=2/3 最后,背包装满Δ M=0,物品1将不能装入背包,故 x1=0 。
背包最终可以获得效益值= x1 p1 +x2 p2+x3 p3 = 31 (次优解,非问题的最优解)
分析:
① 装入背包的总重量不能超过M
② 如果所有物品的总重量不超过M,即 wixi ≤M,则把所有的物
品都装入背包中将获得最大可能的效益值
1in
③ 如果物品的总重量超过了M,则将有物品不能(部分/全部)装 入背包中。由于0≤xi≤1,所以可以把物品的一部分装入背包,故最终 背包中可刚好装入重量为M的若干物品(整体或一部分)。这种情况下, 如果背包没有被装满,则显然不能获得最大的效益值。
故,新的量度标准是:每次装入要使累计效益值与所用容量的比值 有最多的增加(首次装入)和最小的减小(其后的装入)。
此时,将按照物品的单位效益值:pi/wi 比值的非增次序考虑。
实例分析(例3.1)
∵ p1/w1<p3/w3 <p2/w2 ∴ 首先,将物品2放入背包,此时x2=1,背包容量减少w2=15
贪心方法: 这种能够得到某种量度意义下的最优解的分级处理方法
称为贪心方法
注:
贪心解
?
=
最优解
直接将目标函数作为量度标准也不一定能够得到问题的最优解
使用贪心策略求解的关键是选取能够得到问题最优解的量度标准。
3. 贪心方法的抽象化控制描述
procedure GREEDY(A,n) //A(1:n)包含n个输入// solution←Φ //将解向量solution初始化为空// for i←1 to n do x←SELECT(A) //按照度量标准,从A中选择一个输入, 其值赋予x并将之从A中删除// if FEASIBLE(solution,x) then //判定x是否可以包含在当前解向量 中,即是否能共同构成可行解// solution←UNION(solution,x) //将x和当前的解向量合并成 新的解向量,并修改目标函数// endif repeat return
从而得证:该贪心解即是问题的最优解。
定理3.1 如果p1/w1≥ p2/w2≥…≥ pn/wn,则算法GREEDYKNAPSACK对于给定的背包问题实例生成一个最优解。
证明:
设X=(x1, x2, …, xn)是GREEDY-KNAPSACK所生成的贪心解。
① 如果所有的xi都等于1,则显然X就是问题的最优解。否则,
x2=2/15 最后,背包装满, Δ M=0,物品3不装包,即x3=0 。
背包最终可以获得效益值= x1 p1 +x2 p2+x3 p3 = 28.2 (次优解,非问题的最优解)
2)以容量作为度量标准
以目标函数作为度量标准所存在的问题:尽管背包的效 益值每次得到了最大的增加,但背包容量也过快地被消耗掉 了,从而不能装入“更多”的物品。
● 如果正在考虑的物品放不进去,则只取其一部分装满背包:如 果该物品的一部分不满足获得最大效益增量的度量标准,则在剩下的物 品种选择可以获得最大效益增量的其它物品,将它或其一部分装入背包。
如:若Δ M=2,背包外还剩两件物品i,j,且有(pi= 4,wi=4) 和(pj = 3,wj=2),则下一步应选择j而非i放入背包:
目标:使装入背包的物品的总效益达到最大。
问题的形式描述目标函Fra bibliotek: pi xi
1in
约束条件:
wi xi M
1in
0 xi 1, pi 0, wi 0,1 i n
可 行 解:满足上述约束条件的任一(x1,x2,…,xn) 都是问题 的一个可行解——可行解可能为多个。 (x1,x2,…,xn)称为问题的一个解向量
最 优 解:能够使目标函数取最大值的可行解是问题的最优解
——最优解也可能为多个。
例3.1 背包问题的实例 设,n=3,M=20, (p1,p2,p3) = (25,24,15), (w1,w2,w3) = (18,15,10)。
可能的可行解如下:
(x1,x2,x3)
① (1/2,1/3,1/4) ② (1, 2/15, 0 ) ③ (0, 2/3, 1) ④ (0, 1, 1/2)
分类:根据描述问题约束条件和目标函数的数学模型的特性和问题的 求解方法的不同,可分为:线性规划、整数规划、非线性规划、动态规 划等。
——最优化问题求解 贪心方法:一种改进的分级的处理方法,可对满足上述特征的某些问 题方便地求解。
2. 贪心方法的一般策略
问题的一般特征:问题的解是由n个输入的、满足某些事先给定的 条件的子集组成。
pi yi
,则或者Z=X,则X就是最优解;
或者Z≠X,则重复以上替代过程,或者证明Y不是最优
解,或者把Y转换成X,从而证明X是最优解
3.3 带有限期的作业排序
1. 问题描述
假定在一台机器上处理n个作业,每个作业均可在单位时 间内完成;同时每个作业i都有一个截至期限di>0,当且仅当作 业i在其截至期限以前被完成时,则获得pi>0的效益。
存在的问题:效益值没有得到“最大程度”的增加
3)最优的度量标准
影响背包效益值得因素: 背包的容量M 放入背包中的物品的重量及其可能带来的效益值
可能的策略是:在背包效益值的增长速率和背包容量消耗速率之间 取得平衡,即每次装入的物品应使它所占用的每一单位容量能获得当前 最大的单位效益。
在这种策略下的量度是:已装入的物品的累计效益值与所用容量之 比。
end GREEDY
3.2 背包问题
1.问题的描述
已知n种物品具有重量(w1,w2,…,wn)和效益值(p1,p2,…,pn) ,及一个 可容纳M重量的背包;设当物品i全部或一部分xi放入背包将得到pi xi的效 益,这里,0≤ xi ≤1, pi >0。
问题:采用怎样的装包方法才能使装入背包的物品的总效益最大?
改进:让背包容量尽可能慢地消耗,从而可以尽量装入 “较多”的物品。
即,新的标准是:以容量作为度量
该度量标准下的处理规则:
● 按物品重量的非降次序将物品装入到背包;
● 如果正在考虑的物品放不进去,则只取其一部分装 满背包;
实例分析(例3.1)
∵ w3<w2 <w1 ∴ 首先将物品3放入背包,此时x3=1,背包容量减少w3=10个单
个单位,还剩余空间Δ M=5。同时,背包获得p2=24的 效益增量。
其次,在剩下的物品1和3中,应选择物品3,且就Δ M=5而言有, 只能放入物品3的一部分到背包中 。即
x3=5/10=1/2 最后,背包装满Δ M=0,物品1将不能装入背包,故x1=0 。