如何通过C#实现八数码的IDEA?
如何通过C#实现八数码的IDEA?
八数码是一个经典的人工智能难题,因为好的算法在八数码问题中将搜索的几种经典方法体现的淋漓尽致,经过几种算法的比较,我发现用迭带加深的启发示算法的效率最好,而且求得解为最优解.
开始实现时老是在查找Cloesd表时耗费时间,因此好多CASE都要算很长时间,最长竟达30分钟,后来将Cloesd存储在一个100000000大小的 字符数组中,这样,数组中每一个元素对应一个状态序列,有点类似哈希存储,别看这摸简单的哈希函数,它可是其中的英雄!,有了它判重的时间复杂度变为O(1),于是就使八数码的30多万的状态空间能在30秒中搜索完毕!下面是该函数:
publiclongGetHashValue(StateS)
{
return(S.A[0]*10000000+S.A[1]*1000000+S.A[2]*100000+S.A[3]*10000+S.A[4]*1000+S.A[5]*100+S.A[6]*10+S.A[7]*1);
}
{
return(S.A[0]*10000000+S.A[1]*1000000+S.A[2]*100000+S.A[3]*10000+S.A[4]*1000+S.A[5]*100+S.A[6]*10+S.A[7]*1);
}