- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
PAGE16
第16章 穷举搜索
用回溯法设计一个给图G(V,E)着色的算法。我们假定图是用邻接矩阵表示,而可用颜色的集合是C={1,2,…,m},m可视为常数。我们要求把所有合法的着色全部输出。
解: 假设图的顶点集合是V={v1,v2,…,vn},邻接矩阵是A[1..n,1..n],其中A[i,j]=1表示顶点vi和vj之间有边(1≤i,j≤n)。我们用一个n元组(x[1],x[2],…,x[n])表示对这n个顶点的着色,其中x[i]?C是对顶点vi的着色(1≤i≤n),这是着色问题的一个显示约束。图G的一个合法的着色还必须满足隐式约束,即如果A[i,j]=1,那么必须有x[i]?x[j]。
搜索树中第k层的一个点x用一个k元组x[1..k]=(x[1],x[2],…,x[k])表示,它表示前k个顶点已着色为x[1],x[2],…,x[k],它的儿子有m个,每个对应一个(k+1)元组,x[1..k+1]=(x[1],x[2],…,x[k],x[k+1]),其中x[k+1]分别是1,2,…,和m。
我们先设计一个判定函数Valid(k,c,x[1..k-1]),用来检查树中(k-1)层的一个活点(x[1],x[2],…,x[k-1])的一个儿子y=(x[1],x[2],…,x[1..k-1],x[k]),如果x[k]=c,也就是把顶点vk着色为c,是否是活点。这里,一个k层的活点要满足显示约束x[i]?C,还要满足前k个顶点的隐式约束。下面是Valid(k,c,x[1..k-1])算法的伪码。
Valid(k,c,x[1..k-1]) //图G(V,E)的邻接矩阵A为默认输入
//input:A[1..n,1..n],x[1..k-1],k,c (如果k=1,则x[1..k-1]为空,用x[0]=0表示)
fori?1tok-1
ifA[k,i]=1andx[i]=c
thenreturnfalse
endif
endfor
returntrue
End
下面是给图G(V,E)着色的回溯法的伪码
m-Color(k,x[1..k-1]) //这是回溯法的递归形式供后面主程序调用,矩阵A为默认输入
//input:x[1..k-1],A[1..n,1..n],k(如果k=1,则x[1..k-1]为空,用x[0]=0表示)
forc?1tom
ifvalid(k,c,x[1..k-1]))=true
then x[k]?c //第k个点着色为c,这个儿子是活点
ifk=n //这个点是答案点
then count?count+1 //全局变量,统计答案点个数
outputx[1..n] //输出这个合法着色
else m-color(k+1,x[1..k]) //否则从这点递归下去
endif
endif
endfor
End
下面是主程序
Color-Main(A[1..n,1..n],C) //C={1,2,…,m}
//input:A[1..n,1..n],C
count?0
x[0]?0
m-color(1,x[0])
ifcount=0
thenreturn(notm-colorable)
elsereturn(Thereare’count‘differentvalidcolorings)
endif
End
我们知道,找出图G(V,E)的一个最大团是一个NPC问题。请设计一个回溯算法来搜索图G的一个最大团。假定图G是用邻接矩阵表示的。
解: 假设图G的顶点集合是V={v1,v2,…,vn},邻接矩阵是A[1..n,1..n],其中A[i,j]=1表示顶点vi和vj之间有边。我们用一个k元组x=(x[1],x[2],…,x[k])表示搜索树中k层的一个点,它代表前面k个顶点的一个子集C(k≤n),其中x[i]=1表示vi属于集合C,而x[i]=0表示vi不属于集合C(1≤i≤k)。子集C也许是一个团,也许不是。因此,x[i]?{0,1}是这个搜索空间的显示约束(1≤i≤n)。一个k层的点x有两个k+1层的儿子,它们是在点x所代表的子集C的基础上,对应x[k+1]的两个取值,一个是x[k+1]=0
文档评论(0)