package net.demilich.metastone.game.behaviour.mcts; import java.util.ArrayList; import java.util.List; import net.demilich.metastone.game.GameContext; import net.demilich.metastone.game.Player; import net.demilich.metastone.game.actions.GameAction; import net.demilich.metastone.game.behaviour.Behaviour; import net.demilich.metastone.game.cards.Card; public class MonteCarloTreeSearch extends Behaviour { //private final static Logger logger = LoggerFactory.getLogger(MonteCarloTreeSearch.class); private static final int ITERATIONS = 500; @Override public String getName() { return "MCTS"; } @Override public List<Card> mulligan(GameContext context, Player player, List<Card> cards) { List<Card> discardedCards = new ArrayList<Card>(); for (Card card : cards) { if (card.getBaseManaCost() >= 4) { discardedCards.add(card); } } return discardedCards; } @Override public GameAction requestAction(GameContext context, Player player, List<GameAction> validActions) { if (validActions.size() == 1) { // logger.info("MCTS selected best action {}", validActions.get(0)); return validActions.get(0); } Node root = new Node(null, player.getId()); root.initState(context, validActions); UctPolicy treePolicy = new UctPolicy(); for (int i = 0; i < ITERATIONS; i++) { root.process(treePolicy); } GameAction bestAction = root.getBestAction(); // logger.info("MCTS selected best action {}", bestAction); return bestAction; } }