Changeset 13267 for trunk/sources/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs
- Timestamp:
- 11/18/15 22:29:17 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.GeneticProgramming/3.3/Boolean/MultiplexerProblem.cs
r13238 r13267 40 40 41 41 #region parameter names 42 43 42 private const string NumberOfBitsParameterName = "NumberOfBits"; 44 45 43 #endregion 46 44 47 45 #region Parameter Properties 48 49 46 public IFixedValueParameter<IntValue> NumberOfBitsParameter { 50 47 get { return (IFixedValueParameter<IntValue>)Parameters[NumberOfBitsParameterName]; } 51 48 } 52 53 49 #endregion 54 50 55 51 #region Properties 56 57 52 public int NumberOfBits { 58 53 get { return NumberOfBitsParameter.Value.Value; } 59 54 set { NumberOfBitsParameter.Value.Value = value; } 60 55 } 61 62 63 56 #endregion 64 57 … … 105 98 public override double Evaluate(ISymbolicExpressionTree tree, IRandom random) { 106 99 if (NumberOfBits <= 0) throw new NotSupportedException("Number of bits must be larger than zero."); 107 if (NumberOfBits > 37) throw new NotSupportedException("Mu pltiplexer does not support problems with number of bits > 37.");100 if (NumberOfBits > 37) throw new NotSupportedException("Multiplexer does not support problems with number of bits > 37."); 108 101 var bs = Enumerable.Range(0, (int)Math.Pow(2, NumberOfBits)); 109 102 var addrBits = (int)Math.Log(NumberOfBits, 2); // largest power of two that fits into the number of bits … … 134 127 135 128 private static IEnumerable<bool> InterpretRec(ISymbolicExpressionTreeNode node, IEnumerable<int> bs, byte addrBits) { 136 Func<ISymbolicExpressionTreeNode, Func<bool, bool>, IEnumerable<bool>> eval1=129 Func<ISymbolicExpressionTreeNode, Func<bool, bool>, IEnumerable<bool>> unaryEval = 137 130 (child, f) => InterpretRec(child, bs, addrBits).Select(f); 138 Func<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode, Func<bool, bool, bool>, IEnumerable<bool>> eval2=131 Func<ISymbolicExpressionTreeNode, ISymbolicExpressionTreeNode, Func<bool, bool, bool>, IEnumerable<bool>> binaryEval = 139 132 (left, right, f) => InterpretRec(left, bs, addrBits).Zip(InterpretRec(right, bs, addrBits), f); 140 133 141 134 switch (node.Symbol.Name) { 142 case "AND": return eval2(node.GetSubtree(0), node.GetSubtree(1), (x, y) => x & y);143 case "OR": return eval2(node.GetSubtree(0), node.GetSubtree(1), (x, y) => x | y);144 case "NOT": return eval1(node.GetSubtree(0), (x) => !x);145 case "IF": return EvalIf(node.GetSubtree(0), node.GetSubtree(1), node.GetSubtree(2), bs, addrBits);135 case "AND": return binaryEval(node.GetSubtree(0), node.GetSubtree(1), (x, y) => x & y); 136 case "OR": return binaryEval(node.GetSubtree(0), node.GetSubtree(1), (x, y) => x | y); 137 case "NOT": return unaryEval(node.GetSubtree(0), (x) => !x); 138 case "IF": return EvalIf(node.GetSubtree(0), node.GetSubtree(1), node.GetSubtree(2), bs, addrBits); 146 139 default: { 147 140 if (node.Symbol.Name[0] == 'a') { … … 199 192 200 193 #region events 201 202 194 private void RegisterEventHandlers() { 203 195 NumberOfBitsParameter.Value.ValueChanged += (sender, args) => UpdateGrammar();
Note: See TracChangeset
for help on using the changeset viewer.