私はチェスのようなゲームのAIを8 x 8グリッド上の2つのタイプのピースに基づいてプログラミングしています。このJavaツリーはどのように1000倍高速化できますか?
私はゲームでの可能な移動を表すminmaxツリーの種類を作りたいと思っています。白いプレイヤーが最初にプレイし、黒いプレイヤーが2番目にプレイしました。
私はこの呼び出しを再帰的に呼び出すgenerate()メソッドを持っています。私は可能な動きの約8レベルを表示することができる必要があります。最適化がなければ、この3つは8^8リーフです。
私は、グリッドが実際に計算されたかどうかを判断する単純なシステムを実装しました。そのシステムでは、計算された子参照を子が指すだけです。
私は私の説明が明確であるならば、私はあなたが理解することができるはずのコードの一部に参加するかわかりません。
実際には、私はすべての可能性の約3または4レベルを生成することができます。私はこれまで私が5秒未満でそれを計算できるようにしたいと思います8.
..
だから、みんなの思い、あなたは私のアルゴリズムを最適化するためのソリューションを見ていますか?
これはgenerate関数です。leftDiagonalMove()、rightDiagonalMove()およびfrontMove()は、移動が不正である場合はfalseを返し、移動が合法である場合はグリッド内のピースを移動してtrueを返します。
クローン()、それの「親」の同じプロパティを持つ新しいインスタンスを作成し、backMove()戻ったばかりの最後に移動するステップ。
public void generate(Node root, boolean white, int index) {
Grid grid = root.getGrid();
Stack<Piece> whitePieces = grid.getPiecesByColor(WHITE);
Stack<Piece> blackPieces = grid.getPiecesByColor(BLACK);
Node node;
String serial = "";
// white loop
for (int i = 0; i < whitePieces.size() && white; i++) {
Piece wPiece = whitePieces.get(i);
if (grid.leftDiagonalMove(wPiece)) {
serial = grid.getSerial();
if(!allGrids.containsKey(serial)){
node = new Node(grid.clone());
node.setMove(grid.getLastMove());
root.addChild(node); // add modified grid
allGrids.put(serial, node);
//actualGrid.display();
if (index < 5 && grid.getPosition(wPiece).x > 0)
generate(node, !white, index + 1);
actualGrid.backMove(); // back step to initial grid
}
else{
root.addChild(allGrids.get(serial));
}
}
if (grid.frontMove(wPiece)) {
// same code as leftMove
}
if (grid.rightDiagonalMove(wPiece)) {
// same code as leftMove
}
}
// black loop
for (int i = 0; i < blackPieces.size() && !white; i++) {
Piece bPiece = blackPieces.get(i);
if (grid.leftDiagonalMove(bPiece)) {
// same code as white loop and replacing wPiece by bPiece
}
if (grid.frontMove(bPiece)) {
// same code as white loop and replacing wPiece by bPiece
}
if (grid.rightDiagonalMove(bPiece)) {
// same code as white loop and replacing wPiece by bPiece
}
}
}
アプリケーションのプロファイルを作成するときに、ほとんどの時間を費やすのは何ですか? –
これにニューラルネットワークを使用してみませんか? – formatc
私が気づく一つの事は、あなたが 'ArrayList'からそれを引っ張っているたびに新しいオブジェクトを再作成することです。ピースの宣言をループ外に移動すると、メモリのフットプリントが削減され、ランタイムがいくらか改善されます。それ以外の場合は、Javaコードプロファイラを使用して、コードがどこからどのような理由で呼び出されているかを確認する方が良いでしょう。 – Makoto