diff --git a/src/net/woodyfolsom/msproj/GameConfig.java b/src/net/woodyfolsom/msproj/GameConfig.java index 7fa78e5..d4d7d61 100644 --- a/src/net/woodyfolsom/msproj/GameConfig.java +++ b/src/net/woodyfolsom/msproj/GameConfig.java @@ -2,17 +2,34 @@ package net.woodyfolsom.msproj; public class GameConfig { private double komi; + private int size; private int timeLimit; - public GameConfig() { + public GameConfig(int size) { timeLimit = 0; - komi = 0; + this.size = size; + switch(size) { + case 9 : + komi = 6.5; + default : + komi = 5.5; + } + } + + public GameConfig(GameConfig that) { + this.komi = that.komi; + this.size = that.size; + this.timeLimit = that.timeLimit; } public double getKomi() { return komi; } + public int getSize() { + return size; + } + public int getTimeLimit(){ return timeLimit; } @@ -21,6 +38,10 @@ public class GameConfig { this.komi = komi; } + public void setSize(int size) { + this.size = size; + } + public void setTimeLimit(int timeLimit) { this.timeLimit = timeLimit; } diff --git a/src/net/woodyfolsom/msproj/GameScore.java b/src/net/woodyfolsom/msproj/GameScore.java index fe08e32..e7557a9 100644 --- a/src/net/woodyfolsom/msproj/GameScore.java +++ b/src/net/woodyfolsom/msproj/GameScore.java @@ -2,22 +2,28 @@ package net.woodyfolsom.msproj; public class GameScore { - public static final int NORMALIZED_ZERO_SCORE = 379; - private double komi; private int blackScore; private int whiteScore; + private int normalizedZeroScore; - public GameScore(int blackScore, int whiteScore, double komi) { + public GameScore(int size) { + } + + public GameScore(int blackScore, int whiteScore, int size, double komi) { this.blackScore = blackScore; this.komi = komi; this.whiteScore = whiteScore; + this.normalizedZeroScore = size * size + ((int)(komi * 2)); } public double getBlackScore() { return (double)blackScore - komi; } + public int getNormalizedZeroScore() { + return normalizedZeroScore; + } /** * Gets a representation for the game score as an integer. Lower numbers are better for white. * The minimum value is 0 (Chinese scoring - white owns every intersection on 19x19 and has 9 stone komi). @@ -25,7 +31,7 @@ public class GameScore { * @return */ public int getAggregateScore() { - return NORMALIZED_ZERO_SCORE + 2 * blackScore - ((int)(2 * (whiteScore + komi))); + return normalizedZeroScore + 2 * blackScore - ((int)(2 * (whiteScore + komi))); } public double getScore(Player color) { @@ -43,10 +49,19 @@ public class GameScore { } public boolean isWinner(Player player) { + double blackScore = getBlackScore(); + double whiteScore = getWhiteScore(); + + /* This should work but is currently bugged if (Player.WHITE == player) { - return getWhiteScore() < NORMALIZED_ZERO_SCORE; + return getWhiteScore() < normalizedZeroScore; } else { - return getBlackScore() > NORMALIZED_ZERO_SCORE; + return getBlackScore() > normalizedZeroScore; + }*/ + if (Player.WHITE == player) { + return whiteScore > blackScore; + } else { + return blackScore > whiteScore; } } diff --git a/src/net/woodyfolsom/msproj/GameState.java b/src/net/woodyfolsom/msproj/GameState.java index 6f53b96..88d683f 100644 --- a/src/net/woodyfolsom/msproj/GameState.java +++ b/src/net/woodyfolsom/msproj/GameState.java @@ -7,10 +7,13 @@ public class GameState { private int blackPrisoners = 0; private int whitePrisoners = 0; private GameBoard gameBoard; + private GameConfig gameConfig; private Player playerToMove; private List moveHistory = new ArrayList(); - public GameState(int size) { + public GameState(GameConfig gameConfig) { + this.gameConfig = gameConfig; + int size = gameConfig.getSize(); if (size < 1 || size > 19) { throw new IllegalArgumentException("Invalid board size: " + size); } @@ -24,6 +27,7 @@ public class GameState { this.playerToMove = that.playerToMove; gameBoard = new GameBoard(that.gameBoard); moveHistory = new ArrayList(that.moveHistory); + this.gameConfig = new GameConfig(that.gameConfig); } public void clearBoard() { @@ -55,6 +59,10 @@ public class GameState { return gameBoard; } + public GameConfig getGameConfig() { + return gameConfig; + } + public Player getPlayerToMove() { return playerToMove; } diff --git a/src/net/woodyfolsom/msproj/GoGame.java b/src/net/woodyfolsom/msproj/GoGame.java index c876c63..2dc2c42 100644 --- a/src/net/woodyfolsom/msproj/GoGame.java +++ b/src/net/woodyfolsom/msproj/GoGame.java @@ -30,8 +30,8 @@ public class GoGame implements Runnable { .getName()); private boolean shutDown = false; - private GameConfig gameConfig = new GameConfig(); - private GameState gameState = new GameState(9); + private GameConfig gameConfig = new GameConfig(9); + private GameState gameState = new GameState(gameConfig); private GtpClient client = null; private Policy moveGenerator; private Properties properties; @@ -80,7 +80,7 @@ public class GoGame implements Runnable { public static void main(String[] args) throws IOException { configureLogging(); if (args.length == 0) { - Policy defaultMoveGenerator = new MonteCarloUCT(new RandomMovePolicy(), 5000L); + Policy defaultMoveGenerator = new MonteCarloUCT(new RandomMovePolicy(), 2000L); LOGGER.info("No MoveGenerator specified. Using default: " + defaultMoveGenerator.toString()); GoGame goGame = new GoGame(defaultMoveGenerator, PROPS_FILE); @@ -111,7 +111,7 @@ public class GoGame implements Runnable { } else if ("alphabeta".equals(policyName)) { return new AlphaBeta(); } else if ("montecarlo".equals(policyName)) { - return new MonteCarloUCT(new RandomMovePolicy(), 3000L); + return new MonteCarloUCT(new RandomMovePolicy(), 10000L); } else { LOGGER.info("Unable to create Policy for unsupported name: " + policyName); System.exit(INVALID_MOVE_GENERATOR); @@ -127,7 +127,8 @@ public class GoGame implements Runnable { localOutput.println("? Invalid command: " + cmd.getText() + "\n"); break; case boardsize: - gameState = new GameState(cmd.getIntField(1)); + gameConfig = new GameConfig(cmd.getIntField(1)); + gameState = new GameState(gameConfig); localOutput.println("=\n"); break; case clear_board: diff --git a/src/net/woodyfolsom/msproj/StateEvaluator.java b/src/net/woodyfolsom/msproj/StateEvaluator.java index 57ed496..80d957c 100644 --- a/src/net/woodyfolsom/msproj/StateEvaluator.java +++ b/src/net/woodyfolsom/msproj/StateEvaluator.java @@ -22,6 +22,6 @@ public class StateEvaluator { //TODO include komi from gameConfig return new GameScore(gameBoard.countSymbols(GameBoard.BLACK_STONE,GameBoard.BLACK_TERRITORY), - gameBoard.countSymbols(GameBoard.WHITE_STONE,GameBoard.WHITE_TERRITORY),gameConfig.getKomi()); + gameBoard.countSymbols(GameBoard.WHITE_STONE,GameBoard.WHITE_TERRITORY),gameState.getGameBoard().getSize(),gameConfig.getKomi()); } } \ No newline at end of file diff --git a/src/net/woodyfolsom/msproj/policy/MonteCarlo.java b/src/net/woodyfolsom/msproj/policy/MonteCarlo.java index 4ddf5b6..a54274a 100644 --- a/src/net/woodyfolsom/msproj/policy/MonteCarlo.java +++ b/src/net/woodyfolsom/msproj/policy/MonteCarlo.java @@ -6,7 +6,6 @@ import java.util.List; import net.woodyfolsom.msproj.Action; import net.woodyfolsom.msproj.GameConfig; import net.woodyfolsom.msproj.GameState; -import net.woodyfolsom.msproj.GoGame; import net.woodyfolsom.msproj.Player; import net.woodyfolsom.msproj.StateEvaluator; import net.woodyfolsom.msproj.tree.GameTreeNode; diff --git a/src/net/woodyfolsom/msproj/policy/MonteCarloUCT.java b/src/net/woodyfolsom/msproj/policy/MonteCarloUCT.java index 41cae45..11d6458 100644 --- a/src/net/woodyfolsom/msproj/policy/MonteCarloUCT.java +++ b/src/net/woodyfolsom/msproj/policy/MonteCarloUCT.java @@ -7,6 +7,7 @@ import java.util.Set; import net.woodyfolsom.msproj.Action; import net.woodyfolsom.msproj.GameConfig; +import net.woodyfolsom.msproj.GameScore; import net.woodyfolsom.msproj.GameState; import net.woodyfolsom.msproj.GoGame; import net.woodyfolsom.msproj.Player; @@ -30,8 +31,14 @@ public class MonteCarloUCT extends MonteCarlo { //From Kocsis and Szepesvari, the value of an actual terminal node is 0, so it will never be grown. double nodeVisits = node.getProperties().getVisits(); + Set actionsExplored = node.getActions(); + GameState gameState = node.getGameState(); - for (Action action : node.getActions()) { + Action randomNewChildAction = new RandomMovePolicy().getAction(node.getGameState().getGameConfig(), gameState, actionsExplored, gameState.getPlayerToMove()); + + //only descend to the best child if no new actions are available at this node + if (randomNewChildAction == Action.NONE) { + for (Action action : actionsExplored) { GameTreeNode childNode = node.getChild(action); double childScore; @@ -39,7 +46,7 @@ public class MonteCarloUCT extends MonteCarlo { childScore = 0.0; } else { MonteCarloProperties properties = childNode.getProperties(); - childScore = (double) (properties.getWins() / properties.getVisits()) + (2 * TUNING_CONSTANT * Math.sqrt(2 * Math.log(nodeVisits) / childNode.getProperties().getVisits())); + childScore = (double) (properties.getWins() / properties.getVisits()) + (TUNING_CONSTANT * Math.sqrt(Math.log(nodeVisits) / childNode.getProperties().getVisits())); } //TODO add random tie breaker? //otherwise the child that is selected first will be biased @@ -48,6 +55,7 @@ public class MonteCarloUCT extends MonteCarlo { bestNode = childNode; } } + } if (bestNode == node) { List> bestNodeList = new ArrayList>(); @@ -62,6 +70,7 @@ public class MonteCarloUCT extends MonteCarlo { public Action getBestAction(GameTreeNode node) { Action bestAction = Action.NONE; double bestScore = Double.NEGATIVE_INFINITY; + GameTreeNode bestChild = null; for (Action action : node.getActions()) { GameTreeNode childNode = node.getChild(action); @@ -72,9 +81,16 @@ public class MonteCarloUCT extends MonteCarlo { if (childScore >= bestScore) { bestScore = childScore; bestAction = action; + bestChild = childNode; } } + if (bestAction == Action.NONE) { + System.out.println("MonteCarloUCT failed - no actions were found for the current game staet (not even PASS)."); + } else { + System.out.println("Action " + bestAction + " selected for " + node.getGameState().getPlayerToMove() + " with simulated win ratio of " + (bestScore*100.0 + "%")); + System.out.println("It was visited " + bestChild.getProperties().getVisits() + " times out of " + node.getProperties().getVisits() + " rollouts among " + node.getNumChildren() + " valid actions from the current state."); + } return bestAction; } @@ -123,9 +139,18 @@ public class MonteCarloUCT extends MonteCarlo { numStateEvaluations++; - if (stateEvaluator.scoreGame(rolloutGameState).isWinner(player)) { + GameScore gameScore = stateEvaluator.scoreGame(rolloutGameState); + if (gameScore.isWinner(player)) { + System.out.println(); + System.out.println("Win for " + player + ":\n" + rolloutGameState); + System.out.println(gameScore.getScoreReport()); + System.out.println(); return 1; } else { + System.out.println(); + System.out.println("Loss for " + player + ":\n" + rolloutGameState); + System.out.println(gameScore.getScoreReport()); + System.out.println(); return 0; } } diff --git a/test/net/woodyfolsom/msproj/CaptureTest.java b/test/net/woodyfolsom/msproj/CaptureTest.java index b5de7dc..5d02c89 100644 --- a/test/net/woodyfolsom/msproj/CaptureTest.java +++ b/test/net/woodyfolsom/msproj/CaptureTest.java @@ -9,7 +9,8 @@ import org.junit.Test; public class CaptureTest { @Test public void testCapture() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B3")); gameState.playStone(Player.BLACK, Action.getInstance("B1")); @@ -28,8 +29,8 @@ public class CaptureTest { @Test public void testMultiGroupCapture() { - GameConfig gameConfig = new GameConfig(); - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B3")); @@ -59,7 +60,8 @@ public class CaptureTest { @Test public void testCaptureFromEye() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A1")); gameState.playStone(Player.BLACK, Action.getInstance("B2")); diff --git a/test/net/woodyfolsom/msproj/GameScoreTest.java b/test/net/woodyfolsom/msproj/GameScoreTest.java index 2c127c9..2dc91f1 100644 --- a/test/net/woodyfolsom/msproj/GameScoreTest.java +++ b/test/net/woodyfolsom/msproj/GameScoreTest.java @@ -10,19 +10,19 @@ public class GameScoreTest { @Test public void testGetAggregateScoreZero() { - GameScore gameScore = new GameScore(0,0,0); - assertEquals(GameScore.NORMALIZED_ZERO_SCORE, gameScore.getAggregateScore()); + GameScore gameScore = new GameScore(0,0,19,0); + assertEquals(gameScore.getNormalizedZeroScore(), gameScore.getAggregateScore()); } @Test public void testGetAggregateScoreBlackWinsNoKomi() { - GameScore gameScore = new GameScore(25,2,0); + GameScore gameScore = new GameScore(25,2,19,0); assertEquals(425, gameScore.getAggregateScore()); } @Test public void testGetAggregateScoreWhiteWinsWithKomi() { - GameScore gameScore = new GameScore(10,12,6.5); + GameScore gameScore = new GameScore(10,12,19,6.5); assertEquals(362, gameScore.getAggregateScore()); } } \ No newline at end of file diff --git a/test/net/woodyfolsom/msproj/GameStateTest.java b/test/net/woodyfolsom/msproj/GameStateTest.java index 95ff25b..9efe572 100644 --- a/test/net/woodyfolsom/msproj/GameStateTest.java +++ b/test/net/woodyfolsom/msproj/GameStateTest.java @@ -10,7 +10,8 @@ public class GameStateTest { @Test public void testGetEmptyCoords() { - GameState gameState = new GameState(3); + GameConfig gameConfig = new GameConfig(3); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, "A1"); gameState.playStone(Player.WHITE, "A2"); diff --git a/test/net/woodyfolsom/msproj/IllegalMoveTest.java b/test/net/woodyfolsom/msproj/IllegalMoveTest.java index 9e6f15d..739ed99 100644 --- a/test/net/woodyfolsom/msproj/IllegalMoveTest.java +++ b/test/net/woodyfolsom/msproj/IllegalMoveTest.java @@ -15,21 +15,24 @@ public class IllegalMoveTest { @Test public void testIllegalMoveOnOwnStone() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("B3")); assertFalse(gameState.playStone(Player.BLACK, Action.getInstance("B3"))); } @Test public void testIllegalMoveOnOtherStone() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("B3")); assertFalse(gameState.playStone(Player.WHITE, Action.getInstance("B3"))); } @Test public void testIllegalMoveNoLiberties() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B1")); gameState.playStone(Player.BLACK, Action.getInstance("B3")); @@ -41,7 +44,8 @@ public class IllegalMoveTest { @Test public void testIllegalMoveFormsTrappedGroup() { - GameState gameState = new GameState(9); + GameConfig gameConfig = new GameConfig(9); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A5")); gameState.playStone(Player.BLACK, Action.getInstance("B6")); gameState.playStone(Player.BLACK, Action.getInstance("B7")); @@ -53,7 +57,8 @@ public class IllegalMoveTest { @Test public void testIllegalMoveFormsTrappedGroup2() { - GameState gameState = new GameState(9); + GameConfig gameConfig = new GameConfig(9); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("G1")); gameState.playStone(Player.BLACK, Action.getInstance("H2")); gameState.playStone(Player.BLACK, Action.getInstance("H3")); @@ -72,7 +77,8 @@ public class IllegalMoveTest { @Test public void testIllegalMoveSuicide() { - GameState gameState = new GameState(3); + GameConfig gameConfig = new GameConfig(3); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A1")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); @@ -83,7 +89,7 @@ public class IllegalMoveTest { System.out.println("State before move: "); System.out.println(gameState); assertFalse("Play by BLACK at A2 should have failed.",gameState.playStone(Player.BLACK, Action.getInstance("A2"))); - List validMoves = new ValidMoveGenerator().getActions(new GameConfig(), gameState, Player.BLACK, ActionGenerator.ALL_ACTIONS); + List validMoves = new ValidMoveGenerator().getActions(gameConfig, gameState, Player.BLACK, ActionGenerator.ALL_ACTIONS); assertEquals(4, validMoves.size()); assertTrue(validMoves.contains(Action.PASS)); assertTrue(validMoves.contains(Action.getInstance("C1"))); diff --git a/test/net/woodyfolsom/msproj/LegalMoveTest.java b/test/net/woodyfolsom/msproj/LegalMoveTest.java index d0fe17b..e0830c5 100644 --- a/test/net/woodyfolsom/msproj/LegalMoveTest.java +++ b/test/net/woodyfolsom/msproj/LegalMoveTest.java @@ -8,7 +8,8 @@ import org.junit.Test; public class LegalMoveTest { @Test public void testLegalMove1Liberty() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); assertEquals(Player.WHITE, gameState.getPlayerToMove()); gameState.playStone(Player.WHITE, Action.PASS); @@ -26,7 +27,8 @@ public class LegalMoveTest { public void testLegalMove2Liberties() { //Unit test based on illegal move from 9x9 game using MonteCarloUCT //Illegal move detected by gokgs.com server - GameState gameState = new GameState(9); + GameConfig gameConfig = new GameConfig(9); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("G5")); gameState.playStone(Player.BLACK, Action.getInstance("G7")); gameState.playStone(Player.BLACK, Action.getInstance("F6")); diff --git a/test/net/woodyfolsom/msproj/StateEvaluatorTest.java b/test/net/woodyfolsom/msproj/StateEvaluatorTest.java index 6379642..a41f1e2 100644 --- a/test/net/woodyfolsom/msproj/StateEvaluatorTest.java +++ b/test/net/woodyfolsom/msproj/StateEvaluatorTest.java @@ -6,11 +6,11 @@ import static org.junit.Assert.assertTrue; import org.junit.Test; public class StateEvaluatorTest { - GameConfig gameConfig = new GameConfig(); - + @Test public void testScoreEmptyBoard() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); GameScore gameScore = new StateEvaluator(gameConfig) .scoreGame(gameState); @@ -20,7 +20,8 @@ public class StateEvaluatorTest { @Test public void testScoreFirstMove() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("B3")); GameScore gameScore = new StateEvaluator(gameConfig) @@ -34,7 +35,8 @@ public class StateEvaluatorTest { @Test public void testScoreTiedAtMove2() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("B3")); gameState.playStone(Player.WHITE, Action.getInstance("A1")); @@ -49,7 +51,8 @@ public class StateEvaluatorTest { @Test public void testScoreTerritory() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B3")); @@ -71,7 +74,8 @@ public class StateEvaluatorTest { @Test public void testCaptureAggScore() { - GameState gameState = new GameState(9); + GameConfig gameConfig = new GameConfig(9); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("C2")); @@ -86,7 +90,7 @@ public class StateEvaluatorTest { System.out.println(moveToA1); System.out.println(capAtB3); - StateEvaluator eval = new StateEvaluator(new GameConfig()); + StateEvaluator eval = new StateEvaluator(gameConfig); int scoreA1 = eval.scoreGame(moveToA1).getAggregateScore(); int scoreB3 = eval.scoreGame(capAtB3).getAggregateScore(); diff --git a/test/net/woodyfolsom/msproj/TerritoryFinderTest.java b/test/net/woodyfolsom/msproj/TerritoryFinderTest.java index 40c1894..e241e3c 100644 --- a/test/net/woodyfolsom/msproj/TerritoryFinderTest.java +++ b/test/net/woodyfolsom/msproj/TerritoryFinderTest.java @@ -5,7 +5,8 @@ import org.junit.Test; public class TerritoryFinderTest { @Test public void testMarkTerritory() { - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B3")); diff --git a/test/net/woodyfolsom/msproj/policy/AlphaBetaTest.java b/test/net/woodyfolsom/msproj/policy/AlphaBetaTest.java index 49c86d0..381e5d4 100644 --- a/test/net/woodyfolsom/msproj/policy/AlphaBetaTest.java +++ b/test/net/woodyfolsom/msproj/policy/AlphaBetaTest.java @@ -12,13 +12,14 @@ public class AlphaBetaTest { @Test public void testGenmoveAsW() { Policy treeSearch = new AlphaBeta(); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(6); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("C2")); gameState.playStone(Player.BLACK, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, Player.WHITE); + Action move = treeSearch.getAction(gameConfig, gameState, Player.WHITE); System.out.println(gameState); @@ -34,13 +35,14 @@ public class AlphaBetaTest { @Test public void testGenmoveAsB() { Policy treeSearch = new AlphaBeta(); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(6); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B1")); gameState.playStone(Player.BLACK, Action.getInstance("C2")); gameState.playStone(Player.WHITE, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, Player.BLACK); + Action move = treeSearch.getAction(gameConfig, gameState, Player.BLACK); System.out.println(gameState); diff --git a/test/net/woodyfolsom/msproj/policy/MinimaxTest.java b/test/net/woodyfolsom/msproj/policy/MinimaxTest.java index 0beea5d..bbd2393 100644 --- a/test/net/woodyfolsom/msproj/policy/MinimaxTest.java +++ b/test/net/woodyfolsom/msproj/policy/MinimaxTest.java @@ -12,13 +12,14 @@ public class MinimaxTest { @Test public void testGenmoveAsW() { Policy treeSearch = new Minimax(); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(6); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("C2")); gameState.playStone(Player.BLACK, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, + Action move = treeSearch.getAction(gameConfig, gameState, Player.WHITE); System.out.println(gameState); @@ -35,13 +36,14 @@ public class MinimaxTest { @Test public void testGenmoveAsB() { Policy treeSearch = new Minimax(); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(6); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B1")); gameState.playStone(Player.BLACK, Action.getInstance("C2")); gameState.playStone(Player.WHITE, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, + Action move = treeSearch.getAction(gameConfig, gameState, Player.BLACK); System.out.println(gameState); diff --git a/test/net/woodyfolsom/msproj/policy/MonteCarloUCTTest.java b/test/net/woodyfolsom/msproj/policy/MonteCarloUCTTest.java index 128fa3c..570a6a9 100644 --- a/test/net/woodyfolsom/msproj/policy/MonteCarloUCTTest.java +++ b/test/net/woodyfolsom/msproj/policy/MonteCarloUCTTest.java @@ -15,13 +15,14 @@ public class MonteCarloUCTTest { @Test public void testGenmoveAsW() { Policy treeSearch = new MonteCarloUCT(new RandomMovePolicy(),10000L); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(6); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("C2")); gameState.playStone(Player.BLACK, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, Player.WHITE); + Action move = treeSearch.getAction(gameConfig, gameState, Player.WHITE); System.out.println(gameState); @@ -37,13 +38,14 @@ public class MonteCarloUCTTest { @Test public void testGenmoveAsB() { Policy treeSearch = new MonteCarloUCT(new RandomMovePolicy(),10000L); - GameState gameState = new GameState(6); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("B1")); gameState.playStone(Player.BLACK, Action.getInstance("C2")); gameState.playStone(Player.WHITE, Action.getInstance("B2")); - Action move = treeSearch.getAction(new GameConfig(), gameState, Player.BLACK); + Action move = treeSearch.getAction(gameConfig, gameState, Player.BLACK); System.out.println(gameState); @@ -59,7 +61,8 @@ public class MonteCarloUCTTest { @Test public void testIllegalMoveRejection() { Policy treeSearch = new MonteCarloUCT(new RandomMovePolicy(),2000L); - GameState gameState = new GameState(4); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("C2")); @@ -68,7 +71,7 @@ public class MonteCarloUCTTest { Action move; for (int i = 0; i < 10; i++) { - move = treeSearch.getAction(new GameConfig(), gameState, Player.BLACK); + move = treeSearch.getAction(gameConfig, gameState, Player.BLACK); System.out.println("Generated move: " + move); GameState stateCopy = new GameState(gameState); stateCopy.playStone(Player.BLACK, move); diff --git a/test/net/woodyfolsom/msproj/policy/RandomTest.java b/test/net/woodyfolsom/msproj/policy/RandomTest.java index f849be4..cc35d99 100644 --- a/test/net/woodyfolsom/msproj/policy/RandomTest.java +++ b/test/net/woodyfolsom/msproj/policy/RandomTest.java @@ -20,17 +20,20 @@ public class RandomTest { @Test(expected = IllegalArgumentException.class) public void testGenmoveForNone() { Policy moveGenerator = new RandomMovePolicy(); - GameState gameState = new GameState(5); - moveGenerator.getAction(new GameConfig(), gameState, Player.BLACK); - gameState = new GameState(5); - moveGenerator.getAction(new GameConfig(), gameState, Player.WHITE); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); + moveGenerator.getAction(gameConfig, gameState, Player.BLACK); + gameConfig = new GameConfig(5); + gameState = new GameState(gameConfig); + moveGenerator.getAction(gameConfig, gameState, Player.WHITE); - assertEquals(Action.PASS, moveGenerator.getAction(new GameConfig(), gameState, Player.NONE)); + assertEquals(Action.PASS, moveGenerator.getAction(gameConfig, gameState, Player.NONE)); } @Test public void testAlternativeToIllegalMove() { - GameState gameState = new GameState(4); + GameConfig gameConfig = new GameConfig(4); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.BLACK, Action.getInstance("A1")); gameState.playStone(Player.BLACK, Action.getInstance("A2")); gameState.playStone(Player.BLACK, Action.getInstance("A3")); @@ -52,14 +55,15 @@ public class RandomTest { List prohibitedMoves = new ArrayList(); prohibitedMoves.add(Action.PASS); - assertEquals(Action.getInstance("B3"), new RandomMovePolicy().getAction(new GameConfig(), gameState, prohibitedMoves, Player.WHITE)); + assertEquals(Action.getInstance("B3"), new RandomMovePolicy().getAction(gameConfig, gameState, prohibitedMoves, Player.WHITE)); System.out.println(gameState); } @Test public void testIllegalMoveSuicide() { - GameState gameState = new GameState(3); + GameConfig gameConfig = new GameConfig(3); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A1")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); @@ -74,7 +78,7 @@ public class RandomTest { //There is only a minute chance (5E-7) that RandomMoveGenerator fails to return an invalid move with probability 1/4 //after 50 calls, if this bug recurs. for (int i = 0; i < 50; i++) { - Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.BLACK); + Action action = randomMovePolicy.getAction(gameConfig,gameState,Player.BLACK); //System.out.println(action); assertFalse("RandomMovePolicy returned illegal suicide move A2",action.equals(Action.getInstance("A2"))); } @@ -82,7 +86,8 @@ public class RandomTest { @Test public void testIllegalMoveKo() { - GameState gameState = new GameState(4); + GameConfig gameConfig = new GameConfig(4); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("A2")); @@ -101,7 +106,7 @@ public class RandomTest { RandomMovePolicy randomMovePolicy = new RandomMovePolicy(); //Test that after 50 moves, the policy never returns B3, which would be a Ko violation for (int i = 0; i < 50; i++) { - Action action = randomMovePolicy.getAction(new GameConfig(),gameState,Player.WHITE); + Action action = randomMovePolicy.getAction(gameConfig,gameState,Player.WHITE); //System.out.println(action); assertFalse(action.equals(Action.NONE)); assertFalse("RandomMovePolicy returned Ko violation move B3",action.equals(Action.getInstance("B3"))); diff --git a/test/net/woodyfolsom/msproj/policy/ValidMoveGeneratorTest.java b/test/net/woodyfolsom/msproj/policy/ValidMoveGeneratorTest.java index d2ec6af..c19b929 100644 --- a/test/net/woodyfolsom/msproj/policy/ValidMoveGeneratorTest.java +++ b/test/net/woodyfolsom/msproj/policy/ValidMoveGeneratorTest.java @@ -26,7 +26,8 @@ public class ValidMoveGeneratorTest { 1 . O . . . 1 A B C D E */ - GameState gameState = new GameState(5); + GameConfig gameConfig = new GameConfig(5); + GameState gameState = new GameState(gameConfig); gameState.playStone(Player.WHITE, Action.getInstance("A2")); gameState.playStone(Player.WHITE, Action.getInstance("B1")); gameState.playStone(Player.WHITE, Action.getInstance("B4")); @@ -34,7 +35,7 @@ public class ValidMoveGeneratorTest { assertFalse(gameState.playStone(Player.BLACK, Action.getInstance("A1"))); - List validMoves = new ValidMoveGenerator().getActions(new GameConfig(), gameState, Player.BLACK,0); + List validMoves = new ValidMoveGenerator().getActions(gameConfig, gameState, Player.BLACK,0); assertTrue(validMoves.size() > 0);