《算法设计与分析基础》(Python语言描述) 课件 第6章分支限界法(2).pptx

《算法设计与分析基础》(Python语言描述) 课件 第6章分支限界法(2).pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

6.1分支限界法概述;;1 defbfs(): #队列式分支限界法算法框架

2 定义一个队列qu

3 根结点进队

4 while队不空时循环:

5 出队结点e

6 for扩展结点e产生结点e1:

7 ife1满足constraint()andbound():

8 ife1是叶子结点:

9 比较得到一个更优解或者直接返回

10 else:

11 将结点e1进队;;;解;队列式分支限界法:其中每个结点存放一个进队的顶点编号。

用dist数组存放源点s出发的最短路径长度,dist[i]表示源点s到顶点i的最短路径长度,初始时所有dist[i]值为∞。

用prev数组存放最短路径,prev[i]表示源点s到顶点i的最短路径中顶点i的前驱顶点。;;0;4 defbfs(s): #求解算法

6 dist=[INF]*n #dist初始化所有元素为∞

7 prev=[-1]*n #prev初始化所有元素为-1

8 dist[s]=0

9 qu=deque() #定义一个队列qu

10 qu.append(s) #源点结点进队;11 whilequ: #队列不空循环

12 u=qu.popleft() #出队顶点u

14 foredjinA[u]:

15 v,w=edj[0],edj[1] #相邻顶点为v

16 ifdist[u]+wdist[v]: #剪支:u到v路径长度更短

17 dist[v]=dist[u]+w

18 prev[v]=u

19 qu.append(v) #顶点v进队;21 defdispapath(s,i): #输出s到i的一条最短路径

23 path=[]

24 ifs==i:return

25 ifdist[i]==INF:

26 print(源点%d到顶点%d没有路径%(s,i))

27 else:

28 path.append(i) #添加目标顶点

29 k=prev[i]

30 whilek!=s: #添加中间顶点

31 path.append(k)

32 k=prev[k]

33 path.append(s) #添加源点

34 print(源点%d到顶点%d的最短路径长度:%d,\

路径:%(s,i,dist[i]),end=)

35 forjinrange(len(path)-1,-1,-1): #反向输出

36 print(path[j],end=)

37 print();39 defsolve(A,n,s): #求源点v出发的所有最短路径

40 globalsum

41 sum=0

42 bfs(s)

43 print(求解结果)

44 foriinrange(0,n):dispapath(s,i)

45 print(sum=,sum);4;;;;;;;;;;;;;;;;;;;;;限界函数:先按单位重量价值递减排序。;;;;;;;程序验证;求解0/1背包问题的解空间是一棵高度为n+1的满二叉树。

bound()方法的时间复杂度为O(n)。

最坏时间复杂度仍然为O(n×2n)。;;;;;;解;1 classQNode: #优先队列结点类

2 def__init__(self,i,vno,length): #构造方法

3 self.i=i #结点的层次

4 self.vno=vno #顶点编号

5 self.length=length #路径长度

6 def__lt__(self,other): #按length越小越优先出队

7 returnself.lengthother.length;初始化dist数组所有元素为∞,定义元素类型为QNode的优先队列pqu。

先将根结点进队,队不空时循环,出队一个结点,对相应顶点的所有出边做松驰操作,直到队列为空,最后的dist[i]就是源点

您可能关注的文档

文档评论(0)

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

精品资料

版权声明书
用户编号:7040145050000060

1亿VIP精品文档

相关文档