只是为了好玩,我正在尝试实现A *搜索谜题求解器。我想将到目前为止访问的所有州都保留为哈希。状态基本上是从0
到15
的整数的向量。 (我现在不会提供更多信息以免困扰这个难题。)
(defstruct posn
"A posn is a pair struct containing two integer for the row/col indices."
(row 0 :type fixnum)
(col 0 :type fixnum))
(defstruct state
"A state contains a vector and a posn describing the position of the empty slot."
(matrix '#(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0) :type simple-vector)
(empty-slot (make-posn :row 3 :col 3) :type posn))
因为似乎我必须检查大约100.000s的states
,我认为生成一些数字作为哈希键而不是直接使用状态会更有效,并且每次都需要使用equal
进行检查。] >
我开始是
(defun gen-hash-key (state) "Returns a unique(?) but simple hash key for STATE which is used for tracking if the STATE was already visited." (loop with matrix = (state-matrix state) for i from 1 for e across matrix summing (* i e)))
但必须了解,这不会导致真正独特的哈希键。例如。向量
'#(14 1 4 6 15 11 7 12 9 10 3 0 13 8 5 2))
和'#(15 14 1 6 9 0 4 12 10 11 7 3 13 8 5 2))
都将导致940
,从而导致A *搜索遗漏状态,从而破坏了我的整个想法。
在我继续以业余方式来调整计算之前,我想问问是否有人可以指出我一种有效生成真正唯一密钥的方法?我缺乏正规的CS教育,无法知道是否有生成此类密钥的标准方法。
只是为了好玩,我正在尝试实现A *搜索谜题求解器。我想将到目前为止访问的所有州都保留为哈希。状态基本上是一个从0到15的整数的矢量。(我不会...
可以用64位整数表示其值范围从0到15的16个整数:64位除以16表示每个数字4位,并且(expt 2 4)
为16。例如:
您不需要创建一些特殊的哈希键:该语言将为您完成!