I'm currently working on a game, where I need to create a transposition table for my AI. I implemented Hashtable
so that the key
to the Hashtable is a state under consideration and its corresponding value
is the optimal next move.
However, when I save the Hashtable in Android's internal storage and restore it next time, it seems to have some saved data, but the keys
(i.e. game states) are different than the keys
I have saved in the previous instance.
Here is how I save and restore my data:
private void readTranspositionTableFromFile() {
FileInputStream fis = openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
transpositionTable = (Hashtable<BoardState, NextMove>) ois.readObject();
ois.close();
deleteFile(FILENAME);
}
private void writeTranspositionTableToFile() {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(transpositionTable);
oos.close();
}
I see no problem in my hashCode()
implementation, since it keeps returning same values for same states over and over.
I suspect saving/restoring the transposition table messes up my data because I logged the 2 runtimes and on the first one I got hashCode()
to return 3964 and 3029 for the 2 states that were to be added to the table. However, while reading the table from file, the hashCode()
returned 9119 twice.
Is there any problem in saving/restoring the data?
My serializing and hashing was completely fine. My program went something like this:
transpositionTable
transpositionTable
to internal storageHowever, after meticulous logging, I found that my transpositionTable
changed after step 2). This was because during step 1), I used
BoardState newKey = currentData.getBoardState();
and saved it to my transpositionTable
. Then in step 2), when my currentData
changed, my transpositionTable
changed accordingly. I tried using
BoardState newKey = currentData.getBoardState().clone();
but that didn't work either. Finally I had to assign each field of currentData.getBoardState()
to newKey
manually, which worked.