算法设计与分析 第2版 第6章-分枝限界法.ppt

算法设计与分析 第2版 第6章-分枝限界法.ppt

  1. 1、本文档共72页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * lb为当前结点对应调度方案的时间下界。 例如,对于出队结点e,如果在第2步选择作业1(j=1),对应结点为e1,则: e1.i=e.i+1=2,e1.f1=e.f1+a[1]=9 e1.f2=max(e.f2,e1.f1)+b[1]=18+6=24 e1.x=[3,1,0,0] e1.y=[1,0,1,0] i=1,f1=4 f2=18,lb=33 x[]={3,0,0,0} y[]={0,0,1,0} i=2,f1=9 f2=24,lb=33 x[]={3,1,0,0} y[]={1,0,1,0} j=1 结点e 结点e1 e1.lb=e1.f2+没有分配的作业在M2上的时间和 =e1.f2+作业2和4在M2上的时间和=24+2+7=33。 对应的求结点e的lb的算法如下: void bound(NodeType e) //求结点e的限界值 { int sum=0; for (int i=1;i=n;i++) //扫描所有作业 if (e.y[i]==0) sum+=b[i]; //仅累计e.x中还没有分配的作业的b时间 e.lb=e.f2+sum; } 算法设计: 找到一个可行解bestf e结点出发找到一个解的总时间≥e.lb。 //问题表示 int n=4; //作业数 int a[MAX]={0,5,12,4,8}; //M1上的执行时间,不用下标0的元素 int b[MAX]={0,6,2,14,7}; //M2上的执行时间,不用下标0的元素 //求解结果表示 int bestf=INF; //存放最优调度时间 int bestx[MAX]; //存放当前作业最佳调度 int total=1; //结点个数累计 void bfs() //求解流水作业调度问题 { NodeType e,e1; priority_queueNodeType qu; //定义优先队列 memset(e.x,0,sizeof(e.x)); //初始化根结点的x memset(e.y,0,sizeof(e.y)); //初始化根结点的y e.i=0; //根结点 e.f1=0; e.f2=0; bound(e); e.no=total++; qu.push(e); //根结点进队列 while (!qu.empty()) { e=qu.top(); qu.pop(); //出队结点e if (e.i==n) //达到叶子结点 { if (e.f2bestf) //比较求最优解 { bestf=e.f2; for (int j1=1;j1=n;j1++) bestx[j1]=e.x[j1]; } } e1.i=e.i+1; //扩展分配下一个步骤的作业,对应结点e1 for (int j=1;j=n;j++) //考虑所有的n个作业 { if (e.y[j]==1) continue; //作业j是否已分配,若已分配,跳过 for (int i1=1;i1=n;i1++) //复制e.x得到e1.x e1.x[i1]=e.x[i1]; for (int i2=1;i2=n;i2++) //复制e.y得到e1.y e1.y[i2]=e.y[i2]; e1.x[e1.i]=j; //为第i步分配作业j e1.y[j]=1; //表示作业j已经分配 e1.f1=e.f1+a[j]; //求f1=f1+a[j] e1.f2=max(e.f2,e1.f1)+b[j]; //求f[i+1]=max(f2[i],f1)+b[j] bound(e1); if (e1.lbbestf) //剪枝,剪去不可能得到更优解的结点 { e1.no=total++; //结点编号增加1 qu.push(e1); } } } } void main() { bfs(); printf(最优方案:\n); for (int k=1;k=n;k++) printf( 第%d步执行作业%d\n,k,bestx

文档评论(0)

dllkxy + 关注
实名认证
内容提供者

本文库主要涉及建筑、教育等资料,有问题可以联系解决哦

版权声明书
用户编号:5213302032000001

1亿VIP精品文档

相关文档