匈牙利戒指拼图

时间:2012-09-17 21:04:05

标签: algorithm vb6 heuristics

我很难找到匈牙利戒指谜题的可接受的启发式方法。我正在计划使用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

1 个答案:

答案 0 :(得分:1)

我建议分别计算每个环中的“错误” - 需要更换多少个球以使环解决(1个9色,1个10色,9个单独的一个球)。最多可以使用旋转来固定两个球,然后需要另一个旋转来固定另外两个球。单独计算每个环的距离= 2n-1,其中n是不良位置的一半,并取其中较大的一个。您可以在查找错误数量最少的位置时迭代所有20个位置,但我认为有更好的方法来计算此指标(除了简单的修剪)。

更新: 与Gareth Reed的讨论指出了以下启发式:

对于每个戒指,请计算:

  1. 颜色变化的数量。目标量是每个环三个颜色变化,并且一次最多可以消除四个颜色变化。积分将转至Gareth以获取此指标。
  2. 不同颜色的数量,忽略了它们的位置。应该有:一个10色的10个球,一个9色的9个球和另一个9色的一个球。一次最多可以更改2种颜色。
  3. 第二种启发式方法可分为三个部分:

    1. 应该有10个10球和10个9球。超过十的球需要更换。
    2. 应该只有一种颜色的10球。需要更换次要颜色的球。
    3. 应该只有一个9色的球。其他颜色的球需要更换。如果所有颜色相同,并且9色不缺,则需要更换一个额外的球。
    4. 取两个估计中较大的一个。请注意,您需要交替使用环,因此n次替换实际上需要2n-1次移动。如果两个估计值相等,或者较大的估计值与最新移动的环相等,则再添加一个。其中一个戒指不会因第一步而改善。

      修剪所有旋转相同环的动作两次(假设允许大转动的移动指标)。这些已经被探索过了。

      这应该避免所有大的局部最小值。