演算法描述:
活結點優先佇列中結點元素n的優先順序由該結點的上界函式bound計算出的值uprofit給出。
子集樹中以結點n為根的子樹中任一結點的價值不超過n.profit。
可用乙個最大堆來實現或節點優先佇列。
n.weight 是結點n所相應的重量,n.profit是n所相應的價值,n.uprofit是結點n的價值上界,最大堆以這個值作為優先順序。
classobject
private
:
intid;
float
d;};
template
class
knap;
class
bbnode;
template
class
heapnode
private
: typep uprofit,
//結點價值上界
profit;
typew weight;
int level;//
活結點所相應的重量
bbnode *ptr;
};
上界計算函式:
templateclass knap::bound(int
i)
//裝填剩餘容量裝滿揹包
if(i<=n)
b += p[i]/w[i] *cleft;
return
b;}
分支限界搜尋函式:
template typep knap::maxknapsack()
up = bound(i+1
);
//檢查擴充套件結點的右兒子結點
if(up >= bestp)//
右子樹 可能含有最優解
addlivenode(up,cp,cw,false,i+1
);
//取得下一擴充套件點
heapnoden;
h->deletemax(n);
e =n.ptr;
cw =n.weight;
cp =n.profit;
up =n.uprofit;
i =n.level;
}//構造當前最優解
for(int j=n;j>0;j--)
return
cp;}
主要程式**:
測試中.....(暫時不好使)
#include #includeclass
object
private
:
intid;
float
d;};
template
class
knap;
class
bbnode;
template
class
heapnode
private
: typep uprofit,
//結點價值上界
profit;
typew weight;
int level;//
活結點所相應的重量
bbnode *ptr;
};template
class
knap;
template
class knap::bound(int
i)
//裝填剩餘容量裝滿揹包
if(i<=n)
b += p[i]/w[i] *cleft;
returnb;}
template
void knap::addlivenode(typep up,typep cp,typew cw,bool ch,int
lev)
template
typep knap
::maxknapsack()
up = bound(i+1
);
//檢查擴充套件結點的右兒子結點
if(up >= bestp)//
右子樹 可能含有最優解
addlivenode(up,cp,cw,false,i+1
);
//取得下一擴充套件點
heapnoden;
h->deletemax(n);
e =n.ptr;
cw =n.weight;
cp =n.profit;
up =n.uprofit;
i =n.level;
}//構造當前最優解
for(int j=n;j>0;j--)
return
cp;}
template
typep knapsack(typep p,typew w,typew c,
int n,int
bestx)
if(w<=c)
return
p; sort(q,n);
knap
k; k.p = new typep[n+1
]; k.w = new typew[n+1
];
for(int i=1;i<=n;i++)
k.cp = 0
; k.cw = 0
; k.c =c;
k.n =n;
typep bestp =k.maxknapsack();
for(int j=1;j<=n;j++)
delete q;
delete k.w;
delete k.p;
delete k.bestx;
cout
<<"
最大價值為
"return
bestp;
}int
main()
0 1揹包 分支限界
演算法描述 活結點優先佇列中結點元素n的優先順序由該結點的上界函式bound計算出的值uprofit給出。子集樹中以結點n為根的子樹中任一結點的價值不超過n.profit。可用乙個最大堆來實現或節點優先佇列。n.weight 是結點n所相應的重量,n.profit是n所相應的價值,n.uprofit...
分支限界 0 1揹包
0 1揹包問題 在優先佇列分支限界法中,節點的優先順序由已裝袋的物品價值加上剩下的最大單位重量價值的物品裝滿剩餘容量的價值和。對輸入資料進行預處理,將各物品依其單位重量價值從大到小進行排列。演算法首先檢查當前擴充套件結點的左兒子結點的可行性。如果該左兒子結點是可行結點,則將它加入到子集樹和活結點優先...
0 1揹包(分支限界法)
分支限界法 分支限界法 branch and bound method 是求解純整數規劃或混合整數規劃問題的經典方法,在上世紀六十年代由land doig和dakin等人提出。這種方法靈活且便於用計算機求解,目前已經成功運用於求解生產進度問題 旅行推銷員問題 工廠選址問題 揹包問題及分配問題等。演算...