1

私は現在、AI の転置テーブルを作成する必要があるゲームに取り組んでいます。Hashtable への が検討中の状態であり、それに対応することが最適な次の手にHashtableなるように実装しました。keyvalue

しかし、Hashtable を Android の内部ストレージに保存して、次に復元すると、データが保存されているように見えますが、 (つまり、ゲームの状態) は、以前のインスタンスで保存したものとkeysは異なります。keys

データを保存して復元する方法は次のとおりです。

    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();
    }

hashCode()同じ状態に対して同じ値を何度も返し続けるため、実装に問題はありません。

転置テーブルを保存/復元すると、データが台無しになると思われます。これは、2 つのランタイムをログに記録し、最初のランタイムでhashCode()、テーブルに追加される 2 つの状態に対して 3964 と 3029 を返さなければならなかったためです。ただし、ファイルからテーブルを読み取るときに、hashCode()9119 が 2 回返されました。

データの保存・復元に問題はありませんか?

4

1 に答える 1

0

私のシリアル化とハッシュは完全に問題ありませんでした。私のプログラムは次のようになりました:

  1. 新しいキーと値のペアを追加transpositionTable
  2. 次の動きをする
  3. transpositionTable内部ストレージに保存

transpositionTableただし、細心の注意を払ってログを記録した後、手順 2) の後に変更されていることがわかりました。これは、ステップ 1) で使用したためです。

BoardState newKey = currentData.getBoardState();

そしてそれを私のに保存しましたtranspositionTable。次に、ステップ 2) で、mycurrentDataが変更されたときに、それに応じて mytranspositionTableが変更されました。使ってみた

BoardState newKey = currentData.getBoardState().clone();

しかし、それもうまくいきませんでした。currentData.getBoardState()最後に、各フィールドをnewKey手動で割り当てる必要がありましたが、うまくいきました。

于 2012-08-01T12:16:54.327 に答える