如何应用excel的迭代计算?我目前对此没有任何想法。

如何使用Excel进行迭代计算

如何使用Excel进行迭代计算

众所周知,数独是一个逻辑谜题(三年前我已经完全沉迷其中),要求你将数字1-9按照一定的规则放入一个格子中(更多数独的资料可以在网上找到)。

当一名研究人员在Excel的团队中时,Coridan写道,该电子表格使用Excel的公式来解决数独游戏,并在网上提供(这里)。丹的电子表格很棒,用很多电子游戏都解决了。它不使用任何VBA或其他脚本来解决问题,而是依赖于具有迭代计算功能的Excel。这是相当冷静的,并已成为一个受欢迎的下载,但有一件事,关于电子表格,我想看看,如果我不能改善它究竟有多复杂。事实上,每个单元格都有自己不同的公式,他最终不得不使用VBA创建的公式,因为它维护和调试的VBA不会编写所有这些不同的公式,自动方式是不可能的。

看Dan的电子表格,我觉得我自己版本的数独求解器不仅仅是用来解公式的,也是公式相对理解的地方,有几个独特的公式。不用说,这已经变得很难建立,但我认为我学到了很多关于尝试不同的方法来制作像这样的迭代模型的知识,该模型表现良好,同时得到了合理的维护和理解。在我看来,甚至可能有一种合理有益的学习抽象公式的方式,兼顾Excel公式语言。我一直想在博客中记录创建这个电子表格的过程,以及如何使用迭代公式来展示Excel公式语言的强大功能,因为它显示了有用的循环引用和迭代计算,并且因为我认为在这里使它变得不必要是一件非常有趣的事情。许多人已经创建了更强大的求解器,许多电子表格,有些只使用公式,但我想尝试解释如何创建解决方案,希望分享一些公式,人们会发现它们很有用。

先决条件

创建一个电子表格来解决数独不是一个入门级的电子表格。除了好的公式,你还需要理解迭代的概念。Chris在他早期的post iteration和Conway的life game中已经出色地解释了该主题,所以我不想重复,我将简单地假设您已经了解迭代。其次,我们必须极其大量地使用命名范围,并为我做一些事情,新的名称管理器非常有益(参见公式构造改进第4部分:定义一些相关书籍的名称)并且我必须承担工作和通用命名范围的知识(但我必须展示一些可能是新的经验公式的技能,即使是对用户)。最后,你至少需要熟悉Excel中的数组符号。

成立审计委员会

对于没输的,我准备开始打造一系列主板,真的希望用在丹科:一个9x9的板投资,一个9x9的板解决方案,每个盒子27x27板的可能价值。我通过改变行高、列宽、字体和比例等来做到这一点。所有的单元格都是小正方形,然后我用边框和填充得到如下结果:

输入和合理的解决方案板很直观(输入板在左上角,你可以在这里输入一个要解决的难题,解决方案就是板想要显示的正确答案)。板子可能值,我打电话给RMS局,但是有点小麻烦。这是27x27,因为每个盒子都被放入RMS板中的一个3x3单元并由它求解。每个9单元格是否代表一个数字1-9仍然是对应解的实际值,特定单元格中输入/解单元格的一系列可能值是一个不属于空白的3×3“大单元格”中所有数字的集合。如果不是,这个委员会的目的/用途应该在以后变得清楚。现在,让我们在上面的每个大单元格中填入从8: 59开始的所有可能的值。

填写有效值局

我们想通过建立一个单一的公式来填充各种数字1-9。在此基础上,定位连续列公式,然后我们后面会添加数字无效的逻辑空白。这个公式比电子表格中的一般公式要复杂一点,所以我先分解整个公式。这看起来像这样:

=国防部(列(A1) -1,3)+1+国防部(列(A1) -1,3) * 3

当这是输入左上角的单元格RMS office时,则加载整个RMS office,这使得结果如下:

请注意,你要做的是选择性粘贴|公式或者CTRL输入,否则会把所有漂亮的格式都搞乱。

打破这个公式,行和列返回(du)对行或列的引用,并向它们传递一些。通过这些函数框A1,因为在这个公式中,意味着他们会给我们一个数字,以上升开始。第一部分中的公式使用模函数将数字列转换为0-2的数字,然后加1得到1-3。为此,我们添加一个0、3或6,根据行函数所使用的模函数的结果确定行号。

其次,因为它有点像gnarly公式,我们将不得不在任何地方使用它,我们将借用这个公式,并将其移出单元格,移入命名范围。这使我们能够将所有逻辑公式抽象成一个简单易懂的名称。由于没有更好的名称,我将称它为“一酮碱”,并有相同的确切公式,这是我们刚刚建立的。由于相对引用的背景(即,它们是否是当前单元格)是由您在创建命名范围时所在的单元格组成的,因此最初选择单元格A1,然后创建新的命名范围,以便您的公式在整个资产负债表中有效,这一点非常重要。

这就是为什么我们允许水槽的三排三列周围的所有木板。

现在,我们可以把我们的新名字放在局里测试,就像这样:

在这里按CTRL+是设置公式中所有单元格的有效值最简单的方法。首先请选择整个游戏,然后输入到公式中,不用按键,只需按Ctrl+Enter两次,就可以在公式中填入你刚刚输入的所有单元格(不要混淆它们的格式)。

建立结算局

我们将考虑基本RMS留下了一个盒子,我们当前的解决方案看起来像什么(而不是输入),但为了做到这一点,我们需要一些东西来解决电路板。首先,至少,解决方案肯定会包含所有来自输入局的盒子。先用最简单的方法做这个,赶上空白的情况。在解板中,让我们所有的单元格都相等,在对应的单元格输入板中使用相对引用即可,除非输入单元格为空。最简单的方法是使用下面的公式(在所示的表格中,这将是单元格D16):

= If(个人财产,个人财产,"")

同样,请使用Ctrl+Enter来填充适当的单元格。现在,我们有了使我们使用命名范围更可重用和更有意义的基础工作。

就像我们的名字onetonine一样,让抽象的概念指代任何从细胞中正确输入细胞的溶液,使委员会成为一个名字。我们需要在某一点上做一些类似于所有板的事情,所以我们会开始为每个板做命名范围(我选择in_board,sol_board,val_board),然后从解板(in_cell_from_sol)到一个名称输入板,简单= main!D4类,然后用这个变化公式就是= if (in_cell_from_sol,in_cell_from_sol," ")。请注意,这需要D16。

当然,到目前为止,我们只是让我们的公式不再,但相信我,这个概念已经成为一个生活程序。做同一个RMS单元解决板单元是唯一有点麻烦的。sol_cell_from_val名称为:

=指数(sol_board,中断((列(main!A1) -1)/3) 1,中断((列(主!A1) -1)/3) +1)

这必须由细胞的P4来确定。在这个公式中,将27x27局中当前单元格转换的坐标,与运算符和INT一起用行列在9x9板上,然后用索引得到单元格sol_board对应的坐标。

测试这两个公式的方法是从不同单元的RMS局单击“引用”框中的名称管理器。根据你所在的细胞,你会看到不同细胞的“跳舞的蚂蚁”(移动突出)——细胞想要相应的解决方案。

现在有一些基础知识把我们放到一个实际的难题中,请参考关于让输入扩散到解板和人民币。这令人困惑,我们将使用:

输入它,解决方案板应该是这样的。为了使均方根工作,我们对所有有效板单元使用以下公式:

= If (sol _ cell _ from _ val

这意味着现有的存储单元被存在的值所掩盖,如果该单元被求解并且该值不是当前的一元值。

这将为您提供:

现在,我们准备做一些实际上有助于根据游戏规则和策略提出解决方案的事情。

查一些线路的解局。

游戏的主要规则是,在任何一行、一列或3x3的盒子中,都不能有两个相同的数字。我们将开始添加规则,即任何行中不能有一个以上的数字,然后在列和大框中。例如,在第一行的第二个大单元格中,数字4、2、7或9可能都不是由于这个规则。我们可以这样做,将任意单元格的空白RMS设为1),这在解中是不存在的(而这正是最终Onetone RMS单元格的公式),2),line的解包含一些等于现值Onetone的委员会。请注意,条件# 1是过去的onetonine显示(也就是没有办法求解当前的大单元格),所以我们能做的就是把逻辑# 2放进去。这个逻辑可以表述为:

= If (COUNTIF (sol_row_from_val,Onetone) "0," ",Onetone)

其中sol_row_from_val为:

=指数(sol_board,中断((列(main!a 65438+a 1)-1)/3)1+0,0)

同样,这必须从P-4输入。

因此,结合这些,我们得到:

= If (sol _ cell _ from _ val

其中,不是简单,至少可以理解,而是能给你提供一个有效的价值局,看起来是这样的:

扩展到列和(3x3)大框。

当我们去购买规则“一列中没有两个相同的数”和“一个大盒子中没有两个相同的数”时,用同样的方法,我们会遇到两个问题:1。不能创建sol_bigbox_from_val直接使用索引,因为索引只返回区域中的一个单元格、一行或一列或整个区域和2。这将在本月底开始使所有三个繁琐的COUNTIFs或' d公式在一起。

要解决第一个问题,您可以使用胶印-因为您可以使用胶印在这里创建任何其他参考-但因为胶印是不稳定的,它会导致在路上的性能问题。更好的解决方案是从索引中取出您两次提到的alliance(使用Excel-colon中的alliance操作符),以便得到3x3的范围。这为我们提供了sol_bigbox_from_val(来自P-4的输入)的以下公式:

=指数(sol_board,中断((列(main!a 1)-1)/9)* 3+1,中断((列(主!grid a 1)-1)/9)* 3+1):指数(sol_board,中断((列(main!A1) -1)/9) * 3 +3,中断((列(主!A1) -1)/9) * 3 +3)

现在我们可以选择这个公式,除了它更容易。中断、线路和部分划分表示每9条线路您将处于RMS局中,向下移动三条线路的块以解决该局。有一个类似的表达式列,完成相同的单词。第二个引用与第一个引用完全相同,但它在两列之间向下偏移了两行,这样就有了3x3的正方形。

既然有了这个,我们就可以写一个大的公式,包括onetonine值是否已经存在于任何行、列或大框中,但是我们在这里再次使用抽象,让基本公式有效值局更简单。让我们创建一个名为solution_in_rcb的新名称,作为“在解决方案单元格和我的电话号码中是否存在任何行、列或大框?”这个名字只返回真或假(作为实验的一部分,条件# 2不是段落),虽然它并不短,但它实际上写起来很简单:

= or (COUNTIF (sol_row_from_val,ONETONINE) "0,COUNTIF (sol_col_from_val,ONETONINE)" 0)

使用这个新名称使我们的新公式成为有效单元格:

= If (sol _ cell _ from _ val

这不仅比这个公式更容易理解,而且还引出一些明确的地方,只有一个可能的解决方案:

所以我们可以看看一些解决方案,但关键是要把这些委员会的解决方案喂给他们。这就是迭代的用处。下次我们将使用迭代和一些公式技巧来解决一些数独。