資源簡介
0-1背包問題 算法設(shè)計 各種解法 動態(tài)規(guī)劃 貪心 回溯 分支限界

代碼片段和文件信息
package?test;
import?java.util.*;
/**
?*?分支界限法解0-1背包問題。
?*/
public?class?BBKnapsack?{
double?c;//?背包重量
int?n;?//?物品總數(shù)
double[]?w;//?物品重量數(shù)組
double[]?p;//?物品價值數(shù)組
double?cw;?//?當前重量
double?cp;?//?當前價值
int[]?bestx;?//?最優(yōu)解
MaxHeap?maxHeap?=?new?MaxHeap();//?活節(jié)點優(yōu)先隊列
//?計算節(jié)點所對應(yīng)的節(jié)點的上界
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;
}
//?添加新的活節(jié)點到子集樹和優(yōu)先隊列中
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);
}
//?優(yōu)先隊列式分支界限法
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];
//?檢查當前擴展節(jié)點的左兒子節(jié)點
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);
//?檢查當前擴展節(jié)點的右兒子節(jié)點
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;
}
//?構(gòu)造當前最優(yōu)解
for?(int?j?=?n;?j?>?0;?j--)?{
bestx[j]?=?(enode.leftChild)???1?:?0;
enode?=?enode.parent;
}
return?cp;
}
/**
*?將個物體依其單位重量價值從大到小排列,然后調(diào)用bbKnapsack完成對子集樹優(yōu)先隊列式分支界
*限搜索。
?*?
?*?@return?最優(yōu)解
?*/
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? 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();
//?調(diào)用bbKnapsack求問題的最優(yōu)解
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(“物品個數(shù):n=5“);
????????System.out.println(“背包容量:c=10“);
????????System.out.println(“物品重量數(shù)組:w=?{22654}“);
????????System.out.println(“物品價值數(shù)組:v=?{63546}“);
BB
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2011-12-13?10:30??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\
?????文件????????5484??2011-11-29?21:20??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\BBKnapsack(分支限界).java
?????文件????????2619??2011-11-30?12:16??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\BTKnapsack(回溯).java
?????文件????????2165??2011-11-30?12:17??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\Knapsack(動態(tài)規(guī)劃).java
?????文件????????2641??2011-11-30?12:17??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\Knapsack_tx(貪心).java
?????文件??????163328??2011-11-29?21:20??0-1背包問題動態(tài)規(guī)劃,貪心,回溯,分支限界算法的設(shè)計與實現(xiàn)\算法分析1.doc
評論
共有 條評論