1、回溯法分支限界法解01背包问题计算机算法设计与分析实验报告回溯法、分支限界法解0-1背包问题(计算机算法设计与分析实验报告)实 验 报 告 课程名称: 算法设计与分析 实验名称:回溯法、分支限界法解0-1背包问题任课教师: 张锦雄 专 业: 计算机科学与技术 班 级: 2007 级 1班 学 号: 姓 名: 蓝冠恒 完成日期: 2011年1月12日 一、实验目的:掌握回溯法、分支限界法的原理,并能够按其原理编程实现解决0-1背包问题,以加深对回溯法、分支限界法的理解。 二、主要实验内容及要求:1要求分别用回溯法和分支限界法求解0-1背包问题;2要求交互输入背包容量,物品重量数组,物品价值数组;
2、3要求显示结果。 三、实验环境和工具:操作系统:win7操作系统开发工具:eclipse3.4、jdk1.6开发语言:java四、实验结果与结论:(经调试正确的源程序和程序的运行结果)1.1、回溯法求解0-1背包问题源代码: package cn.lgh;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;import java.util.Comparator;/* * 回溯法解0-1背包问题。 * author 蓝冠恒 */public class BTKnapsack
3、double c;/ 背包重量 int n; / 物品总数 double w;/ 物品重量数组 double p;/ 物品价值数组 double cw; / 当前重量 double cp; / 当前价值 double bestp; / 当前最优价值 /* * 回溯法解0-1背包问题。 * param pp * 物品价值数组 * param ww * 物品重量数组 * param cc * 背包重量 * return 最优价值 */ public double knapsack(double pp, double ww, double cc) c = cc; n = pp.length; cw
4、= 0.0; cp = 0.0; bestp = 0.0; Element q = new Elementn; for (int i = 0; i n; i+) qi = new Element(i + 1, ppi / wwi); Arrays.sort(q, new ElemComparator(); p = new doublen + 1; w = new doublen + 1; for (int i = 1; i n) / 达到叶节点 bestp = cp; return; if (cw + wi bestp) backtrack(1 + i); / 计算上界值 private do
5、uble bound(int i) double cleft = c - cw; double bound = cp; / 以物品单位重量价值递减顺序装入物品 while (i = n & wi = cleft) cleft -= wi; bound += pi; i+; / 装满背包 if (i = n) bound += pi * cleft / wi; return bound; /* * 物体编号和单位重量价值载体。 * author 蓝冠恒 */ public class Element int id;/ 编号 double d;/ 单位重量价值 public Element(int
6、 id, double d) this.id = id; this.d = d; /* * 比较器 * author 蓝冠恒 */ public class ElemComparator implements Comparator public int compare(Object object1, Object object2) Element element1 = (Element) object1; Element element2 = (Element) object2; if (element1.d element2.d) return 1; else return 0; publi
7、c static void main(String args) String input; String flag; double capacity = 0; double pp; double ww; double bestP=0.0; BTKnapsack btKnapsack=new BTKnapsack(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in); do try do System.out.println(请选择数字功能键: 1-输入数据,2-退出系统); flag = in.re
8、adLine().trim(); while (!(flag.equals(1) | flag.equals(2); if (flag.equals(2) break; do System.out.println(请输入各物品重量,数据之间必须以顿号间隔分开!); input = in.readLine().trim(); input = in.readLine().replaceAll( , ); while (input.equals(); if(input.equals(2) break; String datas = input.split(、); int n1 = datas.len
9、gth; pp=new doublen1; ww=new doublen1; for (int i = 0; i n1; i+) wwi= Double.parseDouble(datasi); do System.out.println(请输入各物品价值,数据之间必须以顿号间隔分开!); input = in.readLine().trim(); input = in.readLine().replaceAll( , ); while (input.equals(); if(input.equals(2) break; datas= input.split(、); int n2 = data
10、s.length; if(n1!=n2) System.out.println(输入数据个数不一致,重新输入); continue; for (int i = 0; i n1; i+) ppi= Double.parseDouble(datasi); do System.out.println(请输入背包的容量:); input = in.readLine().trim(); input = in.readLine().replaceAll( , ); while (input.equals(); if(input.equals(2) break; capacity=Double.parseD
11、ouble(input); bestP=btKnapsack.knapsack(pp, ww, capacity); System.out.println(回溯法解得最优价值:+bestP); catch (Exception e) e.printStackTrace(); while (true); 1.2、运行结果:2.1、分支限界法求解0-1背包问题源代码: package cn.lgh;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;/* * 分支界限法解0-1
12、背包问题。 * author 蓝冠恒 */public class BBKnapsack double c;/ 背包重量 int n; / 物品总数 double w;/ 物品重量数组 double p;/ 物品价值数组 double cw; / 当前重量 double cp; / 当前价值 int bestx; / 最优解 MaxHeap maxHeap = new MaxHeap();/ 活节点优先队列 / 计算节点所对应的节点的上界 private double bound(int i) double cleft = c - cw; double b = cp; / 以物品单位重量价值递减装填剩余容量 while (i = n & wi = cleft) cleft -= wi; b += pi;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1