《数独问题_数学建模》由会员分享,可在线阅读,更多相关《数独问题_数学建模(15页珍藏版)》请在金锄头文库上搜索。
1、数独问题摘要本文是对数独问题进行求解。结合数独生成的特点,立足于题中数独建模和求解的要求,建立了数独难度分析函数和整数规划模型。对于问题一,首先研究数独难度的影响因素,通过综合分析数独的特点结构,得出可以在常数时间计算出来以衡量数独的难易程度。通过计算可知,根据数独难度的划分得到如下结论: 数独难度系数为4,达到了极难的程度。对于问题二,我们通过对此数独的分析和讨论,利用穷举法,通过matlab软件编程求解,最终得出答案,如表1所示。对于问题三,我们利用回溯法思想,建立求解模型,具体算法一般采用如下步骤:1).在此数独初盘选择一个空单元格;2).取这个单元格中一个可能的候选数;3).将这个候选
2、数填入单元格中,迭代完成数独;4).若这个候选数推导得到一个无效数独终盘,返回此单元格取其他候选数;对于问题四采用整数规划模型,采用三维0-1 变量的方法,运用lingo软件编程求解。最终得到答案,如表1所示。 表1 数独问题的唯一解812753649943682175675491293154237896369845721287169534521974368438526917796318452关键词:数独 数独难度分析 穷举法 回溯法 整体规划 1问题的重述前段时间芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。该数独如下图所示:数独是根据99盘面上的已知数字,推
3、理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫的数字均含1-9,且不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。根据以上描述,试完成以下问题:1. 分析此数独的难度;2. 用穷举算法求解数独;3. 设计此数独求解的较优的算法;4. 建立数独求解模型并给出此数独的答案。2模型的基本假设1该数独问题存在唯一解。3符号说明 表示空单元格候选数 表示候选数数的加权函数 表示数独空单元格中的候选数数目函数 表示该数独的空格处 表示该数独难度的函数 表示数k是否填入数独方中的(i,j)处 表示往空格处填入0后数独方中(i,j)处的数
4、表示经过求解后数独方中(i,j)处的数4模型的建立与求解4.1 问题14.1.1数独难度的影响因素通过对数独的分析与研究,数独难度与数独候选数、逻辑推理方法、搜索步数、空格数以及空格的分布情况都有密切的关系。通过大量的计算观察发现,用到的逻辑与推理方法越复杂,那么在数独中出现的候选数越多;反之,在数独题中出现的候选数越多,解决数独题所用到的逻辑推理方法一般也越难。解答一个数独所用到的搜索步数越多,数独中的候选数越多。反之,一般情况下也成立。另外数独中的空格数以及空格的分布情况与候选数也有同样类似的关系。综合这几个影响数独难度的几种因素,分析候选数和空格数为主要影响因素,再根据其构造加权规函数,
5、计算数值来衡量数独难度。4.1.2 函数的建立加权规函数建立在候选数列表的基础上。根据候选数列表,计算出每一个空单元格中的候选数数目,将候选数数目与其相对应的加权函数结合起来,计算加权规函数。定义单元格中的候选数数目函数为,这个函数仅适用于数独P中的空单元格,而数独中的空单元格可以表示为 (1)有个候选数的候选数数目函数 (2)我们赋予它相应的加权函数,从而得到加权函数 (3)不能准确的反映数独难度,受数独中空单元格数目影响很大,呈正向关系,如在数独中删除单元格,数独空单元格数增加,导致增加,即空格数越多,越大,然而这并不符合所有的数独。为了排除这一影响,将加权函数规,得到加权规函数: (4)
6、根据以上的分析,对于某单元格,其候选数数越大,其对应的加权函数也应越大。我们采用指数函数”计算数独的,其中为某空单元格的候选数数目。计算发现,与数独难度是正相关的,即越大,数独的难度越大。4.1.3 函数的求解根据题中给出的数独,按照数独游戏应该满足的条件,可以得到该数独的空格处的候选数列表,如下表2所示:表2 空格处候选数列表812462456923471235712341356945791345679124591243612578124815894578914579145674563489134824581345612346952469238923687168924891246912369
7、12368269238945728912692467924682467912682689568932456923457234123479237234935968234672346852367234693912379235679256723781236781236842572357根据表2,把所得变量带入式(3)得: (5)由代入式(4)式中得: (6)4.1.4数独难度的划分根据计算所得大小,我们将数独题难度分为四个区间,分别表示简单、中等、难、极难。为方便表示,我们用1、2、3、4来表示难度系数。1)若,数独简单,有较多候选数的空单元格很少,此时数独题用一些简单的直观法就可以解决,用1表示。
8、2)若,数独有一定难度,要解决此数独要用到候选数法中的一些简单方法,且与直观法结合起来推理,用2表示。3)若,数独比较难,部逻辑结构复杂,将直观法与候选数法结合起来一般可以解决问题,用3表示。4)若,这个数独很难,部的逻辑结构相当复杂,将直观法与候选数法结合起来不一定可以解决问题,甚至有时候需要对某些空单元格进行猜测,用4表示。在这里,我们将(0,1)粗略分为四个区间,用来相对表示数独的相对难度。根据数独难度的划分,由式(6)可得此数独难度系数为4,达到了极难的程度。4.2 问题2 4.2.1算法的介绍本问中需要的是用穷举法对数独问题进行求解,首先介绍一下穷举法:穷举法,或称为暴力破解法,是基
9、于计算机特点而进行解题的思维方法。一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的部分条件(约束条件)将所有可能解的情况列举出来,然后通过逐个验证是否符合整个问题的求解要求,而得到问题的解。这样解决问题的方法我们称之为穷举算法。穷举算法特点是算法简单,但运行时所花费的时间量大。因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。4.2.2 求解的思想结合本问中需要用穷举法解决数独问题,最终算出上面所给出的数独问题的解。针对此数独问题,在此先介绍一下我的算法思想:1)建立一个堆栈来存放数据;2)根据每行、每列
10、和一个小九宫中不能出现相同的数字的规则来找出所有空格中的所有可能值;3)从可能值中选取一个可能项最少的并提取一个出来,若还有可能值就将其放入堆栈中去,若提出的值不满足条件则从堆栈中再提取一个值来继续求解直到找到满足条件的解;举个例子吧,对这一数独问题,可以很快找到第八行第七列的可能值为3和9,其它空格的可能值都超过了三个,现取出3出来进行尝试,那么放入堆栈中的是9和其它的可能值,还有a(数独值),然后一直按这种方法进行下去,要是遇到不满足则从堆栈中重新拿出一个值来,直到结果满足结束循环。下面列了一个流程图,如下流程图所示。首先进行对程序中的所用符号进行说明,先将数独中问题的初始值(空格为0)存
11、入数组a,将所有空格中的可能值存入数组y。4.2.3 问题的求解根据该流程图进行编程,并在matlab中实现,具体程序见附录1。经过2分钟左右求解得到最终结果,如下表4所示:开始数据初始化将a中所有空格(0)找到其可能的值判断是否有解将堆栈中的y和a拿出来判断是否需要将数据堆栈将数据a和y放入堆栈将可能值赋给a判断a是否有0的值结束 否 是 是 否 否 是 利用穷举法编程求解的流程图4.3 问题3根据问题2中处理方法,发现穷举算法的特点是算法简单,但运行时所花费的时间较长。因此,我们在此基础上进行改进,尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。在求解数独的过程中,遍历此数独所
12、有可能的搜索树,直至找到数独的解为止!在这个过程中,我们采用回溯法进行求解。回溯法是一种搜索算法,其基本思路是:在一个问题中,根据题意给出的边界条件划定出所有可能解的围(称为可能解),根据题意确定出约束条件。利用程序顺次在所有可能解中,搜索时按照深度搜索的方式进行。即在第一层选定一个满足约束条件的解,然后以该可能解为出发点,搜索第二层的一个可能解(试探)。如果搜索到第二层的一个可能解,则继续搜索第三层的一个可能解。依次类推,直到所有层的可能解都被找到,则得到了该问题的一个完整解。如果第二层所有的可能解都不满足约束条件,则返回第一层,放弃原有的可能解,使用第一层的下一个可能解(回溯)。以此类推,
13、寻找第二层的一个可能解。具体算法一般采用如下步骤:1)在此数独初盘选择一个空单元格;2)取这个单元格中一个可能的候选数;3)将这个候选数填入单元格中,迭代完成数独;4)若这个候选数推导得到一个无效数独终盘,返回此单元格取其他候选数;由于回溯法是在不断地试探和回溯中运算,因此也可以称为试探法或者试探回溯法。从上面的描述中可知,回溯法得到的问题的解只是根据不同的初始条件获得的第一个完全满足所有约束条件的解,因此该解的获得和初始条件有关。如果想要获得该问题的全部解,则需要遍历所有的可能的初始条件,也就是遍历所有的第一层的可能解。回溯法相对于其他穷举的特点在于,不必把问题的每一层的所有的可能解都遍历一遍,只要当前的可能解不满足约束条件就抛弃该解,寻求下一个可能解,而不必求解其余的下层解。当当前层的所有可能解都不满足约束条件,则回溯到上一层,抛弃上一层的当前可能解