- Timestamp:
- 08/25/15 14:18:07 (9 years ago)
- 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 59 59 60 60 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); 62 62 63 63 if (node.Symbol is ProgramRootSymbol) { … … 65 65 } else if (node.Symbol is StartSymbol) { 66 66 return EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs); 67 } else if (node.Symbol is Left) {67 } else if (node.Symbol.Name == "Left") { 68 68 switch (mowerState.Heading) { 69 69 case Heading.East: mowerState.Heading = Heading.North; … … 78 78 } 79 79 return new Tuple<int, int>(0, 0); 80 } else if (node.Symbol is Forward) {80 } else if (node.Symbol.Name == "Forward") { 81 81 int dRow = 0; 82 82 int dCol = 0; … … 97 97 uint newRow = (uint)((mowerState.Position.Item1 + lawn.GetLength(0) + dRow) % lawn.GetLength(0)); 98 98 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); 100 100 mowerState.Energy = mowerState.Energy - 1; 101 101 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") { 107 104 var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs); 108 105 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") { 112 108 EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs); 113 109 return EvaluateLawnMowerProgram(node.GetSubtree(1), mowerState, lawn, adfs); 114 } else if (node.Symbol is Frog) {110 } else if (node.Symbol.Name == "Frog") { 115 111 var p = EvaluateLawnMowerProgram(node.GetSubtree(0), mowerState, lawn, adfs); 116 112 int x = p.Item1; … … 120 116 var newRow = (uint)((mowerState.Position.Item1 + x) % lawn.GetLength(0)); 121 117 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); 123 119 mowerState.Energy = mowerState.Energy - 1; 124 120 lawn[newRow, newCol] = true; 125 return new Tuple<int, int>(0, 0);121 return Tuple.Create(0, 0); 126 122 } else if (node.Symbol is InvokeFunction) { 127 123 var invokeNode = node as InvokeFunctionTreeNode; … … 147 143 return EvaluateLawnMowerProgram(functionDefinition.GetSubtree(0), mowerState, lawn, adfs); 148 144 } 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 } 150 155 } 151 156 }
Note: See TracChangeset
for help on using the changeset viewer.