实验报告 分支限界法01背包.doc

上传人:大张伟 文档编号:5728278 上传时间:2020-07-24 格式:DOC 页数:7 大小:60KB
返回 下载 相关 举报
实验报告 分支限界法01背包.doc_第1页
第1页 / 共7页
实验报告 分支限界法01背包.doc_第2页
第2页 / 共7页
实验报告 分支限界法01背包.doc_第3页
第3页 / 共7页
实验报告 分支限界法01背包.doc_第4页
第4页 / 共7页
实验报告 分支限界法01背包.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《实验报告 分支限界法01背包.doc》由会员分享,可在线阅读,更多相关《实验报告 分支限界法01背包.doc(7页珍藏版)》请在三一文库上搜索。

1、算法设计与分析实验报告六学号: 1004091130 姓名: 金玉琦 日期: 2011-11-17 得分: 一、实验内容: 运用分支限界法解决0-1背包问题。 二、所用算法的基本思想及复杂度分析:分支限界法分支限界法按广度优先策略遍历问题的解空间树, 在遍历过程中, 对已经处理的每一个结点根据限界函数估算目标函数的可能取值, 从中选取使目标函数取得极值 的结点优先进行广度优先搜索, 从而不断调整搜索方向, 尽快找到问题的解。因为限界函数常常是基于问题的目标函数而确定的, 所以, 分支限界法适用于求解最优化问题。0-1背包问题 1)基本思想给定n 种物品和一个容量为C 的背包, 物品i 的重量是

2、Wi, 其价值为Vi , 0/ 1 背包问题是如何选择装入背包的物品(物品不可分割) , 使得装入背包中物品的总价值最大,一般情况下, 解空间树中第i 层的每个结点, 都代表了对物品1 i 做出的某种特定选择, 这个特定选择由从根结点到该结点的路径唯一确定: 左分支表示装入物品, 右分支表示不装入物品。对于第i 层的某个结点, 假设背包中已装入物品的重量是w, 获得的价值是v, 计算该结点的目标函数上界的一个简单方法是把已经装入背包中的物品取得的价值v, 加上背包剩余容量W - w 与剩下物品的最大单位重量价值vi + 1/ wi + 1的积,于是,得到限界函数:u b = v + ( W -

3、 w) ( vi + 1/ wi + 1 ) 根据限界函数确定目标函数的界 down , up,然后, 按照广度优先策略遍历问题的空 间树。2)复杂度分析时间复杂度是O(2n);3、 源程序及注释:#include#include#include#includeusing namespace std;int *x;struct node /结点表结点数据结构 node *parent,/父结点指针 *next; /后继结点指针 int level,/结点的层 bag,/节点的解 cw,/当前背包装载量 cp;/当前背包价值 float ub; /结点的上界值;class Knapprivate

4、:struct node *front, /队列队首 *bestp,*first; /解结点、根结点int *p,*w,n,c,*M;/背包价值、重量、物品数、背包容量、记录大小顺序关系long lbestp;/背包容量最优解 public:void Sort();Knap(int *pp,int *ww,int cc,int nn);Knap();float Bound(int i,int cw,int cp);/计算上界限node *nnoder(node *pa,int ba,float uub);/生成一个结点 ba=1生成左节点 ba=0生成右节点void addnode(node

5、*nod);/将结点添加到队列中void deletenode(node *nod);/将结点队列中删除struct node *nextnode(); /取下一个void display(); /输出结果void solvebag(); /背包问题求解;Knap:Knap(int *pp,int *ww,int cc,int nn) int i;n=nn;c=cc;p=new intn;w=new intn;M=new intn;for(i=0;inext=NULL;lbestp=0;bestp=new node1;bestp=NULL;Sort();Knap:Knap()delete fi

6、rst;delete front;delete bestp;delete p;delete w;float Knap:Bound(int i,int cw,int cp)/ 计算上界int cleft=c-cw; float b=(float)cp; while (in&wi=cleft)cleft-=wi;b+=pi;i+;if (iparent=pa;nodell-next=NULL;nodell-level=(pa-level)+1;nodell-bag=ba;nodell-ub=uub;if(ba=1)nodell-cw=pa-cw+wpa-level;nodell-cp=pa-cp+

7、ppa-level ;else nodell-cw=pa-cw;nodell-cp=pa-cp;return(nodell);void Knap:addnode(node *no)/将结点加入优先队列node *p=front-next,*next1=front;float ub=no-ub;while(p!=NULL)if(p-ubnext=p;next1-next=no;break;next1=p;p=p-next;if(p=NULL)next1-next=no;node *Knap:nextnode()/取上限最大结点 node *p=front-next;front-next=p-ne

8、xt;return(p);void Knap:Sort()int i,j,k,kkl;float minl; for(i=1;in;i+) minl=1.0*pi/wi;k=0;for(j=1;j=n-i;j+) if(minl1.0*pj/wj)minl=1.0*pj/wj;swap(pk,pj);swap(wk,wj);swap(Mk,Mj); k=j; void Knap:display()int i;cout最大价值是:lbestp=1;i-) xMi-1=bestp-bag;bestp=bestp-parent;cout变量值为:endl;for(i=1;i=n;i+)coutx(s

9、etw(2)i)=xi-1parent=NULL;first-next=NULL;first-level=0;first-cw=0;first-cp=0;first-bag=0;ubb=Bound(0,0,0);first-ub=ubb;front-next=first;while(front-next!=NULL)aa=nextnode();i=aa-level;if(i=n-1) if(aa-cw+wicp+pi)lbestp)lbestp=aa-cp+pi;bestp=nnoder(aa,1,(float)lbestp);if(long)(aa-cp)lbestp) lbestp=aa-

10、cp;bestp=nnoder(aa,0,(float)lbestp);if(icw+wicw+wi,aa-cp+pi)(float)lbestp)ubb=Bound(i,aa-cw+wi,aa-cp+pi);addnode(nnoder(aa,1,ubb);ubb=ubb=Bound(i,aa-cw,aa-cp);if(ubblbestp) addnode(nnoder(aa,0,ubb);display();void main()int c,n;int i=0;int *p;int *w;cout请输入背包容量:c;cout请输入物品数:n; x=new intn;p=new intn;w

11、=new intn;cout请输入n个物品的重量:endl;for(i=0;iwi; cout请输入n个物品价值:endl;for(i=0;ipi;x=new intn;Knap knbag(p,w,c,n);knbag.solvebag();getch();return; 四、运行输出结果: 五、调试和运行程序过程中产生的问题、采取的措施及获得的相关经验教训:解决该问题首先要确定一个合适的限界函数数, 并根据限界函数确定目标函数的界down,up,然后按照广度优先策略遍历问题的解空间树,在分支结点上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的目标函数的可能取值,如果某孩子结点的目标函数可能取得的值超出目标函数的界, 则将其丢弃, 因为从这个结点生成的解不会比目前已经得到的解更好; 否则, 将其加入待处理结点表中。依次选取使目标函数的值取得极值的结点成为当前扩展结点, 重复上述过程, 直到找到最优解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1