Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Vb6_Heuristics - Fatal编程技术网

Algorithm 匈牙利环拼图

Algorithm 匈牙利环拼图,algorithm,vb6,heuristics,Algorithm,Vb6,Heuristics,我很难为匈牙利环难题找到一个可接受的启发式方法。我计划用IDA*算法来解决这个问题,我正在用Visual Basic编写程序。我所缺少的只是如何实际解决这个难题。我已经将左环和右环实现到它们自己的数组中,并具有顺时针和逆时针旋转每个环的函数。我不是要代码,只是想找个地方开始 以下是2个环形阵列: Dim leftRing(19) As Integer ' leftRing(16) is bottom intersection and leftRing(19) is top intersecti

我很难为匈牙利环难题找到一个可接受的启发式方法。我计划用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

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

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

对于每个环,分别计算:

  • 颜色变化的次数。目标量为每环三次颜色变化,一次最多可消除四次颜色变化。这个指标的积分归Gareth
  • 不同颜色的计数,忽略它们的位置。应该有:10个10色的球,9个9色的球和一个9色的球。一次最多可以更改2种颜色
  • 第二种启发式可分为三部分:

  • 应该有10个10球和10个9球。超过十个的球需要更换
  • 应该只有一种颜色的10个球。轻微颜色的球需要更换
  • 应该只有一个9色的球。其他颜色的球需要更换。如果所有的球都是相同的颜色,并且9色球没有缺陷,则需要另外更换一个球
  • 取两者中较大的一个。请注意,您将需要交替使用环,因此实际上需要进行2n-1次移动才能进行n次替换。如果两个估计值相等,或者较大的估计值适用于最近移动的环,则添加一个附加的估计值。其中一个环在第一步不会得到改善

    修剪所有旋转同一圆环两次的移动(假设移动度量允许大旋转)。这些问题已经得到探讨

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

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

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

    对于每个环,分别计算:

  • 颜色变化的次数。目标量为每环三次颜色变化,一次最多可消除四次颜色变化。这个指标的积分归Gareth
  • 不同颜色的计数,忽略它们的位置。应该有:10个10色的球,9个9色的球和一个9色的球。一次最多可以更改2种颜色
  • 第二种启发式可分为三部分:

  • 应该有10个10球和10个9球。超过十个的球需要更换
  • 应该只有一种颜色的10个球。轻微颜色的球需要更换
  • 应该只有一个9色的球。其他颜色的球需要更换。如果所有的球都是相同的颜色,并且9色球没有缺陷,则需要另外更换一个球
  • 取两者中较大的一个。请注意,您将需要交替使用环,因此实际上需要进行2n-1次移动才能进行n次替换。如果两个估计值相等,或者较大的估计值适用于最近移动的环,则添加一个附加的估计值。其中一个环在第一步不会得到改善

    修剪所有旋转同一圆环两次的移动(假设移动度量允许大旋转)。这些问题已经得到探讨


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

    给我们展示一些工作。你说你想使用这个算法——你找到了它的部分伪代码了吗?展示“我已经将左环和右环都实现到了它们自己的数组中”的代码,这样回答起来就容易多了。你确定VB6吗?VS201x Express是免费下载的。主要问题是不知道从何处开始为程序制作启发式。如果我能得到一个起点,我可以从那里开始。我所拥有的只是一个基本的想法,如何解决一个难题不使用任何启发式。基本上把10个红色的球分成左环,然后把10个黑色的球分成右环,混合搭配黄色和蓝色,直到它们的顺序正确。给我们展示一些作品。你说你想使用这个算法——你找到了它的部分伪代码了吗?展示“我已经将左环和右环都实现到了它们自己的数组中”的代码,这样回答起来就容易多了。你确定VB6吗?VS201x Express是免费下载的。主要问题是不知道从何处开始为程序制作启发式。如果我能得到一个起点,我可以从那里开始。我所拥有的只是一个基本的想法,如何解决一个难题不使用任何启发式。基本上把10个红色分开