Changeset 15031
- Timestamp:
- 06/10/17 23:19:11 (7 years ago)
- Location:
- branches/PerformanceComparison
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.Analysis.FitnessLandscape/3.3/CharacteristicCalculator/UpDownWalkCalculator.cs
r13920 r15031 58 58 characteristics = cloner.Clone(original.characteristics); 59 59 } 60 public UpDownWalkCalculator() { 60 public UpDownWalkCalculator() : this(new UpDownWalk()) { } 61 public UpDownWalkCalculator(UpDownWalk walker) { 61 62 Name = ItemName; 62 63 Description = ItemDescription; 63 walker = new UpDownWalk();64 this.walker = walker; 64 65 characteristics = new CheckedItemList<StringValue>( 65 66 new[] { "AutoCorrelation1", "CorrelationLength", "InformationContent", -
branches/PerformanceComparison/HeuristicLab.Analysis.FitnessLandscape/3.3/ProblemCharacteristicAnalysis/QAP/QAPDirectedWalk.cs
r14691 r15031 79 79 private QAPDirectedWalk(QAPDirectedWalk original, Cloner cloner) : base(original, cloner) { } 80 80 public QAPDirectedWalk() { 81 characteristics.AddRange(new[] { "Swap2.Sharpness", "Swap2.Bumpiness", "Swap2.Flatness" , /*"Swap2.Steadiness"*/}81 characteristics.AddRange(new[] { "Swap2.Sharpness", "Swap2.Bumpiness", "Swap2.Flatness" } 82 82 .Select(x => new StringValue(x)).ToList()); 83 83 Parameters.Add(new FixedValueParameter<IntValue>("Paths", "The number of paths to explore (a path is a set of solutions that connect two randomly chosen solutions).", new IntValue(50))); … … 98 98 IRandom random = Seed.HasValue ? new MersenneTwister((uint)Seed.Value) : new MersenneTwister(); 99 99 var qap = (QuadraticAssignmentProblem)Problem; 100 var pathCount = Paths; 101 100 List<Permutation> permutations = CalculateRelinkingPoints(random, qap, Paths, LocalOptima); 101 102 var trajectories = Run(random, (QuadraticAssignmentProblem)Problem, permutations, BestImprovement).ToList(); 103 var result = PermutationPathAnalysis.GetCharacteristics(trajectories); 104 105 foreach (var chara in characteristics.CheckedItems.Select(x => x.Value.Value)) { 106 if (chara == "Swap2.Sharpness") yield return new Result("Swap2.Sharpness", new DoubleValue(result.Sharpness)); 107 if (chara == "Swap2.Bumpiness") yield return new Result("Swap2.Bumpiness", new DoubleValue(result.Bumpiness)); 108 if (chara == "Swap2.Flatness") yield return new Result("Swap2.Flatness", new DoubleValue(result.Flatness)); 109 } 110 } 111 112 public static List<Permutation> CalculateRelinkingPoints(IRandom random, QuadraticAssignmentProblem qap, int pathCount, bool localOptima) { 102 113 var perm = new Permutation(PermutationTypes.Absolute, qap.Weights.Rows, random); 103 if ( LocalOptima) {114 if (localOptima) { 104 115 var fit = new DoubleValue(QAPEvaluator.Apply(perm, qap.Weights, qap.Distances)); 105 116 QAPExhaustiveSwap2LocalImprovement.ImproveFast(perm, qap.Weights, qap.Distances, fit, new IntValue(0), new IntValue(0), qap.Maximization.Value, int.MaxValue, CancellationToken.None); … … 109 120 perm = (Permutation)permutations.Last().Clone(); 110 121 BiasedShuffle(perm, random); 111 if ( LocalOptima) {122 if (localOptima) { 112 123 var fit = new DoubleValue(QAPEvaluator.Apply(perm, qap.Weights, qap.Distances)); 113 124 QAPExhaustiveSwap2LocalImprovement.ImproveFast(perm, qap.Weights, qap.Distances, fit, new IntValue(0), new IntValue(0), qap.Maximization.Value, int.MaxValue, CancellationToken.None); … … 117 128 } 118 129 119 var trajectories = Run(random, (QuadraticAssignmentProblem)Problem, permutations, BestImprovement).ToList(); 120 var result = PermutationPathAnalysis.GetCharacteristics(trajectories); 121 122 foreach (var chara in characteristics.CheckedItems.Select(x => x.Value.Value)) { 123 if (chara == "Swap2.Sharpness") yield return new Result("Swap2.Sharpness", new DoubleValue(result.Sharpness)); 124 if (chara == "Swap2.Bumpiness") yield return new Result("Swap2.Bumpiness", new DoubleValue(result.Bumpiness)); 125 if (chara == "Swap2.Flatness") yield return new Result("Swap2.Flatness", new DoubleValue(result.Flatness)); 126 } 130 return permutations; 127 131 } 128 132 -
branches/PerformanceComparison/HeuristicLab.Problems.Instances.QAPLIB/3.3/OneSizeInstanceProvider.cs
r14691 r15031 2 2 using System.Collections.Generic; 3 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 4 using System.Text.RegularExpressions; 6 5 7 6 namespace HeuristicLab.Problems.Instances.QAPLIB { … … 9 8 public override IEnumerable<IDataDescriptor> GetDataDescriptors() { 10 9 var drezner = new DreznerQAPInstanceProvider(); 11 foreach (var desc in drezner.GetDataDescriptors()) 12 yield return new OneSizeDataDescriptor(desc.Name + "-25", desc.Description, drezner, desc); 10 foreach (var desc in drezner.GetDataDescriptors()) { 11 var dim = int.Parse(Regex.Match(desc.Name, "dre(?<g>\\d+)").Groups["g"].Value); 12 if (dim < 25) continue; 13 yield return new OneSizeDataDescriptor(desc.Name + (dim == 25 ? "" : "-25"), desc.Description, drezner, desc); 14 } 15 // Microarray instances are all greater than 25 dimensions 13 16 var microarray = new MicroarrayQAPInstanceProvider(); 14 foreach (var desc in microarray.GetDataDescriptors()) 17 foreach (var desc in microarray.GetDataDescriptors()) { 15 18 yield return new OneSizeDataDescriptor(desc.Name + "-25", desc.Description, microarray, desc); 19 } 16 20 var qaplib = new QAPLIBInstanceProvider(); 17 foreach (var desc in qaplib.GetDataDescriptors()) 18 yield return new OneSizeDataDescriptor(desc.Name + "-25", desc.Description, qaplib, desc); 21 foreach (var desc in qaplib.GetDataDescriptors()) { 22 var instance = qaplib.LoadData(desc); 23 if (instance.Dimension < 25) continue; 24 yield return new OneSizeDataDescriptor(desc.Name + (instance.Dimension == 25 ? "" : "-25"), desc.Description, qaplib, desc); 25 } 26 // Taillard's instances are basically from the same distribution 27 // to avoid over-representation in the set only the tai27e are taken and reduced to 25 dimension 19 28 var taillard = new TaillardQAPInstanceProvider(); 20 foreach (var desc in taillard.GetDataDescriptors()) 29 foreach (var desc in taillard.GetDataDescriptors()) { 30 if (!desc.Name.StartsWith("tai27e")) continue; 21 31 yield return new OneSizeDataDescriptor(desc.Name + "-25", desc.Description, taillard, desc); 32 } 22 33 } 23 34 … … 59 70 data.Dimension = 25; 60 71 data.Name += "-25"; 61 data.Description += " (reduced or enlargedto 25 dimensions)";72 data.Description += " (reduced to 25 dimensions)"; 62 73 63 74 return data; … … 68 79 public override Uri WebLink { get { return null; } } 69 80 public override string ReferencePublication { get { return string.Empty; } } 70 71 // permutation must be strictly different in every position 81 72 82 private static void Shuffle(int[] p, Random random) { 73 83 for (var i = p.Length - 1; i > 0; i--) { 74 // Swap element "i" with a random earlier element (excluding itself)75 84 var swapIndex = random.Next(i + 1); 76 85 var h = p[swapIndex]; -
branches/PerformanceComparison/ProblemInstanceIdentifier/InstanceDescriptor.cs
r14691 r15031 2 2 using System.Collections.Generic; 3 3 using System.Linq; 4 using System.Text.RegularExpressions; 4 5 using HeuristicLab.Analysis.FitnessLandscape; 5 6 using HeuristicLab.Common; 6 using HeuristicLab.Data;7 7 using HeuristicLab.Encodings.PermutationEncoding; 8 8 using HeuristicLab.Problems.QuadraticAssignment; … … 68 68 break; 69 69 case "tai": 70 if (char.IsLetter(subCls)) cls += "-" + subCls; 70 if (Regex.IsMatch(name, "tai\\d+e\\d+")) cls += "-e"; 71 else if (char.IsLetter(subCls)) cls += "-" + subCls; 71 72 break; 72 73 } -
branches/PerformanceComparison/ProblemInstanceIdentifier/InstanceExplorer.cs
r14776 r15031 1 1 using System; 2 2 using System.Linq; 3 using System.Threading;4 3 using HeuristicLab.Algorithms.MemPR.Permutation; 5 4 using HeuristicLab.Analysis.FitnessLandscape; … … 7 6 using HeuristicLab.Encodings.PermutationEncoding; 8 7 using HeuristicLab.Problems.QuadraticAssignment; 8 using HeuristicLab.Random; 9 9 using HeuristicLab.SequentialEngine; 10 10 … … 45 45 } 46 46 47 public class PathRelinkingOldFeaturedExplorer : InstanceExplorer { 48 public int Paths { get; set; } 49 public bool LocalOptima { get; set; } 50 51 public override string Name { get { return "Path-Relinking Explorer"; } } 52 public override int Effort { get { return Paths; } } 53 54 public PathRelinkingOldFeaturedExplorer() { 55 56 } 57 58 public override InstanceDescriptor Explore(QuadraticAssignmentProblem problem, int? seed = null) { 59 var random = new MersenneTwister(); 60 var samples = QAPDirectedWalk.CalculateRelinkingPoints(random, problem, Paths, LocalOptima); 61 var trajectories = QAPDirectedWalk.Run(random, problem, samples); 62 63 double avgAc1 = 0, avgCorLen = 0, avgIc = 0, avgDbi = 0, avgPic = 0, avgIs = 0, avgDiv = 0, 64 avgReg = 0, avgEnt = 0, avgPkIc = 0, avgPkDbi = 0; 65 int count = 0; 66 foreach (var t in trajectories) { 67 var trail = t.Select(x => x.Item2).ToArray(); 68 if (trail.Length < 4) continue; 69 count++; 70 double[] acf; 71 var len = RuggednessCalculator.CalculateCorrelationLength(trail, out acf); 72 avgAc1 += acf[0]; 73 avgCorLen += len; 74 var analysis = new InformationAnalysis(trail, 20, 2); 75 avgIc += analysis.InformationContent[0]; 76 avgDbi += analysis.DensityBasinInformation[0]; 77 avgPic += analysis.PartialInformationContent[0]; 78 avgIs += analysis.InformationStability; 79 avgDiv += analysis.Diversity; 80 avgReg += analysis.Regularity; 81 avgEnt += analysis.TotalEntropy[0]; 82 avgPkIc += analysis.PeakInformationContent.Value; 83 avgPkDbi += analysis.PeakDensityBasinInformation.Value; 84 } 85 avgAc1 /= count; 86 avgCorLen /= count; 87 avgIc /= count; 88 avgDbi /= count; 89 avgPic /= count; 90 avgIs /= count; 91 avgDiv /= count; 92 avgReg /= count; 93 avgEnt /= count; 94 avgPkIc /= count; 95 avgPkDbi /= count; 96 97 return new InstanceDescriptor(problem.Name, InstanceDescriptor.GetClass(problem.Name), problem.Weights.Rows, 98 new[] { "Autocorrelation(1)", "CorrelationLength", "InformationContent", "DensityBasinInformation", 99 "PartialInformationContent", "InformationStability", "Diversity", "Regularity", "TotalEntropy", 100 "PeakInformationContent", "PeakDensityBasinInformation" }, 101 new[] { avgAc1, avgCorLen, avgIc, avgDbi, 102 avgPic, avgIs, avgDiv, avgReg, avgEnt, 103 avgPkIc, avgPkDbi }); 104 } 105 } 106 47 107 48 108 public class RandomWalkExplorer : InstanceExplorer { … … 76 136 public class AdaptiveWalkExplorer : InstanceExplorer { 77 137 public int Iterations { get; set; } 138 public int SampleSize { get; set; } 78 139 79 140 public override string Name { get { return "Adaptive-Walk Explorer"; } } 80 public override int Effort { get { return Iterations ; } }141 public override int Effort { get { return Iterations * SampleSize; } } 81 142 82 143 public AdaptiveWalkExplorer() { … … 87 148 var walk = new AdaptiveWalk() { 88 149 SeedParameter = { Value = { Value = seed ?? 0 } }, 89 SetSeedRandomlyParameter = { Value = { Value = seed.HasValue } },150 SetSeedRandomlyParameter = { Value = { Value = !seed.HasValue } }, 90 151 MaximumIterationsParameter = { Value = { Value = Iterations } }, 91 RepetitionsParameter = { Value = { Value = 1 } } 152 RepetitionsParameter = { Value = { Value = 1 } }, 153 SampleSizeParameter = { Value = { Value = SampleSize } } 92 154 }; 93 155 walk.Problem = problem; … … 95 157 walk.MutatorParameter.Value = walk.MutatorParameter.ValidValues.First(x => x is Swap2Manipulator); 96 158 var calculator = new AdaptiveWalkCalculator(walk) { Problem = problem }; 159 var features = calculator.Calculate().ToDictionary(x => x.Name, x => x.Value); 160 161 return new InstanceDescriptor(problem.Name, InstanceDescriptor.GetClass(problem.Name), problem.Weights.Rows, 162 features.Keys.ToArray(), features.Values.Select(x => ((DoubleValue)x).Value).ToArray()); 163 } 164 } 165 166 public class UpDownWalkExplorer : InstanceExplorer { 167 public int Iterations { get; set; } 168 public int SampleSize { get; set; } 169 170 public override string Name { get { return "Up/Down-Walk Explorer"; } } 171 public override int Effort { get { return Iterations * SampleSize; } } 172 173 public UpDownWalkExplorer() { 174 175 } 176 177 public override InstanceDescriptor Explore(QuadraticAssignmentProblem problem, int? seed = null) { 178 var walk = new UpDownWalk() { 179 SeedParameter = { Value = { Value = seed ?? 0 } }, 180 SetSeedRandomlyParameter = { Value = { Value = !seed.HasValue } }, 181 MaximumIterationsParameter = { Value = { Value = Iterations } }, 182 RepetitionsParameter = { Value = { Value = 1 } }, 183 SampleSizeParameter = { Value = { Value = SampleSize } } 184 }; 185 walk.Problem = problem; 186 walk.Engine = new SequentialEngine(); 187 walk.MutatorParameter.Value = walk.MutatorParameter.ValidValues.First(x => x is Swap2Manipulator); 188 var calculator = new UpDownWalkCalculator(walk) { Problem = problem }; 97 189 var features = calculator.Calculate().ToDictionary(x => x.Name, x => x.Value); 98 190 -
branches/PerformanceComparison/ProblemInstanceIdentifier/ProblemInstanceIdentifier.csproj
r14690 r15031 50 50 <Reference Include="HeuristicLab.Encodings.PermutationEncoding-3.3"> 51 51 <HintPath>..\..\..\trunk\sources\bin\HeuristicLab.Encodings.PermutationEncoding-3.3.dll</HintPath> 52 </Reference> 53 <Reference Include="HeuristicLab.Operators-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec"> 54 <Private>True</Private> 52 55 </Reference> 53 56 <Reference Include="HeuristicLab.Persistence-3.3"> -
branches/PerformanceComparison/ProblemInstanceIdentifier/Program.cs
r14776 r15031 12 12 namespace ProblemInstanceIdentifier { 13 13 class Program { 14 static void Main(string[] args) { 15 //var instances = Get20DifferentClasses(); 16 var instances = GetSomeRandomInstances(50, 13); 17 18 /*var classes = instances.Select(InstanceDescriptor.FromProblemOnly).GroupBy(x => x.Cls); 19 foreach (var cls in classes.OrderBy(x => x.Key)) { 20 Console.WriteLine("{0};{1}", cls.Key, cls.Count()); 21 }*/ 22 23 var prExplorer = new PathRelinkingExplorer() { 24 LocalOptima = false, 25 Paths = 200 26 }; 27 var prOldExplorer = new PathRelinkingOldFeaturedExplorer() { 28 LocalOptima = false, 29 Paths = 200 30 }; 31 32 var prLocalExplorer = new PathRelinkingExplorer() { 33 LocalOptima = true, 34 Paths = 200 35 }; 36 var prOldLocalExplorer = new PathRelinkingOldFeaturedExplorer() { 37 LocalOptima = true, 38 Paths = 200 39 }; 40 41 var memPrExplorer = new MemPRExplorer() { 42 IncludeLocalSearch = false, 43 Seconds = 10 44 }; 45 46 //var training = GenerateData(instances, prOldExplorer, parallel: true); 47 //var standardizer = InstancesStandardizer.CreateAndApply(training); 48 //var test = GenerateData(instances, prOldExplorer, parallel: true); 49 //standardizer.Apply(test); 50 //PrintMatchResult(Compare(training, test)); 51 52 //Console.WriteLine("=== Path Relinking Walk ==="); 53 //ExploreMatching(instances, 54 //new[] { 1, 5, 10, 20, 50, 100, 200 }.Select(x => new PathRelinkingExplorer() { LocalOptima = false, Paths = x }).ToArray(), 55 //new[] { 1, 5, 10, 20, 50, 100, 200 }.Select(x => new PathRelinkingExplorer() { LocalOptima = false, Paths = x }).ToArray(), 56 //parallel: true); 57 //Console.WriteLine("=== Random Walk ==="); 58 //ExploreMatching(instances, 59 //new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new RandomWalkExplorer() { Iterations = x }).ToArray(), 60 //new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new RandomWalkExplorer() { Iterations = x }).ToArray(), 61 //parallel: true); 62 //Console.WriteLine("=== Adaptive Walk ==="); 63 //ExploreMatching(instances, 64 //new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new AdaptiveWalkExplorer() { Iterations = x / 10, SampleSize = 10 }).ToArray(), 65 //new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new AdaptiveWalkExplorer() { Iterations = x / 10, SampleSize = 10 }).ToArray(), 66 //parallel: true); 67 Console.WriteLine("=== Up/Down Walk ==="); 68 ExploreMatching(instances, 69 new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new UpDownWalkExplorer() { Iterations = x / 10, SampleSize = 10 }).ToArray(), 70 new[] { 300, 1500, 3000, 6000, 15000, 30000, 60000 }.Select(x => new UpDownWalkExplorer() { Iterations = x / 10, SampleSize = 10 }).ToArray(), 71 parallel: true); 72 } 73 74 private static List<QuadraticAssignmentProblem> GetSomeRandomInstances(int totalInstances, int seed) { 75 var sync = new object(); 76 var provider = new OneSizeInstanceProvider(); 77 var instances = new List<QuadraticAssignmentProblem>(); 78 var random = new FastRandom(seed); 79 Parallel.ForEach(provider.GetDataDescriptors().Shuffle(random), desc => { 80 var qapData = provider.LoadData(desc); 81 if (instances.Count >= totalInstances) return; 82 var qap = new QuadraticAssignmentProblem(); 83 qap.Load(qapData); 84 lock (sync) { 85 if (instances.Count >= totalInstances) return; 86 instances.Add(qap); 87 } 88 }); 89 return instances; 90 } 91 14 92 private static HashSet<string> selectedInstances = new HashSet<string>() { 15 93 "bur26a", "chr25a", "dre24", "els19", "esc32a", "had20", "kra32", "lipa30a", "lipa30b", … … 17 95 "RAND-S-6x6-36-25-AFFY-00_rand_rand_bl", "RAND-S-6x6-36-25-AFFY-00_rand_rand_ci" 18 96 }; 19 static void Main(string[] args) {20 var instances = Get20DifferentClasses();21 //var instances = GetSomeRandomInstances(50);22 23 /*var classes = instances.Select(InstanceDescriptor.FromProblemOnly).GroupBy(x => x.Cls);24 foreach (var cls in classes.OrderBy(x => x.Key)) {25 Console.WriteLine("{0};{1}", cls.Key, cls.Count());26 }*/27 28 var prExplorer = new PathRelinkingExplorer() {29 LocalOptima = false,30 Paths = 20031 };32 var prLocalExplorer = new PathRelinkingExplorer() {33 LocalOptima = true,34 Paths = 20035 };36 var memPrExplorer = new MemPRExplorer() {37 IncludeLocalSearch = false,38 Seconds = 1039 };40 41 var training = GenerateData(instances, prExplorer, parallel:true);42 var standardizer = InstancesStandardizer.CreateAndApply(training);43 var test = GenerateData(instances, prExplorer, parallel: false);44 standardizer.Apply(test);45 PrintMatchResult(Compare(training, test));46 47 ExploreMatching(instances, new [] { prLocalExplorer }, new [] { memPrExplorer });48 }49 50 private static List<QuadraticAssignmentProblem> GetSomeRandomInstances(int totalInstances) {51 var sync = new object();52 var provider = new OneSizeInstanceProvider();53 var instances = new List<QuadraticAssignmentProblem>();54 var random = new FastRandom(0);55 Parallel.ForEach(provider.GetDataDescriptors().Shuffle(random), desc => {56 var qapData = provider.LoadData(desc);57 if (qapData.Dimension < 25) return;58 if (instances.Count >= totalInstances) return;59 var qap = new QuadraticAssignmentProblem();60 qap.Load(qapData);61 lock (sync) {62 if (instances.Count >= totalInstances) return;63 instances.Add(qap);64 }65 });66 return instances;67 }68 69 97 private static List<QuadraticAssignmentProblem> Get20DifferentClasses() { 70 98 var sync = new object(); … … 100 128 }; 101 129 if (parallel) { 102 Parallel.ForEach(instances , body);130 Parallel.ForEach(instances.Select(x => (QuadraticAssignmentProblem)x.Clone()), body); 103 131 } else { 104 132 foreach (var qap in instances) body(qap); … … 156 184 private static void ExploreMatching(List<QuadraticAssignmentProblem> instances, InstanceExplorer[] trainingExplorers, InstanceExplorer[] testExporers, bool parallel = false) { 157 185 var sync = new object(); 158 var rand = new Random();159 var first = rand.Next();160 var second = rand.Next();161 while (first == second) second = rand.Next();162 186 163 187 var knowledgeBase = new Dictionary<InstanceExplorer, Tuple<InstancesStandardizer, List<InstanceDescriptor>>>();
Note: See TracChangeset
for help on using the changeset viewer.