Java 求解数独的多线程算法?

Java 求解数独的多线程算法?,java,multithreading,algorithm,sudoku,Java,Multithreading,Algorithm,Sudoku,我有一个家庭作业要写一个多线程数独解算器,它能找到给定谜题的所有答案。我以前写过一个非常快速的单线程回溯数独解算器,所以在数独解方面我不需要任何帮助 我的问题可能与没有真正摸索并发性有关,但我看不出这个问题如何从多线程中获益。我不明白你怎么能在同一时间找到同一问题的不同解决方案,而不维护拼图的多个副本。鉴于这个假设(请证明它是错误的),我不认为多线程解决方案比单线程解决方案更有效 如果有人能给我一些算法的开始建议,我将不胜感激(请不要代码…) 我忘了提到,要使用的线程数是作为程序的参数指定的,

我有一个家庭作业要写一个多线程数独解算器,它能找到给定谜题的所有答案。我以前写过一个非常快速的单线程回溯数独解算器,所以在数独解方面我不需要任何帮助

我的问题可能与没有真正摸索并发性有关,但我看不出这个问题如何从多线程中获益。我不明白你怎么能在同一时间找到同一问题的不同解决方案,而不维护拼图的多个副本。鉴于这个假设(请证明它是错误的),我不认为多线程解决方案比单线程解决方案更有效

如果有人能给我一些算法的开始建议,我将不胜感激(请不要代码…)


我忘了提到,要使用的线程数是作为程序的参数指定的,所以据我所知,它与谜题的状态没有任何关系


此外,可能没有唯一的解决方案-有效的输入可能是一个完全空的板。我必须报告
min(1000,解决方案的数量)
并显示其中一个(如果存在)

当你说一个给定谜题的所有解决方案时,你是指该谜题的最终解决方案还是唯一解决方案?还是以不同的方式达成一个解决方案?我的理解是,根据定义,数独游戏只能有一个解决方案

对前者而言,要么如此,要么如此


如果是后者,您可以实现某种分支算法,在拼图的每个阶段为每个可能的移动启动一个新线程(带有自己的拼图副本)。

根据您对单线程解算器的编码方式,您可能能够重新使用逻辑。您可以编写一个多线程解算器,使用一组不同的策略启动每个线程,以解决难题


使用这些不同的策略,您的多线程解算器可能比单线程解算器在更短的时间内找到全部解决方案(请记住,一个真正的数独难题只有一个解决方案…您不是唯一一个必须在课堂上处理可怕游戏的人)

几年前,当我研究解决数独问题时,似乎最佳解决方案使用了逻辑分析算法的组合,只有在必要时才使用蛮力。这使得解算器能够非常快速地找到解决方案,如果您想使用它生成新的谜题,还可以按难度对棋盘进行排序。如果采用这种方法,您肯定会引入一些并发性,尽管让线程实际协同工作可能会很棘手。

它需要从多线程中获益,还是只需要利用多线程就可以为任务学习


如果使用蛮力算法,则很容易将其拆分为多个线程,如果分配的重点是对线程进行编码,那么这可能是一个可接受的解决方案

多线程背后的思想是利用多个CPU,允许您同时进行多个计算。当然,每个线程都需要自己的内存,但这通常不是问题


通常,您要做的是将可能的解决方案状态划分为几个尽可能独立的子空间(以避免在线程创建开销上浪费太多资源),并且“适合”您的算法(从拥有多个线程中实际获益)

多线程在任何情况下都很有用,在这种情况下,单个线程必须等待资源,而您可以同时运行另一个线程。这包括一个线程等待I/O请求或数据库访问,而另一个线程继续CPU工作

如果单个线程可以分配给不同的CPU(或内核),那么多线程也很有用,因为它们可以真正并发运行,尽管它们通常必须共享数据,因此仍然会有一些争用

我看不出多线程数独解算器比单线程数独解算器更有效率的原因,因为不需要等待资源。一切都将在记忆中完成

但我记得我在大学做过一些家庭作业,这些作业同样没用(Fortran代码显示,当你以30度的角度挖掘一英里,然后再挖掘15度的隧道时,隧道有多深——是的,我很老了:-)。关键是要证明你能做到,而不是说它有用

关于算法

我编写了一个单线程解算器,它基本上在每个过程中运行一系列规则,以尝试填充另一个正方形。一个示例规则是:如果第1行只有一个无平方,则该数字从第1行的所有其他数字中明显可见

所有行、所有列、所有3x3迷你网格都有类似的规则。还存在检查行/列相交的规则(例如,如果给定的正方形因行而只能包含3或4,因列而只能包含4或7,则为4)。这里我不想详述更复杂的规则,但它们基本上与手动解决的方法相同

我怀疑您的实现中有类似的规则(因为除了暴力,我想不出其他解决方法,如果您使用暴力,您就没有希望了:-)

我建议将每个规则分配给一个线程,并让它们共享网格。每个线程都会执行自己的规则,并且只执行该规则

更新:

乔恩,根据你的编辑:

[编辑]我忘了提到,要使用的线程数是作为程序的参数指定的,所以我可以说它与谜题的状态没有任何关系

此外,可能没有唯一的解决方案-有效的输入可能是一个完全空的板。我必须报告最小值(1000,解决方案数)并显示其中一个(如果存在)

看来你的老师不想要你