星期一, 十月 23, 2006

帮丫头写的背包问题的分之界限求法

我对不起我的丫头,耽误这个程序有半个月了。
我把核心的代码贴出来,备用以后查看:
/**
* 计算给定节点的边界值
*
* @param node
*/
private void bound(NODE node) {
int n = obsForExe.size();
int deep = node.deep;
float weight = node.weigthAll;
float price = node.priceAll;
if (node.weigthAll > maxWeight) {
node.boundValue = 0;
} else {
while ((deep < n)
&& (weight + obsForExe.get(deep).weight <= maxWeight)) {
weight += obsForExe.get(deep).weight;
price += obsForExe.get(deep).price;
deep++;
}
if (deep < n) {
node.boundValue = price + (maxWeight - weight)
* obsForExe.get(deep).price
/ obsForExe.get(deep).weight;
} else {
node.boundValue = price;
}
}
}

/**
* 执行分支算法
*
* @return
*/
public float knapsack() {
obsForExe = new Vector(obs);
Collections.sort(obsForExe, new ComparatorByV());
int size = obsForExe.size();
PriorityQueue quene = new PriorityQueue(5,
new ComparatorByB());

NODE xnode = new NODE();
xnode.inPackage = new boolean[size];
xnode.deep = 0;
xnode.weigthAll = 0;
xnode.priceAll = 0;
while (xnode.deep < size) {
NODE ynode = new NODE(xnode);
ynode.inPackage[ynode.deep] = true;
ynode.weigthAll += obsForExe.get(ynode.deep).weight;
ynode.priceAll += obsForExe.get(ynode.deep).price;
ynode.deep++;
bound(ynode);
quene.add(ynode);

NODE znode = new NODE(xnode);
znode.deep++;
bound(znode);
quene.add(znode);

xnode = (NODE) quene.poll();
}
for (int i = 0; i < size; i++) {
if (xnode.inPackage[i])
result.add(obsForExe.get(i));
}
return xnode.priceAll;
}

3 条评论:

匿名 说...

哈,想念你家Y头了
这算法看起来好亲切,昨天刚学的……
奇怪,她们怎么也还要学这个?

187 说...

是运筹学的部分。
他们竟然不要求限界,我当然不能提供不限界的代码了。
这个代码现在也给改了,以前用boolean[]保存状态,但这个耗费内存非常大,对于>8000会引发out of memory heap,后来采用了BitSet来保存状态,测试时50000时没有问题,再大也会out of memory heap,有什么办法再优化吗?

187 说...

回头我让丫头也博一下吧 ^_^