Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.SimOpt/SimOptSquentialSubOperatorCrossover.cs @ 1009

Last change on this file since 1009 was 637, checked in by abeham, 16 years ago

[trunk] Redesigned and simplified SimOpt according to ticket #291

File size: 5.1 KB
RevLine 
[591]1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 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 System;
[584]23using System.Collections.Generic;
24using System.Linq;
25using System.Text;
[637]26using System.Xml;
[584]27using HeuristicLab.Core;
28using HeuristicLab.Data;
[637]29using HeuristicLab.Operators;
30using HeuristicLab.Selection;
[584]31
32namespace HeuristicLab.SimOpt {
33  public class SimOptSquentialSubOperatorCrossover : OperatorBase {
[637]34    private UniformSequentialSubScopesProcessor usssp, usssp2, usssp3, usssp4;
35    private SequentialSubScopesProcessor sssp;
36    private SimOptParameterExtractor extractor;
37    private SimOptParameterPacker packer;
38    private SimOptCrossoverPreparator preparator;
39    private MergingReducer merger;
40    private bool uptodate;
41
[584]42    public override string Description {
[637]43      get {
44        return @"This operator encapsulates the functionality of crossing the parameters of a simulation parameter vector. It works as follows:
451. The parameters of all parents are extracted [UniformSequentialSubScopeProcessor which applies a SimOptParameterExtractor]
462. The parents are prepared for crossing by grouping the respective parameters [SimOptCrossoverPreparator]
473. The parameters are crossed [UniformSequentialSubScopeProcessor which applies SequentialSubScopeProcessor which applies the SubOperators of this operator on each parameter group (except for the last one)]
484. Assigning the crossed parameters to the respective children [MergingReducer]
495. Update the parameters [UniformSequentialSubScopeProcessor which applies SimOptParameterPacker]
50
51Should the packing fail due to constraint violations, the operator will execute the last of its suboperators.";
52      }
[584]53    }
54
55    public SimOptSquentialSubOperatorCrossover()
56      : base() {
57      AddVariableInfo(new VariableInfo("Items", "The parameter vector", typeof(ConstrainedItemList), VariableKind.In | VariableKind.New));
58      AddVariableInfo(new VariableInfo("Parents", "The number of parents per child", typeof(IntData), VariableKind.In));
[637]59      uptodate = false;
[584]60    }
61
62    public override IOperation Apply(IScope scope) {
[637]63      string itemsActualName = GetVariableInfo("Items").ActualName;
64      string parentsActualName = GetVariableInfo("Parents").ActualName;
65      int parameters = SubOperators.Count - 1;
[584]66
[637]67      if (!uptodate) {
68        usssp = new UniformSequentialSubScopesProcessor();
69        extractor = new SimOptParameterExtractor();
70        usssp.AddSubOperator(extractor);
[584]71
[637]72        preparator = new SimOptCrossoverPreparator();
73
74        usssp2 = new UniformSequentialSubScopesProcessor();
75        sssp = new SequentialSubScopesProcessor();
76        for (int i = 0; i < parameters; i++) {
77          sssp.AddSubOperator(SubOperators[i]);
[584]78        }
[637]79        usssp2.AddSubOperator(sssp);
80
81        usssp3 = new UniformSequentialSubScopesProcessor();
82        merger = new MergingReducer();
83        usssp3.AddSubOperator(merger);
84
85        usssp4 = new UniformSequentialSubScopesProcessor();
86        packer = new SimOptParameterPacker();
87        packer.AddSubOperator(SubOperators[SubOperators.Count - 1]);
88        usssp4.AddSubOperator(packer);
89        uptodate = true;
[584]90      }
[637]91      // Setting the actual names is necessary as the operator does not know if they've changed
92      extractor.GetVariableInfo("Items").ActualName = itemsActualName;
93      preparator.GetVariableInfo("Parents").ActualName = parentsActualName;
94      packer.GetVariableInfo("Items").ActualName = itemsActualName;
95
96      CompositeOperation co = new CompositeOperation();
97      co.AddOperation(new AtomicOperation(usssp, scope));
98      co.AddOperation(new AtomicOperation(preparator, scope));
99      co.AddOperation(new AtomicOperation(usssp2, scope));
100      co.AddOperation(new AtomicOperation(usssp3, scope));
101      co.AddOperation(new AtomicOperation(usssp4, scope));
[584]102      return co;
103    }
[637]104
105    protected override void OnSubOperatorAdded(IOperator subOperator, int index) {
106      base.OnSubOperatorAdded(subOperator, index);
107      uptodate = false;
108    }
109
110    protected override void OnSubOperatorRemoved(IOperator subOperator, int index) {
111      base.OnSubOperatorRemoved(subOperator, index);
112      uptodate = false;
113    }
114
115    public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
116      base.Populate(node, restoredObjects);
117      uptodate = false;
118    }
[584]119  }
120}
Note: See TracBrowser for help on using the repository browser.