From 377dd54fca8bdf34ca7153f4d3c7c065cd095b63 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Mon, 16 Jan 2012 18:55:35 -0500 Subject: [PATCH] single-threaded monte carlo + some fixes --- .../mage/player/ai/ComputerPlayerMCTS.java | 95 ++++++++++++------ .../src/mage/player/ai/MCTSNode.java | 59 +++++++---- .../src/mage/player/ai/MCTSPlayer.java | 3 - Mage.Server/plugins/mage-player-aimcts.jar | Bin 27235 -> 27494 bytes 4 files changed, 106 insertions(+), 51 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java index 8462270e31e..edc2f617a7f 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/ComputerPlayerMCTS.java @@ -52,7 +52,8 @@ import org.apache.log4j.Logger; */ public class ComputerPlayerMCTS extends ComputerPlayer implements Player { - private static final int thinkTimeRatioThreshold = 20; + private static final int THINK_MIN_RATIO = 20; + private static final int THINK_MAX_RATIO = 100; protected transient MCTSNode root; protected int maxThinkTime; @@ -112,8 +113,10 @@ public class ComputerPlayerMCTS extends ComputerPlayer imple if (root != null) { MCTSNode newRoot = null; newRoot = root.getMatchingState(game.getState().getValue(false, game)); - if (newRoot != null) + if (newRoot != null) { newRoot.emancipate(); + logger.info("choose action:" + newRoot.getAction() + " success ratio: " + newRoot.getWinRatio()); + } else logger.info("unable to find matching state"); root = newRoot; @@ -258,28 +261,58 @@ public class ComputerPlayerMCTS extends ComputerPlayer imple logger.info("applyMCTS - Thinking for " + (endTime - startTime)/1000000000.0 + "s"); if (thinkTime > 0) { - List tasks = new ArrayList(); - for (int i = 0; i < cores; i++) { - Game sim = createMCTSGame(game); - MCTSPlayer player = (MCTSPlayer) sim.getPlayer(playerId); - player.setNextAction(action); - MCTSExecutor exec = new MCTSExecutor(sim, playerId, thinkTime); - tasks.add(exec); +// List tasks = new ArrayList(); +// for (int i = 0; i < cores; i++) { +// Game sim = createMCTSGame(game); +// MCTSPlayer player = (MCTSPlayer) sim.getPlayer(playerId); +// player.setNextAction(action); +// MCTSExecutor exec = new MCTSExecutor(sim, playerId, thinkTime); +// tasks.add(exec); +// } +// +// try { +// pool.invokeAll(tasks); +// } catch (InterruptedException ex) { +// logger.warn("applyMCTS interrupted"); +// } +// +// for (MCTSExecutor task: tasks) { +// root.merge(task.getRoot()); +// task.clear(); +// } +// tasks.clear(); + + MCTSNode current; + int simCount = 0; + while (true) { + long currentTime = System.nanoTime(); + if (currentTime > endTime) + break; + current = root; + + // Selection + while (!current.isLeaf()) { + current = current.select(this.playerId); + } + + int result; + if (!current.isTerminal()) { + // Expansion + current.expand(); + + // Simulation + current = current.select(this.playerId); + result = current.simulate(this.playerId); + simCount++; + } + else { + result = current.isWinner(this.playerId)?1:-1; + } + // Backpropagation + current.backpropagate(result); } - try { - pool.invokeAll(tasks); - } catch (InterruptedException ex) { - logger.warn("applyMCTS interrupted"); - } - - for (MCTSExecutor task: tasks) { - root.merge(task.getRoot()); - task.clear(); - } - tasks.clear(); - - logger.info("Created " + root.getNodeCount() + " nodes - size: " + root.size()); + logger.info("Simulated " + simCount + " games - nodes in tree: " + root.size()); displayMemory(); } @@ -287,32 +320,38 @@ public class ComputerPlayerMCTS extends ComputerPlayer imple return; } - //try to ensure that there are at least 20 simulations per node at all times + //try to ensure that there are at least THINK_MIN_RATIO simulations per node at all times private int calculateThinkTime(Game game, NextAction action) { int thinkTime = 0; int nodeSizeRatio = 0; if (root.getNumChildren() > 0) - nodeSizeRatio = root.size() / root.getNumChildren(); + nodeSizeRatio = root.getVisits() / root.getNumChildren(); logger.info("Ratio: " + nodeSizeRatio); PhaseStep curStep = game.getStep().getType(); if (action == NextAction.SELECT_ATTACKERS || action == NextAction.SELECT_BLOCKERS) { - if (nodeSizeRatio < thinkTimeRatioThreshold) { + if (nodeSizeRatio < THINK_MIN_RATIO) { thinkTime = maxThinkTime; } + else if (nodeSizeRatio >= THINK_MAX_RATIO) { + thinkTime = 0; + } else { thinkTime = maxThinkTime / 2; } } - else if (game.getActivePlayerId().equals(playerId) && (curStep == PhaseStep.PRECOMBAT_MAIN || curStep == PhaseStep.POSTCOMBAT_MAIN)) { - if (nodeSizeRatio < thinkTimeRatioThreshold) { + else if (game.getActivePlayerId().equals(playerId) && (curStep == PhaseStep.PRECOMBAT_MAIN || curStep == PhaseStep.POSTCOMBAT_MAIN) && game.getStack().isEmpty()) { + if (nodeSizeRatio < THINK_MIN_RATIO) { thinkTime = maxThinkTime; } + else if (nodeSizeRatio >= THINK_MAX_RATIO) { + thinkTime = 0; + } else { thinkTime = maxThinkTime / 2; } } else { - if (nodeSizeRatio < thinkTimeRatioThreshold) { + if (nodeSizeRatio < THINK_MIN_RATIO) { thinkTime = maxThinkTime / 2; } else { diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java index 578c18176e0..d339e3acb80 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSNode.java @@ -61,7 +61,6 @@ public class MCTSNode { private MCTSNode parent; private List children = new ArrayList(); private Ability action; -// private Combat combat; private Game game; private String stateValue; private UUID playerId; @@ -88,7 +87,6 @@ public class MCTSNode { this.game = game; this.stateValue = game.getState().getValue(false, game); this.parent = parent; -// this.combat = game.getCombat(); setPlayer(); nodeCount++; } @@ -140,7 +138,6 @@ public class MCTSNode { List abilities = player.getPlayableOptions(game); for (Ability ability: abilities) { Game sim = game.copy(); -// String simState = sim.getState().getValue(false, sim); // logger.info("expand " + ability.toString()); MCTSPlayer simPlayer = (MCTSPlayer) sim.getPlayer(player.getId()); simPlayer.activateAbility((ActivatedAbility)ability, sim); @@ -154,7 +151,6 @@ public class MCTSNode { UUID defenderId = game.getOpponents(player.getId()).iterator().next(); for (List attack: attacks) { Game sim = game.copy(); -// String simState = sim.getState().getValue(false, sim); MCTSPlayer simPlayer = (MCTSPlayer) sim.getPlayer(player.getId()); for (UUID attackerId: attack) { simPlayer.declareAttacker(attackerId, defenderId, sim); @@ -168,7 +164,6 @@ public class MCTSNode { List>> blocks = player.getBlocks(game); for (List> block: blocks) { Game sim = game.copy(); -// String simState = sim.getState().getValue(false, sim); MCTSPlayer simPlayer = (MCTSPlayer) sim.getPlayer(player.getId()); List groups = sim.getCombat().getGroups(); for (int i = 0; i < groups.size(); i++) { @@ -248,7 +243,10 @@ public class MCTSNode { } public void emancipate() { - this.parent = null; + if (parent != null) { + this.parent.children.remove(this); + this.parent = null; + } } public Ability getAction() { @@ -275,6 +273,16 @@ public class MCTSNode { return stateValue; } + public double getWinRatio() { + if (visits > 0) + return wins/(visits * 1.0); + return -1.0; + } + + public int getVisits() { + return visits; + } + /** * Copies game and replaces all players in copy with simulated players * Shuffles each players library so that there is no knowledge of its order @@ -289,26 +297,37 @@ public class MCTSNode { Player origPlayer = game.getState().getPlayers().get(copyPlayer.getId()).copy(); SimulatedPlayerMCTS newPlayer = new SimulatedPlayerMCTS(copyPlayer.getId(), true); newPlayer.restore(origPlayer); - if (!newPlayer.getId().equals(playerId)) { - int handSize = newPlayer.getHand().size(); - newPlayer.getLibrary().addAll(newPlayer.getHand().getCards(sim), sim); - newPlayer.getHand().clear(); - newPlayer.getLibrary().shuffle(); - for (int i = 0; i < handSize; i++) { - Card card = newPlayer.getLibrary().removeFromTop(sim); - sim.setZone(card.getId(), Zone.HAND); - newPlayer.getHand().add(card); - } - } - else { - newPlayer.getLibrary().shuffle(); - } sim.getState().getPlayers().put(copyPlayer.getId(), newPlayer); } + randomizePlayers(sim, playerId); sim.setSimulation(true); return sim; } + /* + * Shuffles each players library so that there is no knowledge of its order + * Swaps all other players hands with random cards from the library so that + * there is no knowledge of what cards are in opponents hands + */ + protected void randomizePlayers(Game game, UUID playerId) { + for (Player player: game.getState().getPlayers().values()) { + if (!player.getId().equals(playerId)) { + int handSize = player.getHand().size(); + player.getLibrary().addAll(player.getHand().getCards(game), game); + player.getHand().clear(); + player.getLibrary().shuffle(); + for (int i = 0; i < handSize; i++) { + Card card = player.getLibrary().removeFromTop(game); + game.setZone(card.getId(), Zone.HAND); + player.getHand().add(card); + } + } + else { + player.getLibrary().shuffle(); + } + } + } + public boolean isTerminal() { return game.isGameOver(); } diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java index 24e482a8166..0760ba32440 100644 --- a/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/src/mage/player/ai/MCTSPlayer.java @@ -28,16 +28,13 @@ package mage.player.ai; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.common.PassAbility; import mage.abilities.costs.mana.GenericManaCost; import mage.game.Game; -import mage.game.combat.Combat; import mage.game.permanent.Permanent; import org.apache.log4j.Logger; diff --git a/Mage.Server/plugins/mage-player-aimcts.jar b/Mage.Server/plugins/mage-player-aimcts.jar index 65749101e2554f91cd8bcd52400e2d5a6f8c40e9..b6ab68d2a9bd6e281607696fb48a9cf22475bfad 100644 GIT binary patch delta 16956 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 BRM7wc delta 16702 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