Free cookie consent management tool by TermsFeed Policy Generator

source: branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Grammar.cs @ 10011

Last change on this file since 10011 was 10011, checked in by jkarder, 11 years ago

#2069:

  • refactored grammar and symbols
  • fixed cloning and storable ctors
  • fixed plugin dependencies
File size: 8.7 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using HeuristicLab.Common;
23using HeuristicLab.Core;
24using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26
27namespace HeuristicLab.Problems.Robocode {
28  [StorableClass]
29  [Item("Robocode Grammar", "The grammar for the Robocode GP problem.")]
30  public class Grammar : SymbolicExpressionGrammar {
31    [StorableConstructor]
32    protected Grammar(bool deserializing) : base(deserializing) { }
33    protected Grammar(Grammar original, Cloner cloner) : base(original, cloner) { }
34
35    public Grammar()
36      : base("Robocode Grammar", "The grammar for the Robocode GP problem.") {
37      Initialize();
38    }
39
40    public override IDeepCloneable Clone(Cloner cloner) {
41      return new Grammar(this, cloner);
42    }
43
44    // initialize set of allowed symbols and define
45    // the allowed combinations of symbols
46    private void Initialize() {
47      #region Symbols
48      var block = new Block();
49      var stat = new Stat();
50      var ifStat = new IfStat();
51      var elseStat = new ElseStat();
52      var whileStat = new WhileStat();
53
54      var logicalExpr = new LogicalExpression();
55      var numericalExpr = new NumericalExpression();
56
57      var equal = new Equal();
58      var lessThan = new LessThan();
59      var lessThanOrEqual = new LessThanOrEqual();
60      var greaterThan = new GreaterThan();
61      var greaterThanOrEqual = new GreaterThanOrEqual();
62
63      var conjunction = new Conjunction();
64      var disjunction = new Disjunction();
65      var negation = new Negation();
66
67      var addition = new Addition();
68      var subtraction = new Subtraction();
69      var multiplication = new Multiplication();
70      var division = new Division();
71      var modulus = new Modulus();
72
73      var number = new Number();
74      var logicalVal = new LogicalValue();
75
76      var ahead = new Ahead();
77      var back = new Back();
78      var fire = new Fire();
79      var shotPower = new ShotPower();
80
81      var getEnergy = new GetEnergy();
82      var getGunHeading = new GetGunHeading();
83      var getHeading = new GetHeading();
84      var getRadarHeading = new GetRadarHeading();
85      var getX = new GetX();
86      var getY = new GetY();
87
88      //var setAdjustGunForRobotTurn = new SetAdjustGunForRobotTurn();
89      //var setAdjustRadarForGunTurn = new SetAdjustRadarForGunTurn();
90      //var setAdjustRadarForRobotTurn = new SetAdjustRadarForRobotTurn();
91      //var independent = new Independent();
92
93      var turnLeft = new TurnLeft();
94      var turnRight = new TurnRight();
95      var turnGunLeft = new TurnGunLeft();
96      var turnGunRight = new TurnGunRight();
97      var turnRadarLeft = new TurnRadarLeft();
98      var turnRadarRight = new TurnRadarRight();
99
100      var onBulletHit = new OnBulletHit();
101      var onBulletMissed = new OnBulletMissed();
102      var onHitByBullet = new OnHitByBullet();
103      var onHitRobot = new OnHitRobot();
104      var onHitWall = new OnHitWall();
105      var onScannedRobot = new OnScannedRobot();
106
107      var run = new Run();
108      var tank = new Tank();
109
110      var doNothing = new DoNothing();
111      var emptyEvent = new EmptyEvent();
112      #endregion
113
114      #region Symbol Collections
115      var eventSymbols = new ISymbol[] { onScannedRobot, onBulletHit, onBulletMissed, onHitByBullet, onHitRobot, onHitWall };
116      var controlSymbols = new ISymbol[] { ifStat, whileStat };
117      var functionSymbols = new ISymbol[] {
118        ahead, back, fire, turnGunLeft, turnGunRight, turnLeft, turnRadarLeft, turnRadarRight, turnRight
119        //setAdjustGunForRobotTurn, setAdjustRadarForGunTurn, setAdjustRadarForRobotTurn,
120      };
121      var relationalOperators = new ISymbol[] { equal, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual };
122      var logicalOperators = new ISymbol[] { conjunction, disjunction, negation };
123      var numericalExpressions = new ISymbol[] { number, getEnergy, getGunHeading, getHeading, getRadarHeading, getX, getY };
124      var numericalOperators = new ISymbol[] { addition, subtraction, multiplication, division, modulus };
125      #endregion
126
127      #region Adding Symbols
128      foreach (var s in eventSymbols)
129        AddSymbol(s);
130      foreach (var s in controlSymbols)
131        AddSymbol(s);
132      foreach (var s in functionSymbols)
133        AddSymbol(s);
134      foreach (var s in relationalOperators)
135        AddSymbol(s);
136      foreach (var s in logicalOperators)
137        AddSymbol(s);
138      foreach (var s in numericalExpressions)
139        AddSymbol(s);
140      foreach (var s in numericalOperators)
141        AddSymbol(s);
142
143      AddSymbol(block);
144      AddSymbol(stat);
145      AddSymbol(elseStat);
146      AddSymbol(shotPower);
147      AddSymbol(logicalVal);
148      AddSymbol(logicalExpr);
149      AddSymbol(numericalExpr);
150      AddSymbol(run);
151      AddSymbol(tank);
152      AddSymbol(emptyEvent);
153      AddSymbol(doNothing);
154      #endregion
155
156      #region Grammar Definition
157      // StartSymbol
158      AddAllowedChildSymbol(StartSymbol, tank);
159
160      // Tank
161      AddAllowedChildSymbol(tank, run, 0);
162      AddAllowedChildSymbol(tank, onScannedRobot, 1);
163      AddAllowedChildSymbol(tank, onBulletHit, 2);
164      AddAllowedChildSymbol(tank, onBulletMissed, 3);
165      AddAllowedChildSymbol(tank, onHitByBullet, 4);
166      AddAllowedChildSymbol(tank, onHitRobot, 5);
167      AddAllowedChildSymbol(tank, onHitWall, 6);
168
169      // Run
170      AddAllowedChildSymbol(run, stat);
171
172      // Event
173      foreach (var s in eventSymbols)
174        AddAllowedChildSymbol(s, stat);
175
176      // Block
177      AddAllowedChildSymbol(block, stat);
178
179      // Stat
180      AddAllowedChildSymbol(stat, stat);
181      AddAllowedChildSymbol(stat, block);
182      foreach (var s in controlSymbols)
183        AddAllowedChildSymbol(stat, s);
184      foreach (var s in functionSymbols)
185        AddAllowedChildSymbol(stat, s);
186      AddAllowedChildSymbol(stat, emptyEvent);
187      AddAllowedChildSymbol(stat, doNothing);
188
189      // IfStat
190      AddAllowedChildSymbol(ifStat, logicalExpr, 0);
191      AddAllowedChildSymbol(ifStat, stat, 1);
192      AddAllowedChildSymbol(ifStat, emptyEvent, 1);
193      AddAllowedChildSymbol(ifStat, doNothing, 1);
194      AddAllowedChildSymbol(ifStat, elseStat, 2);
195      AddAllowedChildSymbol(ifStat, emptyEvent, 2);
196      AddAllowedChildSymbol(ifStat, doNothing, 2);
197
198      // ElseStat
199      AddAllowedChildSymbol(elseStat, stat);
200      AddAllowedChildSymbol(elseStat, emptyEvent);
201      AddAllowedChildSymbol(elseStat, doNothing);
202
203      // WhileStat
204      AddAllowedChildSymbol(whileStat, logicalExpr, 0);
205      AddAllowedChildSymbol(whileStat, stat, 1);
206      AddAllowedChildSymbol(whileStat, emptyEvent, 1);
207      AddAllowedChildSymbol(whileStat, doNothing, 1);
208
209      // Numerical Expressions
210      foreach (var s in numericalExpressions)
211        AddAllowedChildSymbol(numericalExpr, s);
212      foreach (var s in numericalOperators) {
213        AddAllowedChildSymbol(numericalExpr, s);
214        foreach (var ne in numericalExpressions)
215          AddAllowedChildSymbol(s, ne);
216        foreach (var no in numericalOperators) {
217          AddAllowedChildSymbol(s, no);
218        }
219      }
220
221      // Logical Expressions
222      AddAllowedChildSymbol(logicalExpr, logicalVal);
223      foreach (var s in logicalOperators) {
224        AddAllowedChildSymbol(logicalExpr, s);
225        AddAllowedChildSymbol(s, logicalVal);
226        foreach (var lo in logicalOperators)
227          AddAllowedChildSymbol(s, lo);
228        foreach (var ro in relationalOperators)
229          AddAllowedChildSymbol(s, ro);
230      }
231      foreach (var s in relationalOperators)
232        AddAllowedChildSymbol(s, numericalExpr);
233
234      // Functions
235      foreach (var f in functionSymbols) {
236        if (f is Fire)
237          AddAllowedChildSymbol(f, shotPower);
238        else
239          AddAllowedChildSymbol(f, numericalExpr);
240      }
241      #endregion
242    }
243  }
244}
Note: See TracBrowser for help on using the repository browser.