Changeset 13470 for branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB
- Timestamp:
- 12/15/15 16:38:08 (8 years ago)
- Location:
- branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB/3.3
- Files:
-
- 1 deleted
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB/3.3/HeuristicLab.Problems.Instances.TSPLIB-3.3.csproj
r13412 r13470 123 123 </ItemGroup> 124 124 <ItemGroup> 125 <Compile Include="MarsagliaRandom.cs" />126 125 <Compile Include="TSPLIBHeterogeneousPTSPDataDescriptor.cs" /> 127 126 <Compile Include="TSPLIBHomogeneousPTSPDataDescriptor.cs" /> 128 127 <Compile Include="TSPLIBHeterogeneousPTSPInstanceProvider.cs" /> 128 <Compile Include="TSPLIBPTSPInstanceProvider.cs" /> 129 129 <Compile Include="TSPLIBInstanceProvider.cs" /> 130 130 <Compile Include="TSPLIBATSPInstanceProvider.cs" /> -
branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHeterogeneousPTSPInstanceProvider.cs
r13412 r13470 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.IO;25 24 using System.Linq; 26 25 27 26 namespace HeuristicLab.Problems.Instances.TSPLIB { 28 public class TSPLIBHeterogeneousPTSPInstanceProvider : TSPLIB InstanceProvider<PTSPData>{27 public class TSPLIBHeterogeneousPTSPInstanceProvider : TSPLIBPTSPInstanceProvider { 29 28 30 29 public override string Name { … … 32 31 } 33 32 34 public override string Description {35 get { return "Traveling Salesman Problem Library"; }36 }37 38 protected override string FileExtension { get { return "tsp"; } }39 40 33 public override IEnumerable<IDataDescriptor> GetDataDescriptors() { 41 34 foreach (var desc in base.GetDataDescriptors().OfType<TSPLIBDataDescriptor>()) { 42 desc.Name += " [0.1;0.9]";43 35 desc.SolutionIdentifier = null; 44 36 yield return desc; … … 46 38 } 47 39 48 protected override PTSPData LoadInstance(TSPLIBParser parser, IDataDescriptor descriptor = null) { 49 parser.Parse(); 50 if (parser.FixedEdges != null) throw new InvalidDataException("TSP instance " + parser.Name + " contains fixed edges which are not supported by HeuristicLab."); 51 var instance = new PTSPData(); 52 instance.Dimension = parser.Dimension; 53 instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices; 54 instance.Distances = parser.Distances; 55 switch (parser.EdgeWeightType) { 56 case TSPLIBEdgeWeightTypes.ATT: 57 instance.DistanceMeasure = DistanceMeasure.Att; break; 58 case TSPLIBEdgeWeightTypes.CEIL_2D: 59 instance.DistanceMeasure = DistanceMeasure.UpperEuclidean; break; 60 case TSPLIBEdgeWeightTypes.EUC_2D: 61 instance.DistanceMeasure = DistanceMeasure.RoundedEuclidean; break; 62 case TSPLIBEdgeWeightTypes.EUC_3D: 63 throw new InvalidDataException("3D coordinates are not supported."); 64 case TSPLIBEdgeWeightTypes.EXPLICIT: 65 instance.DistanceMeasure = DistanceMeasure.Direct; break; 66 case TSPLIBEdgeWeightTypes.GEO: 67 instance.DistanceMeasure = DistanceMeasure.Geo; break; 68 case TSPLIBEdgeWeightTypes.MAN_2D: 69 instance.DistanceMeasure = DistanceMeasure.Manhattan; break; 70 case TSPLIBEdgeWeightTypes.MAN_3D: 71 throw new InvalidDataException("3D coordinates are not supported."); 72 case TSPLIBEdgeWeightTypes.MAX_2D: 73 instance.DistanceMeasure = DistanceMeasure.Maximum; break; 74 case TSPLIBEdgeWeightTypes.MAX_3D: 75 throw new InvalidDataException("3D coordinates are not supported."); 76 default: 77 throw new InvalidDataException("The given edge weight is not supported by HeuristicLab."); 40 protected override double[] GetProbabilities(IDataDescriptor descriptor, PTSPData instance) { 41 var random = new MarsagliaRandom(GetInstanceHash(instance.Name)); 42 return Enumerable.Range(0, instance.Dimension).Select(_ => (int)Math.Round((0.1 + 0.9 * random.NextDouble()) * 100) / 100.0).ToArray(); 43 } 44 45 // Bernstein's hash function 46 private uint GetInstanceHash(string name) { 47 uint hash = 5381; 48 var len = name.Length; 49 for (var i = 0; i < len; i++) 50 unchecked { hash = ((hash * 33) + name[i]); } 51 return hash; 52 } 53 54 /// <summary> 55 /// This class is used to randomly generate PTSP instances given the TSPLIB instances. 56 /// An own implementation of a RNG was used in order to avoid possible implementation changes 57 /// in future .NET versions which would result in entirely different instances. 58 /// </summary> 59 /// <remarks> 60 /// RNG is implemented according to George Marsaglia https://en.wikipedia.org/wiki/Multiply-with-carry 61 /// </remarks> 62 private class MarsagliaRandom { 63 /* 64 * S = 2111111111*X[n-4] + 1492*X[n-3] + 1776*X[n-2] + 5115*X[n-1] + C 65 * X[n] = S modulo 2^32 66 * C = floor(S / 2^32) 67 * 68 */ 69 private readonly uint[] mem = new uint[4]; 70 private uint c; 71 72 public MarsagliaRandom(uint s) { 73 int i; 74 for (i = 0; i < mem.Length; i++) { 75 unchecked { s = s * 31294061 + 1; } 76 mem[i] = s; 77 } 78 unchecked { c = s * 31294061 + 1; } 78 79 } 79 80 80 instance.Name = parser.Name; 81 instance.Description = parser.Comment 82 + Environment.NewLine + Environment.NewLine 83 + GetInstanceDescription(); 81 private uint Next() { 82 unchecked { 83 ulong wsum = 2111111111 * mem[0] 84 + 1492 * mem[1] 85 + 1776 * mem[2] 86 + 5115 * mem[3] 87 + c; 84 88 85 var random = new MarsagliaRandom((uint)(descriptor != null ? descriptor.Name : instance.Name).GetHashCode()); 86 instance.Probabilities = Enumerable.Range(0, instance.Dimension).Select(_ => 0.1 + 0.9 * random.NextDouble()).ToArray(); 89 mem[0] = mem[1]; 90 mem[1] = mem[2]; 91 mem[2] = mem[3]; 92 mem[3] = (uint)wsum; 93 c = (uint)(wsum >> 32); 94 return mem[3]; 95 } 96 } 87 97 88 return instance; 98 public double NextDouble() { 99 return (double)Next() / uint.MaxValue; 100 } 89 101 } 90 91 protected override void LoadSolution(TSPLIBParser parser, PTSPData instance) {92 parser.Parse();93 instance.BestKnownTour = parser.Tour.FirstOrDefault();94 }95 96 public PTSPData LoadData(string tspFile, string tourFile, double? bestQuality) {97 var data = LoadInstance(new TSPLIBParser(tspFile));98 if (!String.IsNullOrEmpty(tourFile)) {99 var tourParser = new TSPLIBParser(tourFile);100 LoadSolution(tourParser, data);101 }102 if (bestQuality.HasValue)103 data.BestKnownQuality = bestQuality.Value;104 return data;105 }106 107 102 } 108 103 } -
branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBHomogeneousPTSPInstanceProvider.cs
r13412 r13470 20 20 #endregion 21 21 22 using System;23 22 using System.Collections.Generic; 24 23 using System.Globalization; 25 using System.IO;26 24 using System.Linq; 27 25 28 26 namespace HeuristicLab.Problems.Instances.TSPLIB { 29 public class TSPLIBHomogeneousPTSPInstanceProvider : TSPLIB InstanceProvider<PTSPData>{30 private static readonly double[] probabilities = new[] { 0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9, 1.0 };27 public class TSPLIBHomogeneousPTSPInstanceProvider : TSPLIBPTSPInstanceProvider { 28 private static readonly double[] Probabilities = new[] { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; 31 29 32 30 public override string Name { … … 34 32 } 35 33 36 public override string Description {37 get { return "Traveling Salesman Problem Library"; }38 }39 40 protected override string FileExtension { get { return "tsp"; } }41 42 34 public override IEnumerable<IDataDescriptor> GetDataDescriptors() { 43 35 var tspDescriptors = base.GetDataDescriptors().OfType<TSPLIBDataDescriptor>(); 44 36 foreach (var desc in tspDescriptors) { 45 foreach (var p in probabilities) {37 foreach (var p in Probabilities) { 46 38 yield return new TSPLIBHomogeneousPTSPDataDescriptor( 47 39 desc.Name + "-" + p.ToString(CultureInfo.InvariantCulture.NumberFormat), … … 54 46 } 55 47 56 protected override PTSPData LoadInstance(TSPLIBParser parser, IDataDescriptor descriptor = null) { 57 parser.Parse(); 58 if (parser.FixedEdges != null) throw new InvalidDataException("TSP instance " + parser.Name + " contains fixed edges which are not supported by HeuristicLab."); 59 var instance = new PTSPData(); 60 instance.Dimension = parser.Dimension; 61 instance.Coordinates = parser.Vertices != null ? parser.Vertices : parser.DisplayVertices; 62 instance.Distances = parser.Distances; 63 switch (parser.EdgeWeightType) { 64 case TSPLIBEdgeWeightTypes.ATT: 65 instance.DistanceMeasure = DistanceMeasure.Att; break; 66 case TSPLIBEdgeWeightTypes.CEIL_2D: 67 instance.DistanceMeasure = DistanceMeasure.UpperEuclidean; break; 68 case TSPLIBEdgeWeightTypes.EUC_2D: 69 instance.DistanceMeasure = DistanceMeasure.RoundedEuclidean; break; 70 case TSPLIBEdgeWeightTypes.EUC_3D: 71 throw new InvalidDataException("3D coordinates are not supported."); 72 case TSPLIBEdgeWeightTypes.EXPLICIT: 73 instance.DistanceMeasure = DistanceMeasure.Direct; break; 74 case TSPLIBEdgeWeightTypes.GEO: 75 instance.DistanceMeasure = DistanceMeasure.Geo; break; 76 case TSPLIBEdgeWeightTypes.MAN_2D: 77 instance.DistanceMeasure = DistanceMeasure.Manhattan; break; 78 case TSPLIBEdgeWeightTypes.MAN_3D: 79 throw new InvalidDataException("3D coordinates are not supported."); 80 case TSPLIBEdgeWeightTypes.MAX_2D: 81 instance.DistanceMeasure = DistanceMeasure.Maximum; break; 82 case TSPLIBEdgeWeightTypes.MAX_3D: 83 throw new InvalidDataException("3D coordinates are not supported."); 84 default: 85 throw new InvalidDataException("The given edge weight is not supported by HeuristicLab."); 86 } 87 88 instance.Name = parser.Name; 89 instance.Description = parser.Comment 90 + Environment.NewLine + Environment.NewLine 91 + GetInstanceDescription(); 48 protected override double[] GetProbabilities(IDataDescriptor descriptor, PTSPData instance) { 92 49 var ptspDesc = descriptor as TSPLIBHomogeneousPTSPDataDescriptor; 93 instance.Probabilities = ptspDesc != null ? Enumerable.Range(0, instance.Dimension).Select(_ => ptspDesc.Probability).ToArray() 94 : Enumerable.Range(0, instance.Dimension).Select(_ => 0.5).ToArray(); 95 96 return instance; 50 return ptspDesc != null ? Enumerable.Range(0, instance.Dimension).Select(_ => ptspDesc.Probability).ToArray() 51 : Enumerable.Range(0, instance.Dimension).Select(_ => 0.5).ToArray(); 97 52 } 98 99 protected override void LoadSolution(TSPLIBParser parser, PTSPData instance) {100 parser.Parse();101 instance.BestKnownTour = parser.Tour.FirstOrDefault();102 }103 104 public PTSPData LoadData(string tspFile, string tourFile, double? bestQuality) {105 var data = LoadInstance(new TSPLIBParser(tspFile));106 if (!String.IsNullOrEmpty(tourFile)) {107 var tourParser = new TSPLIBParser(tourFile);108 LoadSolution(tourParser, data);109 }110 if (bestQuality.HasValue)111 data.BestKnownQuality = bestQuality.Value;112 return data;113 }114 115 53 } 116 54 } -
branches/PTSP/HeuristicLab.Problems.Instances.TSPLIB/3.3/TSPLIBPTSPInstanceProvider.cs
r13451 r13470 21 21 22 22 using System; 23 using System.Collections.Generic;24 using System.Globalization;25 23 using System.IO; 26 24 using System.Linq; 27 25 28 26 namespace HeuristicLab.Problems.Instances.TSPLIB { 29 public class TSPLIBHomogeneousPTSPInstanceProvider : TSPLIBInstanceProvider<PTSPData> { 30 private static readonly double[] probabilities = new[] { 0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9, 1.0 }; 31 32 public override string Name { 33 get { return "TSPLIB (homogeneous symmetric PTSP)"; } 34 } 27 public abstract class TSPLIBPTSPInstanceProvider : TSPLIBInstanceProvider<PTSPData> { 35 28 36 29 public override string Description { 37 get { return "Traveling Salesman Problem Library "; }30 get { return "Traveling Salesman Problem Library (adapted for generating PTSP instances)"; } 38 31 } 39 32 40 33 protected override string FileExtension { get { return "tsp"; } } 41 42 public override IEnumerable<IDataDescriptor> GetDataDescriptors() {43 var tspDescriptors = base.GetDataDescriptors().OfType<TSPLIBDataDescriptor>();44 foreach (var desc in tspDescriptors) {45 foreach (var p in probabilities) {46 yield return new TSPLIBHomogeneousPTSPDataDescriptor(47 desc.Name + "-" + p.ToString(CultureInfo.InvariantCulture.NumberFormat),48 desc.Description,49 desc.InstanceIdentifier,50 p == 1.0 ? desc.SolutionIdentifier : null,51 p);52 }53 }54 }55 34 56 35 protected override PTSPData LoadInstance(TSPLIBParser parser, IDataDescriptor descriptor = null) { … … 90 69 + Environment.NewLine + Environment.NewLine 91 70 + GetInstanceDescription(); 92 var ptspDesc = descriptor as TSPLIBHomogeneousPTSPDataDescriptor;93 instance.Probabilities = ptspDesc != null ? Enumerable.Range(0, instance.Dimension).Select(_ => ptspDesc.Probability).ToArray()94 : Enumerable.Range(0, instance.Dimension).Select(_ => 0.5).ToArray();95 71 72 instance.Probabilities = GetProbabilities(descriptor, instance); 96 73 return instance; 97 74 } 75 76 protected abstract double[] GetProbabilities(IDataDescriptor descriptor, PTSPData instance); 98 77 99 78 protected override void LoadSolution(TSPLIBParser parser, PTSPData instance) {
Note: See TracChangeset
for help on using the changeset viewer.