数独求解器的神经网络
neural network for sudoku solver
我最近开始学习神经网络,我认为创建一个数独求解器将是神经网络的一个很好的应用。我开始用反向传播神经网络学习它们,但后来我发现有几十个神经网络。在这一点上,我发现很难学习所有这些然后根据我的目的选择一个合适的。因此,我想知道创建此求解器的最佳选择是什么。反向传播神经网络可以在这里工作吗?如果不行,你能解释一下原因并告诉我哪个可行吗?
谢谢!
就像评论中提到的,你可能想看看convolutional networks。您基本上将数独输入为二维 'image'。我认为使用 3x3 的感受野会很有趣,我真的不认为你需要一个以上的过滤器。
更难的是归一化:数字 1-9 在数独中没有潜在关系,例如,您可以轻松地将它们替换为 A-I。所以它们是类别,而不是数字。但是,对每个输出进行单热编码意味着 很多 输入,所以我会坚持使用数值归一化(1=0.1、2 = 0.2 等)
你的网络的输出应该是某种类型的 softmax:如果你不使用 softmax,而是只输出一个 x 和 y 坐标,那么你不能保证输出的正方形没有被还没填。
应随输出传递一个数值,以显示网络要填充的数字。
神经网络似乎并不是解决数独的最佳方法,正如其他人已经指出的那样。我认为更好(但也不是 good/efficient)的方法是使用遗传算法。遗传算法与神经网络没有直接关系,但了解它们的工作原理非常有用。
更好(更好,我的意思是更有可能成为成功者,可能对你学习新事物更好)想法包括:
如果您使用图书馆:
尝试使用网络,尝试将它们训练到不同的数据集,也许是随机数,看看你得到了什么,以及如何调整参数以获得更好的结果。
尝试写一个图像生成器。我写了其中的一些,它们仍然是我最喜欢的项目,其中一个我使用反向传播来教神经网络图像的 x/y 坐标具有哪种颜色,另一个方法将随机生成的图像与另一个相结合(GAN/NEAT).
尝试使用create a movie (series of images)的网络学习创建图片。它将很好地向您展示反向传播的工作原理以及参数调整对结果的影响以及它如何改变网络获得结果的方式。
如果您没有使用图书馆:
尝试一个接一个地解决容易的问题。使用反向传播或遗传算法进行训练(无论你实现了什么)。
尝试改进您的实施并更改一些其他人不关心的事情,看看它如何改变结果。
您网络的 'tasks' 列表:
- 异或(基本上是NN的hello world)
- 极平衡问题
- 像乒乓球这样的简单游戏
- 更复杂的游戏,如 flappy bird、agar.io 等
- 选择更多你觉得有趣的问题,也许你喜欢图像识别,也许是文本、音频,谁知道呢。想想你 can/would 喜欢做的事情,然后找到一种方法让你的电脑为你做。
不建议仅使用您自己的神经网络实现,因为前几次它可能无法正常工作,您会感到沮丧。尝试库和您自己的实现。
寻找几乎无穷无尽的资源的好方法:
使用 google 搜索并在末尾添加 'filetype:pdf' 以仅显示 pdf 文件。搜索神经网络、遗传算法、进化神经网络。
正如 PLEXATIC 所提到的,神经网络并不真正适合这类任务。遗传算法听起来不错。
但是,如果您仍然想坚持使用神经网络,可以看看 https://github.com/Kyubyong/sudoku。正如 Thomas W 的回答,3x3 看起来不错。
如果你不想和CNN打交道,你也可以在这里找到一些答案。 https://www.kaggle.com/dithyrambe/neural-nets-as-sudoku-solvers
无论是神经网络还是 GA,都不接近数独的理想解决方案。我建议研究约束编程(例如 Choco 或 Gecode 求解器)。例如,参见 https://gist.github.com/marioosh/9188179。应该在几毫秒内解决任何 9x9 数独("Le monde" 期刊的每日数独都是使用这种技术顺便说一句创建的)。
Knuth 针对这个问题还有一个著名的 "Dancing links" 算法,效果很好 https://en.wikipedia.org/wiki/Dancing_Links
我最近开始学习神经网络,我认为创建一个数独求解器将是神经网络的一个很好的应用。我开始用反向传播神经网络学习它们,但后来我发现有几十个神经网络。在这一点上,我发现很难学习所有这些然后根据我的目的选择一个合适的。因此,我想知道创建此求解器的最佳选择是什么。反向传播神经网络可以在这里工作吗?如果不行,你能解释一下原因并告诉我哪个可行吗? 谢谢!
就像评论中提到的,你可能想看看convolutional networks。您基本上将数独输入为二维 'image'。我认为使用 3x3 的感受野会很有趣,我真的不认为你需要一个以上的过滤器。
更难的是归一化:数字 1-9 在数独中没有潜在关系,例如,您可以轻松地将它们替换为 A-I。所以它们是类别,而不是数字。但是,对每个输出进行单热编码意味着 很多 输入,所以我会坚持使用数值归一化(1=0.1、2 = 0.2 等)
你的网络的输出应该是某种类型的 softmax:如果你不使用 softmax,而是只输出一个 x 和 y 坐标,那么你不能保证输出的正方形没有被还没填。
应随输出传递一个数值,以显示网络要填充的数字。
神经网络似乎并不是解决数独的最佳方法,正如其他人已经指出的那样。我认为更好(但也不是 good/efficient)的方法是使用遗传算法。遗传算法与神经网络没有直接关系,但了解它们的工作原理非常有用。
更好(更好,我的意思是更有可能成为成功者,可能对你学习新事物更好)想法包括:
如果您使用图书馆:
尝试使用网络,尝试将它们训练到不同的数据集,也许是随机数,看看你得到了什么,以及如何调整参数以获得更好的结果。
尝试写一个图像生成器。我写了其中的一些,它们仍然是我最喜欢的项目,其中一个我使用反向传播来教神经网络图像的 x/y 坐标具有哪种颜色,另一个方法将随机生成的图像与另一个相结合(GAN/NEAT).
尝试使用create a movie (series of images)的网络学习创建图片。它将很好地向您展示反向传播的工作原理以及参数调整对结果的影响以及它如何改变网络获得结果的方式。
如果您没有使用图书馆:
尝试一个接一个地解决容易的问题。使用反向传播或遗传算法进行训练(无论你实现了什么)。
尝试改进您的实施并更改一些其他人不关心的事情,看看它如何改变结果。
您网络的 'tasks' 列表:
- 异或(基本上是NN的hello world)
- 极平衡问题
- 像乒乓球这样的简单游戏
- 更复杂的游戏,如 flappy bird、agar.io 等
- 选择更多你觉得有趣的问题,也许你喜欢图像识别,也许是文本、音频,谁知道呢。想想你 can/would 喜欢做的事情,然后找到一种方法让你的电脑为你做。
不建议仅使用您自己的神经网络实现,因为前几次它可能无法正常工作,您会感到沮丧。尝试库和您自己的实现。
寻找几乎无穷无尽的资源的好方法: 使用 google 搜索并在末尾添加 'filetype:pdf' 以仅显示 pdf 文件。搜索神经网络、遗传算法、进化神经网络。
正如 PLEXATIC 所提到的,神经网络并不真正适合这类任务。遗传算法听起来不错。
但是,如果您仍然想坚持使用神经网络,可以看看 https://github.com/Kyubyong/sudoku。正如 Thomas W 的回答,3x3 看起来不错。
如果你不想和CNN打交道,你也可以在这里找到一些答案。 https://www.kaggle.com/dithyrambe/neural-nets-as-sudoku-solvers
无论是神经网络还是 GA,都不接近数独的理想解决方案。我建议研究约束编程(例如 Choco 或 Gecode 求解器)。例如,参见 https://gist.github.com/marioosh/9188179。应该在几毫秒内解决任何 9x9 数独("Le monde" 期刊的每日数独都是使用这种技术顺便说一句创建的)。
Knuth 针对这个问题还有一个著名的 "Dancing links" 算法,效果很好 https://en.wikipedia.org/wiki/Dancing_Links