我很难找到匈牙利戒指谜题的可接受的启发式方法。我正在计划使用IDA *算法来解决并在Visual Basic中编写程序。我所缺乏的是如何实现拼图的实际解决方案。我已经将左右环都实现到它们自己的阵列中,并具有顺时针和逆时针旋转每个环的功能。我不是要求代码,只是在某个地方开始就是全部。
这是2个环阵列:
Dim leftRing(19) As Integer
' leftRing(16) is bottom intersection and leftRing(19) is top intersection
Dim rightRing(19) As Integer
' rightRing(4) is top intersection and rightRing(19) is bottom intersection
在数组中,我将以下内容存储为每种颜色的值: 红色值= 1黄色= 2蓝色= 3,黑色= 4
答案 0 :(得分:1)
我建议分别计算每个环中的“错误” - 需要更换多少个球以使环解决(1个9色,1个10色,9个单独的一个球)。最多可以使用旋转来固定两个球,然后需要另一个旋转来固定另外两个球。单独计算每个环的距离= 2n-1,其中n是不良位置的一半,并取其中较大的一个。您可以在查找错误数量最少的位置时迭代所有20个位置,但我认为有更好的方法来计算此指标(除了简单的修剪)。
更新: 与Gareth Reed的讨论指出了以下启发式:
对于每个戒指,请计算:
第二种启发式方法可分为三个部分:
取两个估计中较大的一个。请注意,您需要交替使用环,因此n次替换实际上需要2n-1次移动。如果两个估计值相等,或者较大的估计值与最新移动的环相等,则再添加一个。其中一个戒指不会因第一步而改善。
修剪所有旋转相同环的动作两次(假设允许大转动的移动指标)。这些已经被探索过了。
这应该避免所有大的局部最小值。