云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 01背包问题不同算法设计、分析与对比报告

01背包问题不同算法设计、分析与对比报告

  • 62 次阅读
  • 3 次下载
  • 2025/6/6 14:54:22

实验三 01背包问题不同算法设计、分析与对比

一.问题描述

给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。 问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。 说明:在选择装入背包的物品时,对每种物品i只有两个选择,装入背包或不装入背包,也不能将物品装入背包多次。

二.实验内容与要求

实验内容:

1.分析该问题适合采用哪些算法求解(包括近似解)。 动态规划、贪心、回溯和分支限界算法。

2.分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分析。

动态规划: 递推方程:

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(2n) 空间复杂度为:O(n) 分支限界算法: 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。在优先队列分支限界法中,节点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。

算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。当扩展到叶节点时为问题的最优值。

3.设计并实现所设计的算法。

4.对比不同算法求解该问题的优劣。

这动态规划算法和贪心算法是用来分别解决不同类型的背包问题的,当一件背包物品可以分割的时候,使用贪心算法,按物品的单位体积的价值排序,从大到小取即可。 当一件背包物品不可分割的时候,(因为不可分割,所以就算按物品的单位体积的价值大的先取也不一定是最优解)此时使用贪心是不对的,应使用动态规划。 设计方法 动态规划 时间复杂度 Min{nc,2n} 优点 缺点 可求得最优决策速度慢 序列 贪心方法 回溯法 分支限界法 O(2n) O(n2n) O(2n) 速度较快 能够得到最优解 很难得到最优解 时间复杂度较高 速度较快,易求解 占用内存大,效率不高 5.需要提交不同算法的实现代码和总结报告。 动态规划方法:

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) }

private static int max(int i, int j) { }

int k = i > j ? i : j; return k;

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; i++) { }

for (int i = 1; i < value.length; i++) { }

System.out.println(c[value.length - 1][weight]);

for (int k = 1; k <= weight; k++) { }

if (w[i] <= k) { }

c[i][k] = max(c[i - 1][k], c[i - 1][k - w[i]] + v[i]); c[i][k] = c[i - 1][k]; } else { v[i] = value[i]; w[i] = weigh[i];

贪心法:

public class GreedyKnapSack {

private static void Knapsack1(int weight, int[] v, int[] w) {

int n = v.length;

double[] r = new double[n]; int[] index = new int[n]; for(int i = 0;i < n; i++) {

r[i] = (double)v[i] / (double)w[i];

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);

index[i] = i;

}

//按单位重量价值r[i]=v[i]/w[i]降序排列 double temp = 0;

for(int i = 0;i < n-1;i++){

for(int j = i+1;j < n;j++){ if(r[i] < r[j]){ temp = r[i]; r[i] = r[j]; r[j] = temp; int x = index[i]; index[i] = index[j]; index[j] = x; } } }

//排序后的重量和价值分别存到w1[]和v1[]中 int[] w1 = new int[n];

int[] v1 = new int[n]; for(int i = 0;i < n;i++){ w1[i] = w[index[i]]; v1[i] = v[index[i]];

System.out.println (Arrays.toString(w1));

}

System.out.println (Arrays.toString(v1)); int s=0;//包内现存货品的重量

int value=0;//包内现存货品总价值 for(int i = 0; i < n;i++){ if(s + w1[i] < weight){ } }

System.out.println(\背包中物品的最大总价值为\ + value); } }

value += v1[i]; s += w1[i];

回溯法:

public class BacktrackKnapSack { }

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);

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

实验三 01背包问题不同算法设计、分析与对比 一.问题描述 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为c。 问题:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。 说明:在选择装入背包的物品时,对每种物品i只有两个选择,装入背包或不装入背包,也不能将物品装入背包多次。 二.实验内容与要求 实验内容: 1.分析该问题适合采用哪些算法求解(包括近似解)。 动态规划、贪心、回溯和分支限界算法。 2.分别给出不同算法求解该问题的思想与算法设计,并进行算法复杂性分析。 动态规划: 递推方程: m(i,j) = max{m(i-1,j),m(i-1,j-wi)+vi} j >= wi; m(i-1,j) j < wi;

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com