Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/09/11 11:17:48 (14 years ago)
Author:
svonolfe
Message:

Implemented wiring (#1425)

Location:
branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/HeuristicLab.Algorithms.VariableNeighborhoodSearch-3.3.csproj

    r5622 r5642  
    108108  <ItemGroup>
    109109    <Compile Include="HeuristicLabAlgorithmsVariableNeighborhoodSearchPlugin.cs" />
     110    <Compile Include="IShakingOperator.cs" />
    110111    <Compile Include="Properties\AssemblyInfo.cs" />
    111112    <Compile Include="ShakingOperator.cs" />
  • branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/ShakingOperator.cs

    r5609 r5642  
    3838  [Item("ShakingOperator", "A shaking operator for VNS.")]
    3939  [StorableClass]
    40   public class ShakingOperator: CheckedMultiOperator<IManipulator> {
     40  public class ShakingOperator<T> : CheckedMultiOperator<T>, IShakingOperator where T : class, IManipulator {
    4141    public IValueLookupParameter<IntValue> IndexParameter {
    4242      get { return (ValueLookupParameter<IntValue>)Parameters["Index"]; }
     
    4949    [StorableConstructor]
    5050    protected ShakingOperator(bool deserializing) : base(deserializing) { }
    51     protected ShakingOperator(ShakingOperator original, Cloner cloner) : base(original, cloner) { }
     51    protected ShakingOperator(ShakingOperator<T> original, Cloner cloner) : base(original, cloner) { }
    5252    public override IDeepCloneable Clone(Cloner cloner) {
    53       return new ShakingOperator(this, cloner);
     53      return new ShakingOperator<T>(this, cloner);
    5454    }
    5555    public ShakingOperator()
     
    5757      Parameters.Add(new ValueLookupParameter<IntValue>("Index", "The index of the operator that should be applied (k)."));
    5858      Parameters.Add(new LookupParameter<BoolValue>("Continue", "True if k <= available operators."));
     59    }
     60
     61    public void Parameterize(IProblem problem) {
     62      Operators.Clear();
     63
     64      if (problem != null) {
     65        foreach (T manipulator in problem.Operators.OfType<T>().OrderBy(x => x.Name))
     66          Operators.Add(manipulator);
     67      }
    5968    }
    6069
  • branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearch.cs

    r5622 r5642  
    3939      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
    4040    }
    41     public /*Constrained*/ValueParameter<ISingleObjectiveEvaluator> EvaluatorParameter {
    42       get { return (/*Constrained*/ValueParameter<ISingleObjectiveEvaluator>)Parameters["Evaluator"]; }
    43     }
    4441    private ValueParameter<ILocalImprovement> LocalImprovementParameter {
    4542      get { return (ValueParameter<ILocalImprovement>)Parameters["LocalImprovement"]; }
    4643    }
    47     private ValueParameter<ShakingOperator> ShakingParameter {
    48       get { return (ValueParameter<ShakingOperator>)Parameters["Shaking"]; }
     44    private ValueParameter<IShakingOperator> ShakingParameter {
     45      get { return (ValueParameter<IShakingOperator>)Parameters["Shaking"]; }
    4946    }
    5047    private ValueParameter<IntValue> MaximumIterationsParameter {
     
    5350    private ValueParameter<MultiAnalyzer> AnalyzerParameter {
    5451      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
     52    }
     53    private VariableNeighborhoodSearchMainLoop VNSMainLoop {
     54      get { return FindMainLoop(SolutionsCreator.Successor); }
    5555    }
    5656    #endregion
     
    6060      get { return (RandomCreator)OperatorGraph.InitialOperator; }
    6161    }
    62     #endregion
     62    public MultiAnalyzer Analyzer {
     63      get { return AnalyzerParameter.Value; }
     64      set { AnalyzerParameter.Value = value; }
     65    }
     66    private SolutionsCreator SolutionsCreator {
     67      get { return (SolutionsCreator)RandomCreator.Successor; }
     68    }
     69    #endregion
     70
     71    [Storable]
     72    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
    6373
    6474    [StorableConstructor]
     
    7080    private VariableNeighborhoodSearch(VariableNeighborhoodSearch original, Cloner cloner)
    7181      : base(original, cloner) {
    72 
     82      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
     83      Initialize();
    7384    }
    7485    public override IDeepCloneable Clone(Cloner cloner) {
     
    7990      Parameters.Add(new ValueParameter<IntValue>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntValue(0)));
    8091      Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true)));
    81       Parameters.Add(new /*Constrained*/ValueParameter<ISingleObjectiveEvaluator>("Evaluator", "The operator used to evaluate the solutions."));
    8292      Parameters.Add(new ValueParameter<ILocalImprovement>("LocalImprovement", "The local improvement operation", new LocalSearchImprovement()));
    83       Parameters.Add(new ValueParameter<ShakingOperator>("Shaking", "The shaking operation", new ShakingOperator()));
     93      Parameters.Add(new ValueParameter<IShakingOperator>("Shaking", "The shaking operation"));
    8494      Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(1000)));
    8595      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze the solution and moves.", new MultiAnalyzer()));
     
    112122      mainLoop.LocalImprovementParameter.ActualName = LocalImprovementParameter.Name;
    113123      mainLoop.ShakingParameter.ActualName = ShakingParameter.Name;
    114       mainLoop.EvaluatorParameter.ActualName = EvaluatorParameter.Name;
    115124      mainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name;
    116125      mainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
     
    119128      mainLoop.EvaluatedSolutionsParameter.ActualName = "EvaluatedSolutions";
    120129
    121       /*Initialize();*/
    122     }
     130      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
     131      ParameterizeAnalyzers();
     132      UpdateAnalyzers();
     133
     134      Initialize();
     135    }
     136
     137    public override void Prepare() {
     138      if (Problem != null) base.Prepare();
     139    }
     140
     141    private void Initialize() {
     142      if (Problem != null) {
     143        Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     144      }
     145    }
     146
     147    #region Events
     148    protected override void OnProblemChanged() {
     149      ParameterizeStochasticOperator(Problem.SolutionCreator);
     150      ParameterizeStochasticOperator(Problem.Evaluator);
     151      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
     152      ParameterizeSolutionsCreator();
     153      ParameterizeVNSMainLoop();
     154      ParameterizeAnalyzers();
     155      ParameterizeIterationBasedOperators();
     156      UpdateShakingOperator();
     157      UpdateLocalImprovementOperator();
     158      UpdateAnalyzers();
     159      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     160      base.OnProblemChanged();
     161    }
     162
     163    protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
     164      ParameterizeStochasticOperator(Problem.SolutionCreator);
     165      ParameterizeSolutionsCreator();
     166      base.Problem_SolutionCreatorChanged(sender, e);
     167    }
     168    protected override void Problem_EvaluatorChanged(object sender, EventArgs e) {
     169      ParameterizeStochasticOperator(Problem.Evaluator);
     170      ParameterizeSolutionsCreator();
     171      ParameterizeVNSMainLoop();
     172      ParameterizeAnalyzers();
     173      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
     174      base.Problem_EvaluatorChanged(sender, e);
     175    }
     176    protected override void Problem_OperatorsChanged(object sender, EventArgs e) {
     177      foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op);
     178      ParameterizeIterationBasedOperators();
     179      UpdateShakingOperator();
     180      UpdateLocalImprovementOperator();
     181      UpdateAnalyzers();
     182      base.Problem_OperatorsChanged(sender, e);
     183    }
     184
     185    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
     186      ParameterizeVNSMainLoop();
     187      ParameterizeAnalyzers();
     188    }
     189    #endregion
     190
     191    #region Helpers
     192    private void ParameterizeSolutionsCreator() {
     193      SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
     194      SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
     195    }
     196    private void ParameterizeStochasticOperator(IOperator op) {
     197      if (op is IStochasticOperator)
     198        ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName;
     199    }
     200    private void ParameterizeVNSMainLoop() {
     201      VNSMainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
     202      VNSMainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
     203      VNSMainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
     204    }
     205    private void ParameterizeAnalyzers() {
     206      qualityAnalyzer.ResultsParameter.ActualName = "Results";
     207      if (Problem != null) {
     208        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
     209        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
     210        qualityAnalyzer.QualityParameter.Depth = 1;
     211        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
     212      }
     213    }
     214    private void ParameterizeIterationBasedOperators() {
     215      if (Problem != null) {
     216        foreach (IIterationBasedOperator op in Problem.Operators.OfType<IIterationBasedOperator>()) {
     217          op.IterationsParameter.ActualName = "OuterIterations";
     218          op.MaximumIterationsParameter.ActualName = "MaximumIterations";
     219        }
     220      }
     221    }
     222    private void UpdateShakingOperator() {
     223      Type manipulatorType = typeof(IManipulator);
     224      List<Type> manipulatorInterfaces = new List<Type>();
     225
     226      foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name)) {
     227        Type t = mutator.GetType();
     228        Type[] interfaces = t.GetInterfaces();
     229
     230        for(int i = 0; i < interfaces.Length; i++) {
     231          if (manipulatorType.IsAssignableFrom(interfaces[i])) {
     232            bool assignable = false;
     233            for (int j = 0; j < interfaces.Length; j++) {
     234              if (i != j && interfaces[i].IsAssignableFrom(interfaces[j])) {
     235                assignable = true;
     236                break;
     237              }
     238            }
     239
     240            if(!assignable)
     241              manipulatorInterfaces.Add(interfaces[i]);
     242          }         
     243        }
     244      }
     245
     246      foreach (Type manipulatorInterface in manipulatorInterfaces) {
     247        //manipulatorInterface is more specific
     248        if (manipulatorType.IsAssignableFrom(manipulatorInterface)) {
     249          //and compatible to all other found manipulator types
     250          bool compatible = true;
     251          foreach (Type manipulatorInterface2 in manipulatorInterfaces) {
     252            if (!manipulatorInterface.IsAssignableFrom(manipulatorInterface2)) {
     253              compatible = false;
     254              break;
     255            }
     256          }
     257
     258          if (compatible)
     259            manipulatorType = manipulatorInterface;
     260        }
     261      }
     262     
     263      Type genericType = typeof(ShakingOperator<>).MakeGenericType(manipulatorType);
     264      ShakingParameter.Value = (IShakingOperator)Activator.CreateInstance(genericType, new object[]{});
     265
     266      ShakingParameter.Value.Parameterize(Problem);
     267    }
     268    private void UpdateLocalImprovementOperator() {
     269      LocalImprovementParameter.Value.Parameterize(Problem);
     270    }
     271    private void UpdateAnalyzers() {
     272      Analyzer.Operators.Clear();
     273      if (Problem != null) {
     274        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>()) {
     275          foreach (IScopeTreeLookupParameter param in analyzer.Parameters.OfType<IScopeTreeLookupParameter>())
     276            param.Depth = 1;
     277          Analyzer.Operators.Add(analyzer);
     278        }
     279      }
     280      Analyzer.Operators.Add(qualityAnalyzer);
     281    }
     282    private VariableNeighborhoodSearchMainLoop FindMainLoop(IOperator start) {
     283      IOperator mainLoop = start;
     284      while (mainLoop != null && !(mainLoop is VariableNeighborhoodSearchMainLoop))
     285        mainLoop = ((SingleSuccessorOperator)mainLoop).Successor;
     286      if (mainLoop == null) return null;
     287      else return (VariableNeighborhoodSearchMainLoop)mainLoop;
     288    }
     289    #endregion
    123290  }
    124291}
  • branches/VNS/HeuristicLab.Algorithms.VariableNeighborhoodSearch/3.3/VariableNeighborhoodSearchMainLoop.cs

    r5622 r5642  
    7272      get { return (ValueLookupParameter<ILocalImprovement>)Parameters["LocalImprovement"]; }
    7373    }
    74     public ValueLookupParameter<ShakingOperator> ShakingParameter {
    75       get { return (ValueLookupParameter<ShakingOperator>)Parameters["Shaking"]; }
     74    public ValueLookupParameter<IShakingOperator> ShakingParameter {
     75      get { return (ValueLookupParameter<IShakingOperator>)Parameters["Shaking"]; }
    7676    }
    7777    #endregion
     
    103103      Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solutions."));
    104104      Parameters.Add(new ValueLookupParameter<ILocalImprovement>("LocalImprovement", "The local improvement operation."));
    105       Parameters.Add(new ValueLookupParameter<ShakingOperator>("Shaking", "The shaking operation."));
     105      Parameters.Add(new ValueLookupParameter<IShakingOperator>("Shaking", "The shaking operation."));
    106106      #endregion
    107107
     
    148148
    149149      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("OuterIterations", new IntValue(0)));
    150       variableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("Index", new DoubleValue(0)));
     150      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Index", new IntValue(0)));
    151151      variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("Continue", new BoolValue(false)));
    152152      variableCreator.CollectedValues.Add(new ValueParameter<BoolValue>("IsBetter", new BoolValue(false)));
     
    242242      #region Create operator graph
    243243      OperatorGraph.InitialOperator = variableCreator;
    244       variableCreator.Successor = analyzer1;
    245       analyzer1.Successor = subScopesProcessor0;
     244      variableCreator.Successor = subScopesProcessor0;
    246245      subScopesProcessor0.Operators.Add(bestQualityInitializer);
    247       subScopesProcessor0.Successor = resultsCollector1;
     246      subScopesProcessor0.Successor = analyzer1;
     247      analyzer1.Successor = resultsCollector1;
    248248      /////////
    249249      resultsCollector1.Successor = iteration;
Note: See TracChangeset for help on using the changeset viewer.