Вот как можно изменить вашу предположительно почти равномерно случайную хеш-функцию, чтобы сместить ее таким образом, чтобы аналогичные позиции на плате с некоторой вероятностью встречались в ближайших хешах.
Пусть hash (gamestate) будет вашей существующей функцией. Мы создадим newhash (gamestate), который использует хэш для случайного поведения, но имеет достаточно высокую вероятность создания хэшей, которые находятся рядом друг с другом для тесно связанных состояний игры.
Пусть «цвет» состояния доски будет следующим игроком, который двинется. Если вы хотите найти ключ хеша для белого игрока, используйте newhash (board) = hash (board). Если вы хотите найти хеш для черной позиции, найдите черный фрагмент с максимальным числом в соответствии с вашим порядком, скажем, в позиции i. Удалите часть i из игрового состояния и вызовите измененное состояние probableparent. Затем используйте newhash (board) = hash (probableparent) + i. Если вы упорядочиваете позиции в соответствии с вероятным порядком размещения (более высокие позиции появляются позже в качестве критерия первого порядка, может быть, средние позиции появляются раньше в качестве второго критерия? Я не знаю хорошей стратегии для connect4), тогда вполне вероятно, что на белый ход до черного хода был вероятным родителем, и, следовательно, в вашем кэше, и, следовательно, я рядом. Кроме того, 8 возможных ходов черных, скорее всего, будут иметь одинаковое состояние prev_board и, следовательно, будут располагаться рядом с хеш-позициями.
Вы можете расширить эту идею для отката более чем одного слоя за раз. Скажем, если текущий ход% 3 == 2, удаляя максимум два хода в позициях доски i и j, а затем используйте newhash (board) = hash (board-two-removeals-ago) + i * 48 + j.