Added:
/src/bots/mctsbot/ai/bots/bot/gametree/tls/SimulatedGame.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/AbstractTLSNode.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/InnerNode.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/LeafNode.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/RootNode.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/TLSTree.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/strategies/selection/SelectionStrategy.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/strategies/selection/UCTPlusSelector.java
/src/bots/mctsbot/ai/bots/bot/gametree/tls/tests/Test.java
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/SimulatedGame.java Wed Apr
27 09:48:06 2011
@@ -0,0 +1,21 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls;
+
+import java.util.Stack;
+
+import bots.mctsbot.ai.bots.bot.gametree.action.SearchBotAction;
+
+/**
+ *
+ * @author thijs
+ *
+ * Class to keep track of the actions taken during selection and
simulation. This information is important to update tests during
backpropagation.
+ *
+ */
+public class SimulatedGame extends Stack<SearchBotAction> {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -628544300776476142L;
+
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/AbstractTLSNode.java
Wed Apr 27 09:48:06 2011
@@ -0,0 +1,75 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.nodes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import bots.mctsbot.ai.bots.bot.gametree.action.SearchBotAction;
+import bots.mctsbot.ai.bots.bot.gametree.tls.SimulatedGame;
+import
bots.mctsbot.ai.bots.bot.gametree.tls.strategies.selection.SelectionStrategy;
+import bots.mctsbot.ai.bots.bot.gametree.tls.tests.Test;
+
+public abstract class AbstractTLSNode {
+
+ protected AbstractTLSNode leftChild;
+ protected AbstractTLSNode rightChild;
+
+ private int nbSamples = 0;
+
+ private List<Test> possibleTests = new ArrayList<Test>();
+
+ public AbstractTLSNode(AbstractTLSNode parent) {
+ this.parent = parent;
+ }
+
+ private final AbstractTLSNode parent;
+
+ public AbstractTLSNode getLeftChild() {
+ return leftChild;
+ }
+
+ public AbstractTLSNode getRightChild() {
+ return rightChild;
+ }
+
+ public abstract AbstractTLSNode selectChild(SelectionStrategy strategy);
+
+ public AbstractTLSNode getParent() {
+ return parent;
+ }
+
+ public void backPropagate(double value, SimulatedGame game) {
+ SearchBotAction action = game.pop();
+ if (!isSplit()) {
+ for (Test test : possibleTests) {
+ test.updateStats(action, value);
+ }
+ }
+ }
+
+ protected boolean isSplit() {
+ return rightChild != null;
+ }
+
+ /**
+ * For now when a node is split, all information down the tree is lost.
+ */
+ public void split() {
+ leftChild = new LeafNode(getParent());
+ rightChild = new LeafNode(getParent());
+ }
+
+ public int getNbSamples() {
+ return nbSamples;
+ }
+
+ public double getEVStdDev() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public double getEV() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/InnerNode.java Wed Apr
27 09:48:06 2011
@@ -0,0 +1,16 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.nodes;
+
+import
bots.mctsbot.ai.bots.bot.gametree.tls.strategies.selection.SelectionStrategy;
+
+public class InnerNode extends AbstractTLSNode {
+
+ public InnerNode(AbstractTLSNode parent) {
+ super(parent);
+ }
+
+ @Override
+ public AbstractTLSNode selectChild(SelectionStrategy strategy) {
+ return strategy.select(this);
+ }
+
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/LeafNode.java Wed Apr
27 09:48:06 2011
@@ -0,0 +1,16 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.nodes;
+
+
+public class LeafNode extends InnerNode {
+
+ public TLSTree childTree;
+
+ public LeafNode(AbstractTLSNode parent) {
+ super(parent);
+ }
+
+ public void expand() {
+
+ }
+
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/RootNode.java Wed Apr
27 09:48:06 2011
@@ -0,0 +1,21 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.nodes;
+
+import
bots.mctsbot.ai.bots.bot.gametree.tls.strategies.selection.SelectionStrategy;
+
+public class RootNode extends AbstractTLSNode {
+
+ public final TLSTree tree;
+
+ public RootNode(TLSTree tree) {
+ super(null);
+ this.tree = tree;
+ this.leftChild = new LeafNode(this);
+ }
+
+ @Override
+ public AbstractTLSNode selectChild(SelectionStrategy strategy) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/nodes/TLSTree.java Wed Apr
27 09:48:06 2011
@@ -0,0 +1,17 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.nodes;
+
+import bots.mctsbot.common.elements.player.PlayerId;
+
+public class TLSTree {
+
+ public final PlayerId player;
+ public final RootNode root;
+ public final LeafNode parent;
+
+ public TLSTree(PlayerId player, LeafNode parent) {
+ this.player = player;
+ this.parent = parent;
+ root = new RootNode(this);
+ }
+
+}
=======================================
--- /dev/null
+++
/src/bots/mctsbot/ai/bots/bot/gametree/tls/strategies/selection/SelectionStrategy.java
Wed Apr 27 09:48:06 2011
@@ -0,0 +1,9 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.strategies.selection;
+
+import bots.mctsbot.ai.bots.bot.gametree.tls.nodes.AbstractTLSNode;
+
+public abstract class SelectionStrategy {
+
+ abstract public AbstractTLSNode select(AbstractTLSNode node);
+
+}
=======================================
--- /dev/null
+++
/src/bots/mctsbot/ai/bots/bot/gametree/tls/strategies/selection/UCTPlusSelector.java
Wed Apr 27 09:48:06 2011
@@ -0,0 +1,38 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.strategies.selection;
+
+import bots.mctsbot.ai.bots.bot.gametree.tls.nodes.AbstractTLSNode;
+
+public class UCTPlusSelector extends SelectionStrategy {
+
+ private final double C1;
+ private final double C2;
+
+ public UCTPlusSelector(double C1, double C2) {
+ this.C1 = C1;
+ this.C2 = C2;
+ }
+
+ @Override
+ public AbstractTLSNode select(AbstractTLSNode innerNode) {
+ AbstractTLSNode leftChild = innerNode.getLeftChild();
+ double leftValue = evaluate(innerNode.getLeftChild());
+
+ AbstractTLSNode rightChild = innerNode.getRightChild();
+ if (rightChild == null)
+ return leftChild;
+
+ if (evaluate(rightChild) >= leftValue)
+ return rightChild;
+
+ return leftChild;
+ }
+
+ protected double evaluate(AbstractTLSNode node) {
+ int nbSamples = node.getNbSamples();
+ if (nbSamples == 0)
+ return 0;
+ int nbParentSamples = node.getParent().getNbSamples();
+ double stdDev = node.getEVStdDev();
+ return node.getEV() + C1 * Math.sqrt(Math.log(nbParentSamples) /
nbSamples) + C2 * stdDev;
+ }
+}
=======================================
--- /dev/null
+++ /src/bots/mctsbot/ai/bots/bot/gametree/tls/tests/Test.java Wed Apr 27
09:48:06 2011
@@ -0,0 +1,12 @@
+package bots.mctsbot.ai.bots.bot.gametree.tls.tests;
+
+import bots.mctsbot.ai.bots.bot.gametree.action.SearchBotAction;
+
+public class Test {
+
+ public void updateStats(SearchBotAction action, double value) {
+ // TODO Auto-generated method stub
+
+ }
+
+}