ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: aoe1981

[原创] 数独解法学习,好像是递归剪枝了

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-22 22:50 | 显示全部楼层
深度资料:

700万小时搞定最小数独问题
sqybi
刚刚迈入 2012 年,数学界就有一个不大不小的收获。三位爱尔兰数学家发表了一篇论文,证明了数独至少需要 17 个初始数字才有唯一解。这个问题很难吗?其实一点也不,计算机才花了 700 万小时的 CPU 时间(CPU时间指CPU上执行指定代码的时钟周期数乘以每个时钟周期的时间长度)就搞定了这道数独题。这 700 万个小时它了做了什么?是三位数学家的方法很笨才导致算了这么久吗?实际上,这个时间已经不算长了。看看死理性派的详细介绍你就知道了。


https://www.guokr.com/article/89169/

(资料来源)

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-22 23:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
公平对决,这个例子我的不及香川大侠的:

8                                                               
                3        6                                       
        7                        9                2               
        5                                7                       
                                4        5        7               
                        1                                3       
                1                                        6        8
                8        5                                1       
        9                                        4               



来源:

https://baijiahao.baidu.com/s?id=1637310149410343903&wfr=spider&for=pc

公平对比不及香川的例子.PNG


公平对比不及香川的例子2.PNG


测试了许多,也该歇歇了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-22 23:53 | 显示全部楼层
极端生猛的一道题:

极端生猛的一道题.PNG


极端生猛的一道题2.PNG


香川大侠.PNG


不得不说,香川大侠的算法还是真的牛!

来源:
https://zhuanlan.zhihu.com/p/39306130

以及下面的网站:

http://www.cn.sudokupuzzle.org/

知乎作者给出的解题时间是25.14秒。我的电脑是amd的2400四核八线程的电脑,便宜货。

现在看来,还真不敢自吹自擂。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-23 00:08 | 显示全部楼层
我以为只要合乎数独规则的题目,就一定有解,没成想我居然构造出了一道合乎规则但无解的题目,方法是在楼上的题目中胡乱加了一个数字:

合乎规则但无解.PNG


合乎规则但无解1.PNG


合乎规则但无解2.PNG


因此,也发现了代码中一个小小的BUG,加了一句恢复事件响应的代码:

  1.     If jgs = 0 Then Application.EnableEvents = True
复制代码



同步更新顶楼附件。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-23 00:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
接下来的改造是在原题基础上去掉了一格,香川大侠的没问题,但却击中了我的算法的软肋:

香川的没问题.PNG


击中算法软肋.PNG


击中算法软肋2.PNG


击中算法软肋3.PNG


击中算法软肋4.PNG


明天有时间了再抽空跑一跑,看来,这个谜题的结果在我的算法生成的“树”的最后部分,我再尝试一下将“可填数字”固定从小到大测试,改为随机测试,或从大到小测试,看有何变化。

TA的精华主题

TA的得分主题

发表于 2020-2-23 09:04 | 显示全部楼层
aoe1981 发表于 2020-2-22 22:30
“世界最难数独”看来只是讲故事的,不过如此:

https://baike.baidu.com/item/%E4%B8%96%E7%95%8C%E6%9C ...

题目难度是 人工解题的逻辑技巧 难度,而不是暴力解题的 速度。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-23 09:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2020-2-23 09:04
题目难度是 人工解题的逻辑技巧 难度,而不是暴力解题的 速度。

言之有理,我的意思是:我觉得递归格64格的题目应当是人工解题难度最大的,自然不是将计算机暴力与人脑相提并论。说实在的,我之前都没玩过数独,前几天试着玩了一下,发现不全是逻辑推理的事,最主要的是考验人的记忆能力和数字直觉,有时我都会借助纸笔,勉勉强强只做完了两道初级版的,平均用时13分钟。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-23 16:03 | 显示全部楼层
今天又折腾了大半天,最终处理效果如下图:

解决效果1.PNG

解决效果2.PNG

可见是增加了关于“搜索顺序”的选项。

我尝试了许多方案:

1.最先想到的是改成“从大到小”搜索,对于递归格的可填数,默认是从小到大逐个试填,既然首个结果出现极不容易,说明最终的解集中在“搜索树”的最右枝,那么只要改成“从大到小”试填,应该效率会提高,果不其然:


1从大到小试填.PNG

2从大到小试填2.PNG

但我对这个处理方案不满意,虽然对结果是极满意的,因为,从大到小和从小到大一样,总会遇上让它抓狂的数独谜题,因此我想寻找折中的,或更好的方案。


2.随机试填

有:起点随机,后续从小到大,即:1~9、2~9~1、3~9~2、4~9~3、……、9~1~8;

3随机起点填不稳定.PNG

4随机起点填不稳定.PNG

对于这个方案,极不稳定,忽长忽短,一言以蔽之:蛇精病。

有:把排序方法改为“不稳定”的,比如在代码中增加“=”

5不稳定冒泡排序.PNG

这个方案在解决这道题目上好多了,我使用的是“不稳定冒泡排序”,使得比如:可填数都为2的空格产生了不稳定的次序,其实也是增加了“随机”和“波动”的因子。我刚想激动,却发现在普通谜题上效率又低了一些,因为,不稳定排序多了一些交换的操作。综合而言:这个方案还可以,但绝不优秀。


还有:就是一开始不再按固定的顺序从上向下、从左向右计算空格,在填入阶段就采用不同的顺序,甚至是随机的顺序,但都一个嘴脸:不稳定,蛇精病!


3.最终方案:

就让算法变得稳定一点吧,快就快,慢就慢,好歹胜过让人捉摸不定。左枝结果少了,就从右枝先找;右枝结果少了,就先从左枝找。不是很自然的处理办法吗?


其实:我实在没辙了。

顶楼附件再次更新至本楼,其中含注释掉的模块三,只作为折腾过程的辛劳备注。

TA的精华主题

TA的得分主题

发表于 2020-2-23 19:28 | 显示全部楼层
  1. Public Answer$

  2. Sub ManualFinish_Click()
  3.     Dim st$, i&, j&, arr, brr&(), num&
  4.     arr = [a1].Resize(9, 9)
  5.    
  6.     For i = 1 To 9
  7.     For j = 1 To 9
  8.         If arr(i, j) = "" Then st = st & "0" Else st = st & CStr(arr(i, j))
  9.     Next
  10.     Next
  11.    
  12. num = StartNew(st)
  13. If num = 1 Then
  14.    ReDim brr(0 To 8, 0 To 8)
  15.    For i = 0 To 80
  16.        X = Int(i / 9)
  17.        Y = i Mod 9
  18.        brr(X, Y) = Mid(Answer, i + 1, 1)
  19.    Next
  20.    [m1].Resize(9, 9) = brr
  21. Else
  22.    MsgBox "无解或多解"
  23. End If
  24. End Sub

  25. Function StartNew(ByVal gGame$)
  26.     Dim sol As dlx_solver
  27.     Set sol = New dlx_solver
  28.    
  29.     StartNew = sol.Solve(gGame, Answer, True)
  30. End Function
复制代码
http://club.excelhome.net/thread-1433335-1-1.html
从中 剥离出部分功能
hello.rar (27.16 KB, 下载次数: 4)


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-24 08:13 | 显示全部楼层
建议每格的候选数用二进制数字表示来缓存,511表示1~9,1-1,2-2,3-4,4-8,5-16,6-32,7-64,8-128,9-256;这样中途计算可以采用位运算,也就不需要特意的检查步骤了,碰到有格被删空,自然是填错了

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-20 12:31 , Processed in 0.052382 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表