私は1つのゲームを強要しています。私はすべてのポジションと結果に対してデータを格納する必要があります。データはおそらく数百GBのサイズになります。私はSQLを考えましたが、タイトなループで検索するとパフォーマンスが低下する恐れがあります。プログラムは可能な位置を反復し、既知の場合は勝利の動きを返し、すべての動きが失われていると分かっていれば最長の失われたシーケンスを返し、未知の動きについて結果をチェックする。大きなJavaマップを効率的に保存するにはどうすればよいですか?
大きなものを保存する最も良い方法は何ですかMap<Long,Long[]> positionIdToBestMoves
?私はSQLまたはデータのシリアル化を検討しています。
私はJavaで実行可能なすべての動きをブルートフォースで行いたいと思っています。ポジションの上限は約100億です。それらのほとんどは妥当ではない(すなわち、ゲームの始めに存在していたよりも多くの部分)。約10億は合理的な見積もりです。各Map<Long, Long[]> position
は、Long positionID
をLong whiteToMove
とLong blackToMove
にマッピングします。正の値は、ポジションが勝っていることを示し、値に格納されたポジションにつながる移動を選択する必要があります。負の値-n
は、位置が最大でもn
移動していることを意味します。あなたはChronicleを見てみたいことがあり
//this is a stub
private Map<Long, Long[]> boardBook =...
//assuming that all winning positions are known
public Long nextMove(Long currentPos, int whiteOrBlack){
Set<Long> validMoves = calculateValidMoves(currentPos, whiteOrBlack);
boolean hasWinner = checkIfValidMoveIsKnownToWin(validMoves, whiteOrBlack);
if(hasWinner){ //there is a winning move - play it
Long winningMove = getWinningMove(validMoves, whiteOrBlack);
boardBook.get(currentPos)[whiteOrBlack] = winningMove ;
return winningMove ;
}
boolean areAllPositionsKnown = checkIfAllPositionsKnown(validMoves, whiteOrBlack);
if(areAllPositionsKnown){ //all moves are losing.. choose longest struggle
Long longestSequenceToDefeat = findPositionToLongestSequenceToDefeat(validMoves, whiteOrBlack);
int numberOfStepsTodefeat = boardBook.get(longestSequenceToDefeat)[whiteOrBlack];
boardBook.get(currentPos)[whiteOrBlack] = longestSequenceToDefeat ;
return longestSequenceToDefeat;
}
Set<Long> movesToCheck = getUntestedMoves(validMoves, whiteOrBlack);
Long longeststruggle;
int maxNumberOfMovesToDefeat =-1;
for(Long moveTocheck : movesToCheck){
Long result = nextMove(moveToCheck, whiteOrBlack);
if(result>0){ //just discovered a winning move
boardBook.get(currentPos)[whiteOrBlack] = winningMove ;
return winningMove ;
}else {
int numOfMovesToDefeat = -1*boardBook.get(moveTocheck)[whiteOrBlack];
if(numOfMovesToDefeat >maxNumberOfMovesToDefeat){
maxNumberOfMovesToDefeat =numOfMovesToDefeat ;
longeststruggle = moveTocheck;
}
}
}
boardBook.get(currentPos)[whiteOrBlack] = -1*maxNumberOfMovesToDefeat;
return longeststruggle;
}
興味深い質問です。その答えは私のスキルを超えていますが、あなたが言うことは、伝統的なSQLではなく大きなデータ/ NoSQLソリューションの領域のように聞こえます。 – Gimby