Ben bir oyunu zorluyorum ve tüm pozisyonlar ve sonuçlar için veri depolamam gerekiyor. Veriler büyük olasılıkla yüzlerce Gb olacaktır. SQL'i düşündüm, ancak sıkı bir döngüde aramaların performansı azaltabileceğinden korkuyorum. Program olası pozisyonlar üzerinde yineleyecek ve eğer biliniyorsa kazanan hamleleri iade edecek, eğer tüm hamlelerin kaybedildiği biliniyorsa ve bilinmeyen hamlelerin sonucunu kontrol ederse, en uzun kaybetme sırasına dönün.Büyük bir Java haritasını verimli bir şekilde nasıl depolarsınız?
Büyük bir Map<Long,Long[]> positionIdToBestMoves
depolamanın en iyi yolu nedir? SQL veya veri serileştirmeyi düşünüyorum.
Java'daki tüm uygulanabilir hareketleri zorlayarak küçük denetleyicileri çözmek istiyorum. Pozisyonların üst sınırı 100 milyar civarındadır. Bunların çoğu makul değildir (yani oyunun başlangıcında mevcut olandan daha fazla parça). Yaklaşık 10 Milyar makul bir tahmindir. Her bir Map<Long, Long[]> position
, Long whiteToMove
ve Long blackToMove
ile Long positionID
haritaları. Pozitif değer, pozisyonun kazanıldığını ve değerde depolanan pozisyona götüren bir hareketin seçilmesi gerektiğini belirtir. Negatif değer -n
, konumun en fazla n
hamlesinde kaybediyor anlamına gelir.
//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;
}
İlgi çekici bir soru. Benim cevap verme yeteneğimin ötesinde ama anlattığınız şey, geleneksel SQL'den ziyade büyük bir veri/NoSQL çözümünün toprakları gibi daha çok ses çıkarır. – Gimby