- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分支限界法作业结果解析
分支限界法作业
1. 旅行商问题
设有n个城市,城市之间道路的长度均大于或等于0,还可能是∞(对应城市之间无交通线路)。一个旅行商从某个城市出发,要经过每个城市一次且仅一次,最后回到出发的城市,问他如何走才能使他走的路线最短?
要求:使用矩阵归约确定限界函数的方法,或者其他方法实现。
分析:
旅行商问题对应的解的元组为n元组,其中假设第一个城市为1,则n元组中未确定的为剩下n-1个城市,元组为(1,x2,…,xn),每个xi的取值为{2,…,n};约束条件为已经经过的城市不能再走,最后回到出发城市。目标函数是巡回旅行路线长度。
利用矩阵归约的方法确定限界函数:
限界函数:对任意路线上的结点d,设p是其前驱结点,则
f(d) = g(d) + h(d),
其中,g(d) = f(p) + C’p[p][d], h(d) = rd。C’p[p][d]是在p点规约后得到的矩阵中p点到d点的长度值,rd为d点可以归约掉的值。
算法1: (叶子结点进堆)
Input:图G;
Output:从源点1出发再回到1顶点的最短巡回旅行路线。
1. 设定目标函数的限界down=r1,up=∞
2. 计算初始结点1的f(1)=r1,将初始结点插入最小堆H;
3. while (H ≠Φ)
4. {
5. 从H中做DELETEMIN的操作,用p带回相应结点;
6. If p是叶子结点 then
7. 输出当前最优值,并从叶子结点沿parent指针输出解,退出;
8. Else
9. { 产生p的所有满足约束条件的后继结点d(建树,建立指向parent的指针)
并计算f(d);
if f(d)up then
{ 将d结点插入最小堆H中;
if d是叶子结点 then
{ up=f(p);
删除活结点表(最小堆H)中函数值大于up值的结点;
}
}
}
18. }
算法2: (叶子结点不进堆)
Input:图G;
Output:从源点1出发再回到1顶点的最短巡回旅行路线。
1. 设定目标函数的限界down=r1,up=∞
2. 计算初始结点1的f(1)=r1,将初始结点插入最小堆H;
3. while (H ≠Φ)
4. {
5. 从H中做DELETEMIN的操作,用p带回相应结点;
6. 产生p的所有满足约束条件的后继结点d(建树,建立指向parent的指针)
并计算f(d);
7. while 对每个结点d
8. { if f(d)up then
9. { if d是叶子结点 then
10. { up=f(p);
11. 删除活结点表(最小堆H)中函数值大于up值的结点;
12. if (H=Φ) then
13. 从叶子结点沿parent指针输出解,退出;
14. }
15. else 将d结点插入最小堆H中;
16. }
17. }
18. }
2. 批处理作业问题
设J1, J2, J3, J4是四项待处理的作业,它们的工序一样,即先在m1上处理,然后在m2上处理,最后在m3上处理,
分析:
将问题推广到一般的n个作业,该问题对应的解的元组为n元组(x1,x2,…,xn),每个xi的取值为{1,…,n};约束条件为xi≠xj。
目标函数是sum3=max{sum2[n],sum3[n-1]}+tn3,
其中sum2[n]=max{sum1[n],sum2[n-1]}+tn2,
Sum1[n]=sum1[n-1]+tn1。
限界函数:设M是已经安排好的作业集合,M({1, 2, ..., n}, |M|=k。现在要处理作业k+1,有:
其中sum1[k+1]=sum1[k]+ tk+1,1
sum2[k+1]=max{sum1[k+1], sum2[k]} + tk+1,2
目标函数的下限界down=
Input:n个作业,及其在3台机器上的处理时间tij;
Output:n个作业的最佳处理顺序及其处理时间。
1. 设定目标函数的限界down=,up=∞
2. 计算初始结点1的sum1=0,sum2=0,db(1)=0,将初始结点插入最小堆H;
3. while (H ≠Φ)
4. {
5. 从H中做DELE
文档评论(0)