我在使用A *算法解决名为Lights out的逻辑难题时遇到了一些问题。现在,我正在使用A *算法的实现,其中我将整个光源矩阵视为算法中的一个节点(其中1表示打开的灯光,0表示关闭的灯光)以及当前节点的坐标将被切换。从打开列表中选择f得分最低的节点后,将其切换并获得其8个相邻邻居,然后将它们附加到打开列表中,然后重复进行直到找到一个节点,其所有灯的总和等于0(所有指示灯均熄灭)。
要计算每个节点的f分数,我只需计算其局部矩阵中所有光源的总和,从而每次选择具有矩阵的光源数量最少的节点点亮。
我知道,即使与“追光灯”方法相比,该算法也不会如此高效,但是我不知道如何告诉算法要选择哪个下一个节点,以及要使用哪个f评分功能,因为考虑矩阵中的灯光总和将使算法每次都循环遍历相同的3/4个节点。
此外,我想对如何表示算法的节点提出一些建议,因为在诸如此类的情况下,我无法获得如何在拥有目标节点的矩阵内使用通常用于路径优化的算法。在这里,您将整个矩阵视为节点,而您的目标不是到达特定节点,而只是检查其总和为0。
我完成所有工作的语言是Lua。
谢谢。
编辑19/5/27 由于我是Lua的新手,所以我将自己的错误和编写代码的能力以及对算法的理解都归咎于我找不到解决方案。 我不太善于解释自己遇到的问题,因此我尝试从收到的评论中获得最大的收益,现在我将发布经过修改的代码,以便伙计们如果您想提供帮助,则会更好地理解(代码>>单词)哈哈)。
注意:我根据本文A* algorithm
编写了算法答案 0 :(得分:0)
不确定要寻找什么。
首先,简单地观察一下:游戏板上您要切换的每个字段最多只能切换一次(两次切换一个字段不会执行任何操作)。
您可以采用一种非常糟糕的方法来创建2 ^ n个游戏状态(图形中的节点),其中n是游戏板上的字段数量。为什么这么糟糕?仅需花费O(2 ^ n)的时间和空间即可创建图形。在O(2 ^ n)时间内,您只需检查所有可能的移动(因为您想一次切换每个板),并立即告诉结果即可,而不用运行额外的A *。
更好的主意(?):让我们不要从整体上创建整个图形。您不想访问节点两次,因此应该将已访问的节点存储在某个位置(可能作为一组位掩码,您可以在其中检查节点中是否已经存在该节点)。然后,当您在某个节点中时,将检查所有邻居-切换一个字段后的游戏状态。如果已访问它们,请忽略它们,否则将它们添加到您的优先级队列中。然后从优先级队列中取出第一个节点,将其删除并“转到”它代表的游戏状态。
正如我所说,如果未切换第i个字段,则可以将游戏状态表示为第i个位置上大小为n-0的位掩码,否则为1。
那会比天真的方法更好吗?取决于您的启发式功能。我不知道哪个更好,您必须尝试一些并检查结果。在最坏的情况下,您的A *将检查每个节点,从而使复杂性比简单的暴力破解更为严重。如果幸运的话,它可能会大大加快速度。