- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验三 01 背包问题不同算法设计、分析与对比
一.问题描述
给定 n 种物品和一背包。物品 i 的重量是 w ,其价值为 v ,背包的容量为 c。
i i
问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。说明:在选择装入背包的物品时,对每种物品i 只有两个选择,装入背包或
不装入背包,也不能将物品装入背包多次。
二.实验内容与要求
实验内容:
分析该问题适合采用哪些算法求解(包括近似解)。动态规划、贪心、回溯和分支限界算法。
分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分析。
动态规划:
动态规划:
递推方程:
m(i,j) = max{m(i-1,j),m(i-1,j-wi)+vi} j = wi; m(i-1,j) j wi;
时间复杂度为 O(n).
贪心法:
贪心法:
算法思想:贪心原则为单位价值最大且重量最小,不超过背包最大承重量为约束条件。也就是说,存在单位重量价值相等的两个包,则选取重量较小的那
个背包。但是,贪心法当在只有在解决物品可以分割的背包问题时是正确的。贪
个背包。但是,贪心法当在只有在解决物品可以分割的背包问题时是正确的。贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
用贪心法设计算法的特点是一步一步地进行,根据某个优化测度(可能是目标函数,也可能不是目标函数),每一步上都要保证能获得局部最优解。每一步只考虑一个数据,它的选取应满足局部优化条件。若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,
直到把所有数据枚举完,或者不能再添加为止。
回溯法:
回溯法:
回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function) 来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。这种具有限界函数的深度优先生成法称为回溯法。
对于有 n 种可选物品的 0/1 背包问题,其解空间由长度为 n 的 0-1 向量组成, 可用子集数表示。在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。当右子树中有可能包含最优解时就进入右子树搜索。
时间复杂度为:O(2 n)
空间复杂度为:O(n) 分支限界算法:
首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行
排列。在优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。
算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可
行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。
设计并实现所设计的算法。
对比不同算法求解该问题的优劣。
这动态规划算法和贪心算法是用来分别解决不同类型的背包问题的,当一件背包物品可以分割的时候,使用贪心算法,按物品的单位体积的价值排序,从大到小取即可。 当一件背包物品不可分割的时候,(因为不可分割,所以就算按物品的单位体积的价值大的先取也不一定是最优解)此时使用贪心是不对的,应使用动态规划。
设计方法
时间复杂度
优点
缺点
动态规划
Min{nc,2n}
可求得最优决策
序列
速度慢
贪心方法
O(2n)
速度较快
很难得到最优解
回溯法
O(n2n)
能够得到最优解
时间复杂度较高
分支限界法
O(2n)
速度较快,易求解
占用内存大,效率
不高
需要提交不同算法的实现代码和总结报告。
动态规划方法:
动态规划方法:
public class Knapsack {
public static void main(String[] args ) { int [] value = { 0, 60, 100, 120 };
int [] weigh = { 0, 10, 20, 30 }; int weight = 50;
Knapsack1 ( weight , value , weigh );
}
public static void Knapsack1( int weight , int [] value , int [] weigh )
{
int [] v = new int [ value . length ]; int [] w = new int [ weigh . length ];
int [][] c = new int [ value . length ][ weight + 1]; int d[] = new int [100];
for ( int i = 0; i value . length
您可能关注的文档
最近下载
- 教师招聘简章(9页).docx VIP
- 服饰制造环评(新版环评)环境影响报告表.pdf VIP
- 水利工程专业-大学生职业生涯规划书.pptx VIP
- 体例格式12:工学一体化课程《小型网络安装与调试》任务4教学单元5教学单元实施计划.docx VIP
- 工厂仓储收发存作业流程、生产企业货物管理具体操作步骤.doc VIP
- 工商业用户侧储能投资效益测算表.xlsx VIP
- 东航英语笔试真题.pdf VIP
- 汽轮机培训基础知识课件.ppt VIP
- 体例格式12:工学一体化课程《小型网络安装与调试》任务4教学单元3教学单元活动方案.docx VIP
- DB37_T 4904-2025 链式切割水泥土连续墙技术规程.pdf
原创力文档


文档评论(0)