精确覆盖矩阵和数独-报告课件_第1页
精确覆盖矩阵和数独-报告课件_第2页
精确覆盖矩阵和数独-报告课件_第3页
精确覆盖矩阵和数独-报告课件_第4页
精确覆盖矩阵和数独-报告课件_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机问题求解

论题1-8

-集合及其运算2021年11月20日精确覆盖问题问题的描述:GivenasetAandafinitenumberofA:A1,A2,…Ak,aexactcoverofAwithrespecttotheAi’sisasetS

{A1,A2,…Ak},satisfying:AnytwosetsinSaredisjoint,and

S=AMathematically,wecallSapartitionofA.一个例子:A={a,b,c,d,e,f,g,h,i,j};A1={a,c,d},A2={a,b,e,f},

A3={b,f,g},A4={d,h,i},A5={a,h,j},A6={e,h},A7={c,i,j},A8={i,j}解是:{A1,A3,A6,A8

}精确覆盖问题的矩阵表示包含关系可以用一个关系矩阵表示。矩阵每行表示S的一个子集,每列表示X中的一个元素。矩阵行列交点元素为1表示对应的元素在对应的集合中,不在那么为0例如:1234567A1001001B1001000C0001101D0010110E0110011F0100001令

S

={A,

B,

C,D,E,F}是集合X

={1,

2,

3,4,5,6,7}的一个子集,并满足:A

={1,4,7}B={1,4}C

={4,5,7}D

={3,5,6}E={2,3,6,7}F={2,7}S*={B,

D,

F}便是一个精确覆盖。精确覆盖问题的矩阵表示Let|A|=n,andtherearemsubsetsforAi’s,wecanrepresenttheinputofexactcoverproblemasam

nmatrix,witheachrowforaAi.Solution:FindacollectionofrowsofM:r1,r2,…rk,satisfying:ri

rj=0for1i,jk,andr1

r2…rk=1where0=[0000000000]

1=[1111111111]and,isbooleanproduct,is booleansum Knuth’sXAlgorithminput:matrixAInitialization:labeltherowsofA; M=A;L={};(1)Ifthereisacolumnof0’sinM,return“Nosolution〞(2)Otherwise:Choosethecolumncwiththefewest1’s;Choosearowrwitha1incolumnc,L=L{r};Eliminateanyrowrihavingtheproperty:rri0; Eliminateallcolumnsinwhichrhasa1;Eliminaterowr;IfNorowandcolumnleft,thenoutputL,otherwiserepeat(1)and(2)onresultedM;结果是:

{A1,A3,A6,A8}舞蹈链〔DancingLinks〕算法——求解精确覆盖问题DancingLinks实际上并不是一种算法,而是一种数据结构。一种非常巧妙的数据结构,他的数据结构在缓存和回溯的过程中效率惊人,不需要额外的空间,以及近乎线性的时间。而在整个求解过程中,指针在数据之间跳跃着,就像精巧设计的舞蹈一样,故DonaldE.Knuth把它称为DancingLinks〔中文译名舞蹈链〕。DancingLinks用的数据结构是交叉十字循环双向链其中的每个元素有6个分量分别:Left指向左边的元素、Right指向右边的元素、Up指向上边的元素、Down指向下边的元素、Col指向列标元素、Row指示当前元素所在的行

舞蹈链〔DancingLinks〕算法——求解精确覆盖问题DancingLinks还要准备一些辅助元素:〔1〕Ans〔〕:Ans数组,在求解的过程中保存当前的答案,以供最后输出答案用。〔2〕Head元素:求解的辅助元素,在求解的过程中,当判断出Head.Right=Head〔也可以是Head.Left=Head〕时,求解结束,输出答案。Head元素只有两个分量有用。其余的分量对求解没啥用〔3〕C元素:辅助元素,称列标元素,每列有一个列标元素。本文开始的题目的列标元素分别是C1、C2、C3、C4、C5、C6、C7。每一列的元素的Col分量都指向所在列的列标元素。列标元素的Col分量指向自己〔也可以是没有〕。在初始化的状态下,Head.Right=C1、C1.Right=C2、……、C7.Right=Head、Head.Left=C7等等。列标元素的分量Row=0,表示是处在第0行。DancingLinks算法以下图就是根据题目构建好的交叉十字循环双向链:因为精确覆盖问题的矩阵往往是稀疏矩阵〔矩阵中,0的个数多于1〕,DancingLinks仅仅记录矩阵中值是1的元素。〔注意是循环的〕DancingLinks算法1、首先判断Head.Right=Head?假设是,求解结束,输出解;假设不是,求解还没结束,到步骤2〔也可以判断Head.Left=Head?〕2、获取Head.Right元素,即元素C1,并标示元素C1〔标示元素C1,指的是标示C1、和C1所在列的所有元素、以及该元素所在行的元素,并从双向链中移除这些元素〕。如以下图中的紫色局部。DancingLinks算法3、选择行2〔在答案栈中压入2〕,标示该行中的其他元素〔元素5和元素6〕所在的列首元素,即标示元素C4和标示元素C7,以下图中的橙色局部。注意的是,即使元素5在步骤2中就从双向链中移除,但是元素5的Col分量还是指向元素C4的,这里表达了双向链的强大作用。DancingLinks算法4、获取Head.Right元素,即元素C2,并标示元素C2。如以下图中的紫色局部。DancingLinks算法5、选择行3〔在答案栈中压入3〕,标示该行中的其他元素〔元素8和元素9〕所在的列首元素,即标示元素C3和标示元素C6,以下图中的橙色局部。DancingLinks算法把上图中的紫色局部和橙色局部移除的话,剩下的绿色局部就如以下图所示。DancingLinks算法6、获取Head.Right元素,即元素C5,元素C5中的垂直双向链中没有其他元素,也就是没有元素覆盖列C5。说明当前求解失败。要回溯到之前的分叉选择步骤〔步骤2〕。那要回标列首元素〔把列首元素、所在列的元素,以及对应行其余的元素。并恢复这些元素到双向链中〕,回标列首元素的顺序是标示元素的顺序的反过来。从前文可知,顺序是回标列首C6、回标列首C3、回标列首C2、回标列首C7、回标列首C4。外表上看起来比较复杂,实际上利用递归,是一件很简单的事。并把答案栈恢复到步骤2〔清空的状态〕的时候。又回到以下图所示。DancingLinks算法7、由于之前选择行2导致无解,因此这次选择行4〔再无解就整个问题就无解了〕。选择行4〔在答案栈中压入4〕,标示该行中的其他元素〔元素11〕所在的列首元素,即标示元素C4,以下图中的橙色局部。DancingLinks算法把上图中的紫色局部和橙色局部移除的话,剩下的绿色局部就如以下图所示DancingLinks算法8、获取Head.Right元素,即元素C2,并标示元素C2。如以下图中的紫色局部。DancingLinks算法9、选择行3〔在答案栈中压入3〕,标示该行中的其他元素〔元素8和元素9〕所在的列首元素,即标示元素C3和标示元素C6,以下图中的橙色局部。DancingLinks算法把上图中的紫色局部和橙色局部移除的话,剩下的绿色局部就如以下图所示DancingLinks算法10、获取Head.Right元素,即元素C5,元素C5中的垂直双向链中没有其他元素,也就是没有元素覆盖列C5。说明当前求解失败。要回溯到之前的分叉选择步骤〔步骤8〕。从前文可知,回标列首C6、回标列首C3。并把答案栈恢复到步骤8〔答案栈中只有4〕的时候。又回到以下图所示DancingLinks算法11、由于之前选择行3导致无解,因此这次选择行5〔在答案栈中压入5〕,标示该行中的其他元素〔元素13〕所在的列首元素,即标示元素C7,以下图中的橙色局部。DancingLinks算法把上图中的紫色局部和橙色局部移除的话,剩下的绿色局部就如以下图所示DancingLinks算法12、获取Head.Right元素,即元素C3,并标示元素C3。如以下图中的紫色局部。DancingLinks算法13、如上图,列C3只有元素1覆盖,故答案只能选择行3〔在答案栈压入1〕。标示该行中的其他元素〔元素2和元素3〕所在的列首元素,即标示元素C5和标示元素C6,以下图中的橙色局部。DancingLinks算法把上图中的紫色局部和橙色局部移除的话,剩下的绿色局部就如以下图所示DancingLinks算法14、因为Head.Right=Head。故,整个过程求解结束。输出答案,答案栈中的答案分别是4、5、1。表示该问题的解是第4、5、1行覆盖所有的列。如以下图所示〔蓝色的局部〕DancingLinks算法从以上的14步来看,可以把DancingLinks的求解过程表述如下

1、Dancing函数的入口2、判断Head.Right=Head?,假设是,输出答案,返回True,退出函数。3、获得Head.Right的元素C4、标示元素C5、获得元素C所在列的一个元素6、标示该元素同行的其余元素所在的列首元素7、获得一个简化的问题,递归调用Daning函数,假设返回的True,那么返回True,退出函数。8、假设返回的是False,那么回标该元素同行的其余元素所在的列首元素,回标的顺序和之前标示的顺序相反9、获得元素C所在列的下一个元素,假设有,跳转到步骤610、假设没有,回标元素C,返回False,退出函数。问题:你能否用集合模型描述“数独〞〔Soduku)问题?简单一点,且考虑3

3的。“数独〞〔Soduku)问题精确覆盖问题与“数独〞精确覆盖问题与“数独〞精确覆盖问题与“数独〞第1列定义成:〔1,1〕填了一个数字第2列定义成:〔1,2〕填了一个数字……第9列定义成:〔1,9〕填了一个数字第10列定义成:〔2,1〕填了一个数字……第18列定义成:〔2,9〕填了一个数字……第81列定义成:〔9,9〕填了一个数字至此,用第1-81列完成了约束条件1:每个格子只能填一个数字第N列〔1≤N≤81〕定义成:〔X,Y〕填了一个数字。N、X、Y之间的关系是:N=〔X-1〕×9+Y

精确覆盖问题与“数独〞第82列定义成:在第1行填了数字1第83列定义成:在第1行填了数字2……第90列定义成:在第1行填了数字9第91列定义成:在第2行填了数字1……第99列定义成:在第2行填了数字9……第162列定义成:在第9行填了数字9至此,用第82-162列〔共81列〕完成了约束条件2:每行1-9的这9个数字都得填一遍第N列〔82≤N≤162〕定义成:在第X行填了数字Y。N、X、Y之间的关系是:N=〔X-1〕×9+Y+81

精确覆盖问题与“数独〞第163列定义成:在第1列填了数字1第164列定义成:在第1列填了数字2……第171列定义成:在第1列填了数字9第172列定义成:在第2列填了数字1……第180列定义成:在第2列填了数字9……第243列定义成:在第9列填了数字9至此,用第163-243列〔共81列〕完成了约束条件3:每列1-9的这9个数字都得填一遍第N列〔163≤N≤243〕定义成:在第X列填了数字Y。N、X、Y之间的关系是:N=〔X-1〕×9+Y+162

精确覆盖问题与“数独〞精确覆盖问题与“数独〞精确覆盖问题与“数独〞精确覆盖问题与“数独〞精确覆盖问题与“数独〞精确覆盖问题与“数独〞还是举例说明,在〔5,8〕中没有数字把〔5,8〕中没有数字转换成〔5,8〕中填的是1,转成矩阵的一行就是,第44、118、226、289列是1,其余列是0。〔5,8〕中填的是2,转成矩阵的一行就是,第44、119、227、290列是1,其余列是0。〔5,8〕中填的是3,转成矩阵的一行就是,第44、120、228、291列是1,其余列是0。〔5,8〕中填的是4,转成矩阵的一行就是,第44、121、229、292列是1,其余列是0。〔5,8〕中填的是5,转成矩阵的一行就是,第44、122、230、293列是1,其余列是0。〔5,8〕中填的是6,转成矩阵的一行就是,第44、123、231、294列是1,其余列是0。精确覆盖问题与“数独〞还是举例说明,在〔5,8〕中没有数字把〔5,8〕中没有数字转换成〔5,8〕中填的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论