//#region License Information ///* HeuristicLab // * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL) // * // * This file is part of HeuristicLab. // * // * HeuristicLab is free software: you can redistribute it and/or modify // * it under the terms of the GNU General Public License as published by // * the Free Software Foundation, either version 3 of the License, or // * (at your option) any later version. // * // * HeuristicLab is distributed in the hope that it will be useful, // * but WITHOUT ANY WARRANTY; without even the implied warranty of // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // * GNU General Public License for more details. // * // * You should have received a copy of the GNU General Public License // * along with HeuristicLab. If not, see . // */ //#endregion //using System; //using System.Collections.Generic; //using System.Text; //using System.Linq; //using HeuristicLab.Core; //using HeuristicLab.Data; //using HeuristicLab.Permutation; //using HeuristicLab.Evolutionary; //using HeuristicLab.Operators; //using HeuristicLab.Routing.TSP; //using HeuristicLab.Logging; //using System.Diagnostics; //using HeuristicLab.Selection; //using System.Threading; //using System.IO; //using HeuristicLab.Random; //namespace HeuristicLab.FixedOperators { // class FixedSGAMain : FixedOperatorBase { // public override string Description { // get { return @"Implements the functionality of SGAMain with fixed control structures. Operators like selection, crossover, mutation and evaluation are delegated."; } // } // // Shared // protected Sorter sorter; // // CreateChildren // protected Counter counter; // protected IRandom random; // protected DoubleData probability; // protected ChildrenInitializer ci; // protected OperatorBase crossover; // protected OperatorBase mutator; // protected OperatorBase evaluator; // protected SubScopesRemover sr; // protected StochasticBranch sb; // protected OperatorBase selector; // // CreateReplacement // protected LeftSelector ls; // protected RightReducer rr; // protected RightSelector rs; // protected LeftReducer lr; // protected MergingReducer mr; // //long[] timesExecuteCreateChildren; // public FixedSGAMain() // : base() { // AddVariableInfo(new VariableInfo("Selector", "Selection strategy for SGA", typeof(OperatorBase), VariableKind.In)); // AddVariableInfo(new VariableInfo("MaximumGenerations", "Maximum number of generations to create", typeof(IntData), VariableKind.In)); // AddVariableInfo(new VariableInfo("Generations", "Number of processed generations", typeof(IntData), VariableKind.In | VariableKind.Out)); // Name = "FixedSGAMain"; // sorter = new Sorter(); // sorter.GetVariableInfo("Descending").ActualName = "Maximization"; // sorter.GetVariableInfo("Value").ActualName = "Quality"; // InitCreateChildren(); // InitReplacement(); // sb = new StochasticBranch(); // sb.GetVariableInfo("Probability").ActualName = "MutationRate"; // } // private void InitReplacement() { // ls = new LeftSelector(); // rr = new RightReducer(); // rs = new RightSelector(); // lr = new LeftReducer(); // mr = new MergingReducer(); // ls.GetVariableInfo("Selected").ActualName = "Elites"; // rs.GetVariableInfo("Selected").ActualName = "Elites"; // } // private void InitCreateChildren() { // // variables for create children // ci = new ChildrenInitializer(); // // variables infos // AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In)); // AddVariableInfo(new VariableInfo("MutationRate", "Probability to choose first branch", typeof(DoubleData), VariableKind.In)); // AddVariableInfo(new VariableInfo("Crossover", "Crossover strategy for SGA", typeof(OperatorBase), VariableKind.In)); // AddVariableInfo(new VariableInfo("Mutator", "Mutation strategy for SGA", typeof(OperatorBase), VariableKind.In)); // AddVariableInfo(new VariableInfo("Evaluator", "Evaluation strategy for SGA", typeof(OperatorBase), VariableKind.In)); // sr = new SubScopesRemover(); // sr.GetVariableInfo("SubScopeIndex").Local = true; // counter = new Counter(); // counter.GetVariableInfo("Value").ActualName = "EvaluatedSolutions"; // } // public override IOperation Apply(IScope scope) { // base.Apply(scope); // Stopwatch swApply = new Stopwatch(); // swApply.Start(); // #region Initialization // QualityLogger ql = new QualityLogger(); // BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator(); // DataCollector dc = new DataCollector(); // ItemList names = dc.GetVariable("VariableNames").GetValue>(); // names.Add(new StringData("BestQuality")); // names.Add(new StringData("AverageQuality")); // names.Add(new StringData("WorstQuality")); // LinechartInjector lci = new LinechartInjector(); // lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart"; // lci.GetVariable("NumberOfLines").GetValue().Data = 3; // IntData maxGenerations = GetVariableValue("MaximumGenerations", scope, true); // IntData nrOfGenerations = GetVariableValue("Generations", scope, true); // IntData subscopeNr; // try { // subscopeNr = scope.GetVariableValue("SubScopeNr", false); // } // catch (Exception) { // subscopeNr = new IntData(0); // scope.AddVariable(new Variable("SubScopeNr", subscopeNr)); // } // ci = new ChildrenInitializer(); // GetOperatorsFromScope(scope); // try { // sb.RemoveSubOperator(0); // } // catch (Exception) { // } // sb.AddSubOperator(mutator); // IScope s; // IScope s2; // #endregion // try { // for (; nrOfGenerations.Data < maxGenerations.Data; nrOfGenerations.Data++) { // Execute(selector, scope); // ////// Create Children ////// // // ChildrenInitializer // s = scope.SubScopes[1]; // Execute(ci, s); // SaveExecutionPointer(); // // UniformSequentialSubScopesProcessor // for (; subscopeNr.Data < s.SubScopes.Count; subscopeNr.Data++) { // SetExecutionPointerToLastSaved(); // s2 = s.SubScopes[subscopeNr.Data]; // Execute(crossover, s2); // // Stochastic Branch // Execute(sb, s2); // // ganz böse!!!!!!! // // wird nach dem stochastic branch angehalten und später fortgesetzt, // // wird eine Zufallszahl erzeugt, die aber nicht verwendet wird. // // Dadurch kommt der GA auf ein anderes Endergebnis // // Lösung: Stochastic Branch Operator verwenden // //randomNumber = random.NextDouble(); // //output.AppendLine(randomNumber.ToString()); // //if (randomNumber < probability.Data) // // Execute(mutator, s2); // //else // // Execute(empty, s2); // Execute(evaluator, s2); // Execute(sr, s2); // Execute(counter, s2); // } // foreach // Execute(sorter, s); // ////// END Create Children ////// // DoReplacement(scope); // Execute(ql, scope); // Execute(bawqc, scope); // Execute(dc, scope); // Execute(lci, scope); // subscopeNr.Data = 0; // ResetExecutionPointer(); // } // for i // //TextWriter tw = new StreamWriter(DateTime.Now.ToFileTime() + ".txt"); // //tw.Write(output.ToString()); // //tw.Close(); // //output = new StringBuilder(); // swApply.Stop(); // Console.WriteLine("SGAMain.Apply(): {0}", swApply.Elapsed); // } // try // catch (CancelException) { // Console.WriteLine("Micro engine aborted by cancel flag."); // return new AtomicOperation(this, scope); // } // return null; // } // Apply // /// // /// Fetch main operators like selector, crossover, mutator, ... from scope // /// and store them in instance variables. // /// // /// // protected void GetOperatorsFromScope(IScope scope) { // selector = (OperatorBase)GetVariableValue("Selector", scope, true); // crossover = (OperatorBase)GetVariableValue("Crossover", scope, true); // mutator = (OperatorBase)GetVariableValue("Mutator", scope, true); // evaluator = GetVariableValue("Evaluator", scope, true); // random = GetVariableValue("Random", scope, true); // probability = GetVariableValue("MutationRate", scope, true); // } // /// // /// // /// // /// // protected void CreateChildren(IScope scope) { // // ChildrenInitializer // Execute(ci, scope); // // UniformSequentialSubScopesProcessor // foreach (IScope s in scope.SubScopes) { // Execute(crossover, s); // // Stochastic Branch // if (random.NextDouble() < probability.Data) // Execute(mutator, s); // Execute(evaluator, s); // Execute(sr, s); // Execute(counter, s); // } // foreach // Execute(sorter, scope); // } // CreateChildren // protected void DoReplacement(IScope scope) { // //// SequentialSubScopesProcessor // Execute(ls, scope.SubScopes[0]); // Execute(rr, scope.SubScopes[0]); // Execute(rs, scope.SubScopes[1]); // Execute(lr, scope.SubScopes[1]); // Execute(mr, scope); // Execute(sorter, scope); // } // DoReplacement // } // class FixedSGAMain //} // namespace HeuristicLab.FixedOperators #region License Information /* HeuristicLab * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Text; using System.Linq; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Permutation; using HeuristicLab.Evolutionary; using HeuristicLab.Operators; using HeuristicLab.Routing.TSP; using HeuristicLab.Logging; using System.Diagnostics; using HeuristicLab.Selection; using System.Threading; using System.IO; using HeuristicLab.Random; namespace HeuristicLab.FixedOperators { class FixedSGAMain : FixedGAMainBase { public override string Description { get { return @"Implements the functionality of SGAMain with fixed control structures. Operators like selection, crossover, mutation and evaluation are delegated."; } } //long[] timesExecuteCreateChildren; public FixedSGAMain() { Name = "FixedSGAMain"; } public override IOperation Apply(IScope scope) { base.Apply(scope); Stopwatch swApply = new Stopwatch(); swApply.Start(); IScope s; IScope s2; bool loopSkipped = true; tempExePointer = new int[10]; tempPersExePointer = new int[10]; try { for (; nrOfGenerations.Data < maxGenerations.Data; nrOfGenerations.Data++) { Execute(selector, scope); ////// Create Children ////// // ChildrenInitializer s = scope.SubScopes[1]; Execute(ci, s); SaveExecutionPointer(0); // UniformSequentialSubScopesProcessor for (; subscopeNr.Data < s.SubScopes.Count; subscopeNr.Data++) { SetExecutionPointerToLastSaved(0); s2 = s.SubScopes[subscopeNr.Data]; Execute(crossover, s2); // Stochastic Branch Execute(sb, s2); // ganz böse!!!!!!! // wird nach dem stochastic branch angehalten und später fortgesetzt, // wird eine Zufallszahl erzeugt, die aber nicht verwendet wird. // Dadurch kommt der GA auf ein anderes Endergebnis // Lösung: Stochastic Branch Operator verwenden //randomNumber = random.NextDouble(); //output.AppendLine(randomNumber.ToString()); //if (randomNumber < probability.Data) // Execute(mutator, s2); //else // Execute(empty, s2); Execute(evaluator, s2); Execute(sr, s2); Execute(counter, s2); loopSkipped = false; } // foreach // if for loop skipped, we had to add skiped operations // to execution pointer. if (loopSkipped) executionPointer += 5; Execute(sorter, s); ////// END Create Children ////// DoReplacement(scope); Execute(ql, scope); Execute(bawqc, scope); Execute(dc, scope); Execute(lci, scope); subscopeNr.Data = 0; ResetExecutionPointer(); } // for i //TextWriter tw = new StreamWriter(DateTime.Now.ToFileTime() + ".txt"); //tw.Write(output.ToString()); //tw.Close(); //output = new StringBuilder(); swApply.Stop(); Console.WriteLine("SGAMain.Apply(): {0}", swApply.Elapsed); } // try catch (CancelException) { return new AtomicOperation(this, scope); } return null; } // Apply } // class FixedSGAMain } // namespace HeuristicLab.FixedOperators