分支限界法
实验要求
1 理解分支限界算法的广度优先搜寻原理及一般应用,掌握两种广度优先搜索方法
l 队列
l 优先队列
2 编程实现典型分支限界算法,理解“分支”、“限界”思想,并对算法进行验证分析。
实验内容
分支限界法 0-1 背包问题
示例输入(规定物品数量为 10,背包容量为 50,输入为 20 个数,前十个为物品重量,后十个数为
物品价值):
12
3
11
5
6
8
9
4
7
10
6
2
7
3
2
9
8
10
4
5
示例输出(最大价值):
44
源代码
//科目:算法设计
//题目:分支限界法 0-1 背包问题
//语言:C++
//作者:武叶
//创作时间:2012 年 4 月 24 日
#include
#include
using namespace std;
#define N 100
class
HeapNode
//定义 HeapNode 结点类
{
public:
double
upper,price,weight;
//upper 为结点的价值上界,price 是结点所对应的价值,weight 为结点所相应的重量
int
level,x[N];
//活节点在子集树中所处的层序号
};
double MaxBound(int i);
double Knap();
void AddLiveNode(double up,double cp,double cw,bool ch,int level);
stack
High;
//最大队 High
double
w[N],p[N];
double
cw,cp,c=50;
//cw 为当前重量,cp 为当前价值,定义背包容量为 50
int
n=10;
//货物数量为 10
int main()
{
int i;
for(i=1;i<=n;i++)
cin>>w[i]; //输入 10 个物品的重量
for(i=1;i<=n;i++)
cin>>p[i];
//输入 10 个物品的价值
cout<
{
HeapNode be;
be.upper=up;
be.price=cp;
be.weight=cw;
be.level=lev;
if(lev<=n)
High.push(be);
//调用 stack 头文件的 push 函数
}
double Knap()
//优先队列分支限界法,返回最大价值,bestx 返回最优解
{
int i=1;
cw=cp=0;
double
bestp=0,up=MaxBound(1);
//调用 MaxBound 求出价值上界,best 为最优值
while(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],true,i+1);
}
up=MaxBound(i+1);
if(up>=bestp)
//右子数可能含最优解
AddLiveNode(up,cp,cw,false,i+1);
if(High.empty()) return bestp;
HeapNode node=High.top();
//取下一扩展结点
High.pop();
cw=node.weight;
cp=node.price;
up=node.upper;
i=node.level;
}
}
答销网真情提供:::::www.daxiao51.com
文章出处::::::
http://www.daxiao51.com/forum.php?mod=viewthread&tid=1536&page=1&extra=#pid2404