Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用回溯算法修改版本的熄灯_Algorithm_Backtracking - Fatal编程技术网

Algorithm 使用回溯算法修改版本的熄灯

Algorithm 使用回溯算法修改版本的熄灯,algorithm,backtracking,Algorithm,Backtracking,游戏由一个8乘8的灯光网格组成,当游戏开始时,这些灯光的随机集合被打开。按下其中一个指示灯将切换该指示灯,并打开和关闭与其相邻的四个指示灯。对角邻居不受影响。游戏提供了一个谜题:给定一些初始配置,其中一些灯打开,一些灯关闭,一些灯不可用,目标是关闭所有灯,最好是尽可能少地按下按钮。 有谁能告诉我一个使用迭代回溯来解决这个问题的正确方法吗?最简单的解决方案 首先,您需要一种表示电路板状态的方法和一个存储所有状态的堆栈。在每个步骤中,制作一份电路板的副本,更改为新状态。将该状态与迄今为止遇到的电路板

游戏由一个8乘8的灯光网格组成,当游戏开始时,这些灯光的随机集合被打开。按下其中一个指示灯将切换该指示灯,并打开和关闭与其相邻的四个指示灯。对角邻居不受影响。游戏提供了一个谜题:给定一些初始配置,其中一些灯打开,一些灯关闭,一些灯不可用,目标是关闭所有灯,最好是尽可能少地按下按钮。

有谁能告诉我一个使用迭代回溯来解决这个问题的正确方法吗?

最简单的解决方案 首先,您需要一种表示电路板状态的方法和一个存储所有状态的堆栈。在每个步骤中,制作一份电路板的副本,更改为新状态。将该状态与迄今为止遇到的电路板的所有状态进行比较。如果您还没有看到它,请将该状态推到堆栈顶部,然后继续下一步。如果你看到了,试试下一步。在从堆栈中弹出状态(回溯)之前,每个级别必须尝试所有可能的64个移动。您需要使用递归来管理要检查的下一步的状态

最多有264种可能的电路板配置,这意味着您可能会处于非常长的唯一状态链上,并且仍然会耗尽内存。(作为参考,1 GB是230字节,您需要至少8字节来存储电路板配置)此算法不可能在已知宇宙的生存期内终止

你需要做一些聪明的事情来减少你的搜索空间

贪婪的第一次搜索 通过首先搜索最接近已解决配置的状态,可以做得更好。在每个步骤中,按从最亮到最暗的顺序对可能的移动进行排序。按那个顺序迭代。这应该可以很好地工作,但不能保证得到最佳解决方案

并非所有熄灯的谜题都是可以解决的 无论您使用什么算法,都可能没有解决方案,这意味着您可能会永远(或至少数万亿年)搜索,而找不到解决方案


在浪费时间寻找解决方案之前,您需要检查电路板的可解性(事实证明,这是一种速度更快的算法)。

您需要比回溯更聪明的方法来解决这个问题,因为回溯本身就是一种蛮力搜索,速度太慢了。至少,你需要一些东西来缩小搜索空间和防止循环。我不关心性能。根据,Lights Out是NP complete,这意味着很难比暴力搜索做得更好。如果你需要找到最佳解决方案,那就是保证指数复杂度。@Beefster有一个多项式时间算法来解决“这个电路板可解吗?”这个问题似乎是关于一个最小化问题,“给定一个表示连通性的任意图,最小化打开的灯的数量,”这是一个稍微不同的问题。@templatetypedef即使如此,我在回答中也提到了状态爆炸的问题。无论如何,他想找到一个解决方案,这和检查可解性是两码事。我来试试。如何检查可解性?@7lYNdYzwbY IIRC,这是一个简单的奇偶校验。你数一数打开的灯的数量,确保它是偶数还是奇数(我忘了是哪个)。可能更复杂一点。谢谢。每行和每列中打开的灯的数量必须为偶数。对吧?@7lYNdYzwbY我真的不确定。查找它。@7lYNdYzwbY-搜索的最终条件应该在您的作业中指定-因此一个人的解决方案在您的情况下可能不起作用。祝你好运。