数独难度等级

如何解决数独难度等级

| 我正在构建一个用Javascript编写的数独游戏,很有趣。 一切正常,每次使用一个解决方案即可完全生成电路板。 我唯一的问题是,这就是使我无法将我的项目发布给公众的原因 是我不知道如何为难度等级对板评分。我到处都在看 张贴在论坛等上。我不想自己写算法,这不是重点 项目,此外,它们对我来说太复杂了,因为我不是数学家。 我唯一接近的是这个通过JS进行评分的网站,但问题是,代码以如此糟糕的无证件,非常特殊的方式编写,因此不能借用... 我要指出一点-谁能指出我一个提供Sudoku评分/定级源代码的地方吗? 谢谢 更新22.6.11: 这是我的Sudoku游戏,我已经实现了自己的评分系统 有关基本的人类逻辑解决技术的信息,请查看。     

解决方法

我自己已经考虑过这个问题,我能做的最好的事情就是通过实际解决难题并分析游戏树来确定难题的解决难度。 原来: 使用“人工规则”来实现您的求解器,而不要使用人工玩家不太可能使用的算法。 (就其本身而言,这是一个有趣的问题。)根据求解器对人类的使用难度,对求解器中的每个逻辑规则进行评分。使用数百个或更大的值,这样您就可以自由地相对于彼此调整分数。 解决难题。在每个位置: 枚举可以在当前游戏位置上逻辑推断的所有新单元格。 每个推论的分数(完全解决一个单元格)是足以完成该推论的最简单规则的分数。 编辑:如果必须同时应用一个以上规则,或者多次应用一个规则,以进行一次推论,则将其作为单个“复合”规则应用程序进行跟踪。要对一个化合物评分,可以使用最少数量的单个规则应用程序来求解一个单元格乘以每个单元的得分总和。 (进行这种推断需要花费更多的精力。)根据您的规则集,计算最小数量的应用程序可能会占用大量CPU资源。可以完全解决一个或多个单元的任何规则应用程序都应回滚,然后再继续探索该位置。 排除分数高于所有扣除项中最低分数的所有扣除项。 (这里的逻辑是,玩家将不会感觉到较难的游戏,而是会发现较容易的游戏并接受它;而且,这有望在决策过程中减少大量计算。) 当前位置的难度是当前位置的最低分数除以“最简单”演绎数(如果有很多,找到一个更容易)。因此,如果规则A是得分为20的最容易应用的规则,并且可以在4个单元格中应用,则该位置的得分为5。 在您玩游戏时随机选择一个“最简单”演绎,然后前进到下一个游戏位置。我建议只保留完全求解的单元格用于下一个位置,不传递其他任何状态。当然,这会浪费CPU,重复进行已经完成的计算,但是目标是模拟人的游戏。 难题的总体难度是通过游戏树的路径中各个位置得分的总和。 编辑:替代职位得分:不是使用较难的规则完全排除扣除额,而是计算每个规则(或复合应用程序)的总体难度并选择最小值。 (这里的逻辑是,如果规则A的得分为50,规则B的得分为400,并且规则A可以应用于一个单元格,规则B可以应用于十个单元格,那么位置得分为40,因为玩家更有可能找出十个较难的游戏之一,而不是单一的较难的游戏。但这将需要您计算所有可能性。) 编辑:Briguy37建议的备选方案:在职位得分中包括所有扣除额。将每个位置得分为
1 / (1/d1 + 1/d2 + ...)
,其中
d1
d2
等是个人推论。 (这基本上是在给定单个“推导阻力”
d1
d2
等的位置上计算“进行任何推演的阻力”。但这将需要您计算所有可能性。) 希望这种计分策略将产生一个难题的度量标准,该度量标准会随着您对难度的主观评估的增加而增加。如果不是,则调整规则的分数(或从上述选项中选择启发式)可能会达到所需的相关性。一旦您获得了分数和主观体验之间的一致关联,就应该能够判断“易”,“难”等的数字阈值应该是多少。然后您就完成了!     ,Donald Knuth研究了这个问题,并提出了Dancing Links算法来解决数独问题,然后对它们的难度进行了评分。 在Google周围,Dancing Links引擎有几种实现。     ,我有一个简单的求解器,它只寻找行,列和正方形中的唯一可能性。当它已经解决了用这种方法可解决的几个单元格时,然后选择一个剩余的候选者尝试一下,然后看简单的求解器是否导致了解决方案或没有可能性的单元格。在第一种情况下,难题得以解决;在第二种情况下,一种可能性已证明是不可行的,因此已被消除。在第三种情况下,这既不会导致最终解决方案,也不会导致不可行, 可以扣除。 循环执行此过程的主要结果是消除了直到拣选的可能性 正确的单元格输入会导致解决方案。到目前为止,该程序已经解决了最困难的问题 不解之谜。它通过多种解决方案轻松解决难题。如果 随机选择试验候选人,它将生成所有possilbe解决方案。 然后,我根据必须 在简单的求解器找到解决方案之前将其消除。 我知道这就像猜测,但是如果简单的逻辑可以消除可能的候选者,那么 更接近最终解决方案。 麦克风     ,也许您可以对难题的一般“约束”进行评分?考虑一个新的难题(仅带有提示)可能具有一定数量的单元格,可以通过消除它不能包含的值来确定它们。我们可以说这些单元比典型单元“约束”到更少的可能值,并且存在的约束越多,人们在猜谜时可以取得的进步就越大。 (在这里,我们认为对“猜测”的要求使难题变得很难。) 然而,在某个时候,玩家必须开始猜测,而且,一个单元格的约束性很重要,因为对于给定的单元格,选择的值越少,就越容易找到正确的值(并增加其他单元格的约束性) )。 当然,我实际上并没有玩数独游戏(我只是喜欢玩数独游戏),所以我不知道这是否是一个有效的指标,只想了一下=)     ,我过去曾经做过。 关键是您必须从人的逻辑角度找出要使用的规则。您为示例提供了许多不同的人为逻辑模式,如右图所示。 实际上,您实际上需要使用这些规则而不是计算机规则来解决难题(使用简单的模式替换可以在几毫秒内解决难题)。每次更换板子时,都可以从“最简单”的模式(例如,一个单元格或一行中的单个打开的框)重新开始,然后向下移动链条,直到找到下一个符合逻辑的“规则”为止。采用。 在对数独进行评分时,会为每种方法分配一些点值,您将为每个需要填写的字段加起来。 \“单个空单元格”可能会得到0,而“ XY链状”可能会得到100。将所有需要的方法(和频率)制成表格,最后得到最终的权重。有很多地方列出了这些权重的期望值,但它们都是经验。您正在尝试对人的逻辑进行建模,因此请随意提出自己的权重或增强系统的功能(如果您仅使用XY链,则难题可能比需要更高级的机制更容易)。 您可能还会发现,即使您具有独特的数独,也无法通过人为逻辑解决。 还要注意,这比以标准的模式化方式解决问题要占用更多的CPU资源。几年前,当我编写代码时,要花几秒钟(我确实忘记了,甚至可能长达15秒)来解决我所创建的一些难题。     ,假设难度与用户解决难题所需的时间成正比,这是一种人工智能解决方案,可随着时间的推移接近理想算法的结果。 随机生成固定数量的起始拼图布局,例如100。 最初,提供一个随机难度部分,让用户从可用布局中随机拼图。 保持每个用户的平均随机解决时间。为此,我可能会排在前10位/前X位,从而引起人们对玩随机拼图的兴趣。 保持每个难题解决方案的平均解决方案时间乘数(如果用户通常在5分钟内解决难题并在20分钟内解决难题,则应在难题平均解决方案时间乘数中计入4) 一旦玩了足够多的谜题就可以获得该谜题的基本难度,例如说5次,然后将该谜题添加到已评级谜题列表中,然后将另一个随机生成的谜题添加到可用的谜题布局中。 注意:您应该将第一个谜题保留在随机谜题列表中,以便获得越来越好的统计信息。 一旦您有了足够的基本评分难题(例如50),用户就可以访问应用程序的“额定难度”部分。每个难题的难度将是该难题的平均时间倍数。 注意:当用户选择以额定难度玩拼图时,除非您想计算加权平均值,否则这不应影响平均随机求解时间或平均求解时间倍数(否则,如果用户玩了很多难度较大的拼图,则其平均值为时间和时间乘数会出现偏差)。 使用上述方法,解决方案的等级从0(已经解决/没有时间解决)到1(用户可能会在平均时间内解决这个难题)到2(用户解决问题所需的时间可能是问题解决时间的两倍)他们的平均时间)到无穷大(用户将永远需要为此难题找到解决方案)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?