资源简介
0-1背包问题 算法设计 各种解法 动态规划 贪心 回溯 分支限界
代码片段和文件信息
package test;
import java.util.*;
/**
* 分支界限法解0-1背包问题。
*/
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 && w[i] <= cleft) {
cleft -= w[i];
b += p[i];
i++;
}
// 装填剩余容量装满背包
if (i <= n) {
b += p[i] / w[i] * cleft;
}
return b;
}
// 添加新的活节点到子集树和优先队列中
private void addLiveNode(double upperProfit double pp double ww
int level BBnode parent boolean leftChild) {
BBnode b = new BBnode(parent leftChild);
HeapNode node = new HeapNode(b upperProfit pp ww level);
maxHeap.put(node);
}
// 优先队列式分支界限法
private double bbKnapsack() {
BBnode enode = null;
int i = 1;
double bestp = 0.0;
double up = bound(1);
while (i != n + 1) {
double wt = cw + w[i];
// 检查当前扩展节点的左儿子节点
if (wt <= c) {
if (cp + p[i] > bestp) {
bestp = cp + p[i];
}
addLiveNode(up cp + p[i] cw + w[i] i + 1 enode true);
}
up = bound(i + 1);
// 检查当前扩展节点的右儿子节点
if (up >= bestp) {
addLiveNode(up cp cw i + 1 enode false);
}
HeapNode node = maxHeap.removeMax();
enode = node.liveNode;
cw = node.weight;
cp = node.profit;
up = node.upperProfit;
i = node.level;
}
// 构造当前最优解
for (int j = n; j > 0; j--) {
bestx[j] = (enode.leftChild) ? 1 : 0;
enode = enode.parent;
}
return cp;
}
/**
* 将个物体依其单位重量价值从大到小排列,然后调用bbKnapsack完成对子集树优先队列式分支界
*限搜索。
*
* @return 最优解
*/
public double knapsack(double[] pp double[] ww double cc int[] xx) {
c = cc;
n = pp.length;
Element[] q = new Element[n];
double ws = 0.0;
double ps = 0.0;
for (int i = 0; i < n; i++) {
q[i] = new Element(i + 1 pp[i] / ww[i]);
ps += pp[i];
ws += ww[i];
}
if (ws <= c) {
for (int i = 1; i <= n; i++) {
xx[i] = 1;
}
return ps;
}
// 依单位重量价值排序
Arrays.sort(q new ElemComparator());
p = new double[n + 1];
w = new double[n + 1];
for (int i = 1; i <= n; i++) {
p[i] = pp[q[i - 1].id - 1];
w[i] = ww[q[i - 1].id - 1];
}
cw = 0.0;
cp = 0.0;
bestx = new int[n + 1];
maxHeap = new MaxHeap();
// 调用bbKnapsack求问题的最优解
double maxp = bbKnapsack();
for (int i = 1; i <= n; i++) {
xx[q[i - 1].id - 1] = bestx[i];
}
return maxp;
}
public static void main(String arg[]) {
double c = 10;
int n=5;
double[] v= {63546};
double[] w={22654};
int[] xx=new int[5];
double bestP=0.0;
System.out.println(“*****分支限界法*****“);
System.out.println(“物品个数:n=5“);
System.out.println(“背包容量:c=10“);
System.out.println(“物品重量数组:w= {22654}“);
System.out.println(“物品价值数组:v= {63546}“);
BB
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2011-12-13 10:30 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\
文件 5484 2011-11-29 21:20 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\BBKnapsack(分支限界).java
文件 2619 2011-11-30 12:16 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\BTKnapsack(回溯).java
文件 2165 2011-11-30 12:17 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\Knapsack(动态规划).java
文件 2641 2011-11-30 12:17 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\Knapsack_tx(贪心).java
文件 163328 2011-11-29 21:20 0-1背包问题动态规划,贪心,回溯,分支限界算法的设计与实现\算法分析1.doc
- 上一篇:赋值语句词法和语法分析程序
- 下一篇:基于CC2530的温湿度传感器及串口通信设计
相关资源
- 集装箱优化算法设计
- 哈工大深圳算法设计08年试卷-何震宇
- 算法设计技巧与分析答案
- 布线问题实验报告 算法
- 哈尔滨工业大学算法设计与分析讲义
- UESTC算法设计与分析作业和答案
- 基于Hadoop个性化推荐算法设计与实现
- 算法设计与分析中国科学院.lst
- 计算机算法设计与分析学习心得.rar
- 算法设计经典题——王晓东编著第三
- 论文研究-基于OpenFlow的SDN网络路由算
- PrefixSpan算法设计与实现
- 工频抑制滤波算法设计
- 算法实验代码和报告时间复杂度、0
- 0-1背包问题——动态规划
- 算法设计报告
- 接口签名算法设计、MD5签名算法
- 0-1 Knapsack 试设计一个用回溯法搜索
- 算法设计实验报告之多种方法求解斐
- 基于FPGA的FFT算法设计与实现
- 2008年A题 相机定位系统数学模型与算
- 拓扑排序------打印输出计算机本科专
- 数据结构中图算法设计题
- 严题集算法设计答案汇总
- 分别用回溯法和分支限界法求解0-1背
- 算法设计与实践 找钱,宿营天数实验
- 算法设计与实践 硬币问题实验报告
- 算法设计与实践最接近点对问题
- GS稳定匹配算法实现代码
- algorithm design 的课后答案
评论
共有 条评论