我的问题是使用A *搜索的实现对三个列表中给出的字符串进行排序,因此我需要开发一个启发式函数来解决此问题的各种实例。
状态可以表示为3个列表的列表,例如:[[C B],[D],[H G F A E]]
我拿起任何堆叠的顶部并将其移动到任何其他堆栈。例如,上面的H可以移动到C或D的顶部,[HG]可以移动到第二个堆栈上以创建[HGD]等。在这个域中,有单位运营商成本,所以每个移动成本1,无论移动多少单词。
目标是采用块的初始配置,并从上到下按排序顺序将它们全部移动到左侧堆栈。例如,鉴于上例中的8个区块,目标是[[A B C D E F G H] [] []]。
我需要开发一种可以与A *搜索一起使用的启发式算法,以提高搜索效率。 我应该尽量保持你开发的启发式。为此,您可以尝试使用您的启发式方法来估算达到目标状态的剩余步数。
我认为启发式取决于每个堆栈中的排序单词,每个堆栈的点总和是状态的启发式,但这不是有效的,我认为我需要包含每个字母的ascii代码我的计算,任何想法?
答案 0 :(得分:0)
一开始,尝试一种简单或天真的启发式方法。例如,“h”将是两个字母的非递增顺序的总和。让我们说当你开发一个新的孩子时,你有这样的东西[ACBED]这里先拿一对[AC]它们按升序排列,什么都不做,但对于下一对[CB]它不是按升序排列然后加一个“H”。 [BE]很好。对于[ED],将一个添加到“h”。所以“h == 2”。这种启发式看起来很简单,但我相信它比盲目搜索(即广度/深度搜索)更好。根据这个想法,您可以添加更多规则,以根据您对结果的分析来增强启发式。我希望这很有用。