Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/25/15 14:18:07 (9 years ago)
Author:
gkronber
Message:

#2422: ported lawn mower problem to use BasicProblem and SymbolicExpressionTreeEncoding

Location:
trunk/sources/HeuristicLab.Problems.LawnMower/3.4
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.LawnMower/3.4/Interpreter.cs

    r12012 r12899  
    5959
    6060    private static Tuple<int, int> EvaluateLawnMowerProgram(ISymbolicExpressionTreeNode node, MowerState mowerState, bool[,] lawn, IEnumerable<ISymbolicExpressionTreeNode> adfs) {
    61       if (mowerState.Energy <= 0) return new Tuple<int, int>(0, 0);
     61      if (mowerState.Energy <= 0) return Tuple.Create(0, 0);
    6262
    6363      if (node.Symbol is ProgramRootSymbol) {
     
    6565      } else if (node.Symbol is StartSymbol) {
    6666        return EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
    67       } else if (node.Symbol is Left) {
     67      } else if (node.Symbol.Name == "Left") {
    6868        switch (mowerState.Heading) {
    6969          case Heading.East: mowerState.Heading = Heading.North;
     
    7878        }
    7979        return new Tuple<int, int>(0, 0);
    80       } else if (node.Symbol is Forward) {
     80      } else if (node.Symbol.Name == "Forward") {
    8181        int dRow = 0;
    8282        int dCol = 0;
     
    9797        uint newRow = (uint)((mowerState.Position.Item1 + lawn.GetLength(0) + dRow) % lawn.GetLength(0));
    9898        uint newColumn = (uint)((mowerState.Position.Item2 + lawn.GetLength(1) + dCol) % lawn.GetLength(1));
    99         mowerState.Position = new Tuple<uint, uint>(newRow, newColumn);
     99        mowerState.Position = Tuple.Create(newRow, newColumn);
    100100        mowerState.Energy = mowerState.Energy - 1;
    101101        lawn[newRow, newColumn] = true;
    102         return new Tuple<int, int>(0, 0);
    103       } else if (node.Symbol is Constant) {
    104         var constNode = node as ConstantTreeNode;
    105         return constNode.Value;
    106       } else if (node.Symbol is Sum) {
     102        return Tuple.Create(0, 0);
     103      } else if (node.Symbol.Name == "Sum") {
    107104        var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
    108105        var q = EvaluateLawnMowerProgram(node.GetSubtree(1), mowerState, lawn, adfs);
    109         return new Tuple<int, int>(p.Item1 + q.Item1,
    110           p.Item2 + q.Item2);
    111       } else if (node.Symbol is Prog) {
     106        return Tuple.Create(p.Item1 + q.Item1, p.Item2 + q.Item2);
     107      } else if (node.Symbol.Name == "Prog") {
    112108        EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
    113109        return EvaluateLawnMowerProgram(node.GetSubtree(1), mowerState, lawn, adfs);
    114       } else if (node.Symbol is Frog) {
     110      } else if (node.Symbol.Name == "Frog") {
    115111        var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs);
    116112        int x = p.Item1;
     
    120116        var newRow = (uint)((mowerState.Position.Item1 + x) % lawn.GetLength(0));
    121117        var newCol = (uint)((mowerState.Position.Item2 + y) % lawn.GetLength(1));
    122         mowerState.Position = new Tuple<uint, uint>(newRow, newCol);
     118        mowerState.Position = Tuple.Create(newRow, newCol);
    123119        mowerState.Energy = mowerState.Energy - 1;
    124120        lawn[newRow, newCol] = true;
    125         return new Tuple<int, int>(0, 0);
     121        return Tuple.Create(0, 0);
    126122      } else if (node.Symbol is InvokeFunction) {
    127123        var invokeNode = node as InvokeFunctionTreeNode;
     
    147143        return EvaluateLawnMowerProgram(functionDefinition.GetSubtree(0), mowerState, lawn, adfs);
    148144      } else {
    149         throw new ArgumentException("Invalid symbol in the lawn mower program.");
     145        // try to parse as ephemeral random const with format: "x,y" (x, y in [0..32[)
     146        int x, y;
     147        var tokens = node.Symbol.Name.Split(',');
     148        if (tokens.Length == 2 &&
     149            int.TryParse(tokens[0], out x) &&
     150            int.TryParse(tokens[1], out y)) {
     151          return Tuple.Create(x, y);
     152        } else {
     153          throw new ArgumentException("Invalid symbol in the lawn mower program.");
     154        }
    150155      }
    151156    }
Note: See TracChangeset for help on using the changeset viewer.