1  using System.Diagnostics;


2  using HeuristicLab.Algorithms.Bandits;


3  using HeuristicLab.Algorithms.MonteCarloTreeSearch.Base;


4  using HeuristicLab.Algorithms.MonteCarloTreeSearch.Simulation;


5  using HeuristicLab.Problems.GrammaticalOptimization;


6  using System;


7  using System.Linq;


8  using System.Threading;


9 


10  namespace HeuristicLab.Algorithms.MonteCarloTreeSearch


11  {


12  public class MonteCarloTreeSearch_PruneLeaves : MonteCarloTreeSearch


13  {


14  public MonteCarloTreeSearch_PruneLeaves(ISymbolicExpressionTreeProblem problem, int maxLen, Random random, IBanditPolicy behaviourPolicy,


15  ISimulation simulationPolicy)


16  : base(problem, maxLen, random, behaviourPolicy, simulationPolicy)


17  {


18  }


19 


20  public override void Run(int maxIterations)


21  {


22  Reset();


23  int selections = 0;


24  TreeNode currentNode;


25  string phrase;


26  string simulatedPhrase;


27  double quality;


28  for (int i = 0; !StopRequested && i < maxIterations; i++)


29  {


30  currentNode = rootNode;


31 


32  while (!currentNode.IsLeaf())


33  {


34  int currentActionIndex = behaviourPolicy.SelectAction(random,


35  currentNode.GetChildActionInfos());


36  currentNode = currentNode.children[currentActionIndex];


37  //selections++;


38  //CheckSelection(currentNode, selections);


39  }


40 


41  phrase = currentNode.phrase;


42 


43  if (phrase.Length <= maxLen)


44  {


45  // Version 2:


46  if (currentNode.children != null && !currentNode.children.Any())


47  {


48  // already removed all child nodes so remove it too..


49  currentNode.parent.RemoveChildren(currentNode);


50  continue;


51  }


52  ExpandTreeNode(currentNode);


53  if (currentNode.children.Any())


54  {


55  currentNode =


56  currentNode.children[behaviourPolicy.SelectAction(random, currentNode.GetChildActionInfos())


57  ];


58  //selections++;


59  //CheckSelection(currentNode, selections);


60  }


61  else


62  {


63  // Version 2:


64  // remove currentNode from tree..


65  currentNode.parent.RemoveChildren(currentNode);


66  }


67  }


68  if (currentNode.phrase.Length <= maxLen)


69  {


70  quality = simulation.Simulate(currentNode, out simulatedPhrase);


71  OnSolutionEvaluated(simulatedPhrase, quality);


72 


73  Propagate(currentNode, quality);


74  }


75  }


76  }


77  }


78  }

