Changeset 14610 for branches/OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode3.cs
- Timestamp:
- 01/26/17 14:12:39 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/OptimizationNetworks/HeuristicLab.Networks.IntegratedOptimization.TravelingThief/3.3/TtpOrchestratorNode3.cs
r14604 r14610 21 21 22 22 using System; 23 using System.Collections.Generic;24 23 using System.Linq; 25 using System.Threading;26 24 using HeuristicLab.Common; 27 25 using HeuristicLab.Core; … … 31 29 using HeuristicLab.Encodings.PermutationEncoding; 32 30 using HeuristicLab.Encodings.RealVectorEncoding; 33 using HeuristicLab.Operators;34 31 using HeuristicLab.Optimization; 35 using HeuristicLab.Parameters;36 32 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 37 33 using HeuristicLab.Problems.Knapsack; … … 41 37 [Item("TtpOrchestratorNode3", "Orchestrator for TTP optimization network version 3.")] 42 38 [StorableClass] 43 public sealed class TtpOrchestratorNode3 : OrchestratorNode { 44 #region Constants 45 private const string InstanceParameterName = "Instance"; 46 private const string TspParameterName = "TSP"; 47 private const string KspParameterName = "KSP"; 48 private const string AvailabilityParameterName = "Availability"; 49 private const string MinSpeedParameterName = "MinSpeed"; 50 private const string MaxSpeedParameterName = "MaxSpeed"; 51 private const string RentingRatioParameterName = "RentingRatio"; 52 private const string MetaSolverName = "MetaSolver"; 53 private const string TspSolverName = "TspSolver"; 54 private const string KspSolverName = "KspSolver"; 55 #endregion 56 57 private CancellationTokenSource cts; 58 private ResultCollection tspResults, kspResults; 59 60 [Storable] 61 double[,] tspCoordinates; 62 [Storable] 63 TtpUtils.DistanceType distanceType; 64 [Storable] 65 int kspCapacity; 66 [Storable] 67 int[] kspItemWeights, kspItemValues, ttpAvailability; 68 [Storable] 69 double ttpMinSpeed, ttpMaxSpeed, ttpRentingRatio; 70 71 #region Parameters 72 public IFixedValueParameter<TextFileValue> InstanceParameter { 73 get { return (IFixedValueParameter<TextFileValue>)Parameters[InstanceParameterName]; } 74 } 75 76 public IValueParameter<TravelingSalesmanProblem> TspParameter { 77 get { return (IValueParameter<TravelingSalesmanProblem>)Parameters[TspParameterName]; } 78 } 79 80 public IValueParameter<BinaryKnapsackProblem> KspParameter { 81 get { return (IValueParameter<BinaryKnapsackProblem>)Parameters[KspParameterName]; } 82 } 83 84 public IValueParameter<IntArray> AvailabilityParameter { 85 get { return (IValueParameter<IntArray>)Parameters[AvailabilityParameterName]; } 86 } 87 88 public IValueParameter<DoubleValue> MinSpeedParameter { 89 get { return (IValueParameter<DoubleValue>)Parameters[MinSpeedParameterName]; } 90 } 91 92 public IValueParameter<DoubleValue> MaxSpeedParameter { 93 get { return (IValueParameter<DoubleValue>)Parameters[MaxSpeedParameterName]; } 94 } 95 96 public IValueParameter<DoubleValue> RentingRatioParameter { 97 get { return (IValueParameter<DoubleValue>)Parameters[RentingRatioParameterName]; } 98 } 99 #endregion 100 101 #region Ports 102 public IMessagePort MetaSolverOrchestrationPort { 103 get { return (IMessagePort)Ports[MetaSolverName + OrchestrationPortNameSuffix]; } 104 } 105 106 public IMessagePort MetaSolverEvaluationPort { 107 get { return (IMessagePort)Ports[MetaSolverName + EvaluationPortNameSuffix]; } 108 } 109 110 public IMessagePort TspSolverOrchestrationPort { 111 get { return (IMessagePort)Ports[TspSolverName + OrchestrationPortNameSuffix]; } 112 } 113 114 public IMessagePort TspSolverEvaluationPort { 115 get { return (IMessagePort)Ports[TspSolverName + EvaluationPortNameSuffix]; } 116 } 117 118 public IMessagePort KspSolverOrchestrationPort { 119 get { return (IMessagePort)Ports[KspSolverName + OrchestrationPortNameSuffix]; } 120 } 121 122 public IMessagePort KspSolverEvaluationPort { 123 get { return (IMessagePort)Ports[KspSolverName + EvaluationPortNameSuffix]; } 124 } 125 #endregion 126 39 public sealed class TtpOrchestratorNode3 : TtpOrchestratorNode { 127 40 [StorableConstructor] 128 41 private TtpOrchestratorNode3(bool deserializing) : base(deserializing) { } 129 private TtpOrchestratorNode3(TtpOrchestratorNode3 original, Cloner cloner) : base(original, cloner) { 130 tspCoordinates = (double[,])original.tspCoordinates.Clone(); 131 kspCapacity = original.kspCapacity; 132 kspItemWeights = (int[])original.kspItemWeights.Clone(); 133 kspItemValues = (int[])original.kspItemValues.Clone(); 134 ttpAvailability = (int[])original.ttpAvailability.Clone(); 135 ttpMinSpeed = original.ttpMinSpeed; 136 ttpMaxSpeed = original.ttpMaxSpeed; 137 ttpRentingRatio = original.ttpRentingRatio; 138 139 RegisterEvents(); 140 } 42 private TtpOrchestratorNode3(TtpOrchestratorNode3 original, Cloner cloner) : base(original, cloner) { } 141 43 public TtpOrchestratorNode3() : this("TtpOrchestratorNode3") { } 142 public TtpOrchestratorNode3(string name) : base(name) { 143 #region Configure Parameters 144 Parameters.Add(new FixedValueParameter<TextFileValue>(InstanceParameterName)); 145 Parameters.Add(new ValueParameter<TravelingSalesmanProblem>(TspParameterName, new TravelingSalesmanProblem())); 146 Parameters.Add(new ValueParameter<BinaryKnapsackProblem>(KspParameterName, new BinaryKnapsackProblem())); 147 Parameters.Add(new ValueParameter<IntArray>(AvailabilityParameterName)); 148 Parameters.Add(new ValueParameter<DoubleValue>(MinSpeedParameterName, new DoubleValue(0.1))); 149 Parameters.Add(new ValueParameter<DoubleValue>(MaxSpeedParameterName, new DoubleValue(1.0))); 150 Parameters.Add(new ValueParameter<DoubleValue>(RentingRatioParameterName, new DoubleValue(0.5))); 151 #endregion 152 153 #region Configure Ports 154 AddOrchestrationPort<VariegationProblem>(MetaSolverName); 155 AddEvaluationPort<RealVector>(MetaSolverName, "RealVector", "Quality"); 156 AddOrchestrationPort<TravelingSalesmanProblem>(TspSolverName); 157 AddEvaluationPort<Permutation>(TspSolverName, "TSPTour", "TSPTourLength"); 158 AddOrchestrationPort<BinaryKnapsackProblem>(KspSolverName); 159 AddEvaluationPort<BinaryVector>(KspSolverName, "KnapsackSolution", "Quality"); 160 161 RegisterEvents(); 162 #endregion 163 } 44 public TtpOrchestratorNode3(string name) : base(name) { } 164 45 165 46 public override IDeepCloneable Clone(Cloner cloner) { … … 167 48 } 168 49 169 [StorableHook(HookType.AfterDeserialization)]170 private void AfterDeserialization() {171 RegisterEvents();172 }173 174 private void RegisterEvents() {175 InstanceParameter.Value.ToStringChanged += InstanceParameter_Value_ToStringChanged;176 MetaSolverOrchestrationPort.ConnectedPortChanged += MetaSolverOrchestrationPort_ConnectedPortChanged;177 TspSolverOrchestrationPort.ConnectedPortChanged += TspSolverOrchestrationPort_ConnectedPortChanged;178 KspSolverOrchestrationPort.ConnectedPortChanged += KspSolverOrchestrationPort_ConnectedPortChanged;179 }180 181 private void InstanceParameter_Value_ToStringChanged(object sender, EventArgs e) {182 string filePath = InstanceParameter.Value.Value;183 TtpUtils.Import(filePath, out tspCoordinates, out distanceType,184 out kspCapacity, out kspItemValues, out kspItemWeights,185 out ttpAvailability, out ttpMinSpeed, out ttpMaxSpeed, out ttpRentingRatio);186 187 var tsp = TspParameter.Value;188 tsp.Coordinates = new DoubleMatrix(tspCoordinates);189 190 var ksp = KspParameter.Value;191 ksp.KnapsackCapacity.Value = kspCapacity;192 ksp.Encoding.Length = kspItemValues.Length;193 ksp.Values = new IntArray(kspItemValues);194 ksp.Weights = new IntArray(kspItemWeights);195 196 AvailabilityParameter.Value = new IntArray(ttpAvailability);197 MinSpeedParameter.Value.Value = ttpMinSpeed;198 MaxSpeedParameter.Value.Value = ttpMaxSpeed;199 RentingRatioParameter.Value.Value = ttpRentingRatio;200 }201 202 public override void Prepare() {203 Results.Clear();204 205 var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();206 metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.QualityAdaption);207 var problem = new VariegationProblem();208 problem.Encoding.Length = KspParameter.Value.Length + TspParameter.Value.Coordinates.Rows * 2;209 problem.Encoding.Bounds = new DoubleMatrix(new[,] { { -1.0, 1.0 } });210 metaMsg["Problem"] = problem;211 MetaSolverOrchestrationPort.SendMessage(metaMsg);212 }213 214 public override void Start() {215 cts = new CancellationTokenSource();216 217 try {218 var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();219 metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Start);220 MetaSolverOrchestrationPort.SendMessage(metaMsg);221 } catch (Exception e) { }222 }223 224 public override void Pause() {225 cts.Cancel();226 227 var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();228 metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Pause);229 MetaSolverOrchestrationPort.SendMessage(metaMsg);230 231 var tspMsg = TspSolverOrchestrationPort.PrepareMessage();232 tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);233 TspSolverOrchestrationPort.SendMessage(tspMsg);234 235 var kspMsg = KspSolverOrchestrationPort.PrepareMessage();236 kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);237 KspSolverOrchestrationPort.SendMessage(kspMsg);238 }239 240 public override void Stop() {241 cts.Cancel();242 243 var metaMsg = MetaSolverOrchestrationPort.PrepareMessage();244 metaMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);245 MetaSolverOrchestrationPort.SendMessage(metaMsg);246 247 var tspMsg = TspSolverOrchestrationPort.PrepareMessage();248 tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);249 TspSolverOrchestrationPort.SendMessage(tspMsg);250 251 var kspMsg = KspSolverOrchestrationPort.PrepareMessage();252 kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Stop);253 KspSolverOrchestrationPort.SendMessage(kspMsg);254 }255 256 protected override void ProcessMessage(IMessage message, IMessagePort port, CancellationToken token) {257 var messageActions = new Dictionary<IMessagePort, Action<IMessage>>();258 messageActions.Add(MetaSolverOrchestrationPort, MetaSolverOrchestrationPortMessage);259 messageActions.Add(MetaSolverEvaluationPort, MetaSolverEvaluationPortMessage);260 messageActions.Add(TspSolverOrchestrationPort, TspSolverOrchestrationPortMessage);261 messageActions.Add(TspSolverEvaluationPort, TspSolverEvaluationPortMessage);262 messageActions.Add(KspSolverOrchestrationPort, KspSolverOrchestrationPortMessage);263 messageActions.Add(KspSolverEvaluationPort, KspSolverEvaluationPortMessage);264 265 messageActions[port](message);266 267 base.ProcessMessage(message, port, token);268 }269 270 50 #region MetaSolver Message Handling 271 private void MetaSolverOrchestrationPortMessage(IMessage message) { } 272 273 private void MetaSolverEvaluationPortMessage(IMessage message) { 51 protected override void MetaSolverEvaluationPortMessage(IMessage message) { 274 52 var factors = (RealVector)message["RealVector"]; 275 53 int fi = 0; … … 282 60 283 61 var kspMsg = KspSolverOrchestrationPort.PrepareMessage(); 284 kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage. Start);62 kspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start); 285 63 kspMsg["Problem"] = ksp; 286 64 KspSolverOrchestrationPort.SendMessage(kspMsg); … … 302 80 303 81 var tspMsg = TspSolverOrchestrationPort.PrepareMessage(); 304 tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage. Start);82 tspMsg["OrchestrationMessage"] = new EnumValue<OrchestrationMessage>(OrchestrationMessage.Prepare | OrchestrationMessage.ClearRuns | OrchestrationMessage.Start); 305 83 var tpp = new TourProfitProblem { 306 84 Tsp = (TravelingSalesmanProblem)TspParameter.Value.Clone(), … … 332 110 Results.Add(new Result("Best Tour", tour)); 333 111 Results.Add(new Result("Best Loot", loot)); 334 } else if ( ((DoubleValue)bestQuality.Value).Value < objectiveValue) {112 } else if (objectiveValue > ((DoubleValue)bestQuality.Value).Value) { 335 113 ((DoubleValue)bestQuality.Value).Value = objectiveValue; 336 114 Results["Best Tour"].Value = tour; … … 340 118 } 341 119 #endregion 342 343 #region TspSolver Message Handling344 private void TspSolverOrchestrationPortMessage(IMessage message) {345 var results = (ResultCollection)message["Results"];346 if (results.ContainsKey("Best TSP Solution")) {347 tspResults = results;348 }349 }350 351 private void TspSolverEvaluationPortMessage(IMessage message) { }352 #endregion353 354 #region KspSolver Message Handling355 private void KspSolverOrchestrationPortMessage(IMessage message) {356 var results = (ResultCollection)message["Results"];357 if (results.ContainsKey("Best Solution")) {358 kspResults = results;359 }360 }361 362 private void KspSolverEvaluationPortMessage(IMessage message) { }363 #endregion364 365 #region Event Handlers366 private void MetaSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {367 if (MetaSolverOrchestrationPort.ConnectedPort == null) return;368 369 var node = MetaSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;370 if (node == null) return;371 372 var hook = new HookOperator { Name = "Meta Eval Hook" };373 hook.Parameters.Add(new LookupParameter<RealVector>("RealVector") { Hidden = true });374 hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = true });375 node.EvalHook = hook;376 377 node.OrchestrationPort.CloneParametersFromPort(MetaSolverOrchestrationPort);378 node.EvaluationPort.CloneParametersFromPort(MetaSolverEvaluationPort);379 node.EvaluationPort.ConnectedPort = MetaSolverEvaluationPort;380 }381 382 private void TspSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {383 if (TspSolverOrchestrationPort.ConnectedPort == null) return;384 385 var node = TspSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;386 if (node == null) return;387 388 var hook = new HookOperator { Name = "TSP Eval Hook" };389 hook.Parameters.Add(new LookupParameter<Permutation>("TSPTour") { Hidden = true });390 hook.Parameters.Add(new LookupParameter<DoubleValue>("TSPTourLength") { Hidden = true });391 node.EvalHook = hook;392 393 node.OrchestrationPort.CloneParametersFromPort(TspSolverOrchestrationPort);394 node.EvaluationPort.CloneParametersFromPort(TspSolverEvaluationPort);395 node.EvaluationPort.ConnectedPort = TspSolverEvaluationPort;396 }397 398 private void KspSolverOrchestrationPort_ConnectedPortChanged(object sender, EventArgs e) {399 if (KspSolverOrchestrationPort.ConnectedPort == null) return;400 401 var node = KspSolverOrchestrationPort.ConnectedPort.Parent as OrchestratedAlgorithmNode;402 if (node == null) return;403 404 var hook = new HookOperator { Name = "KSP Eval Hook" };405 hook.Parameters.Add(new LookupParameter<BinaryVector>("KnapsackSolution") { Hidden = true });406 hook.Parameters.Add(new LookupParameter<DoubleValue>("Quality") { Hidden = true });407 node.EvalHook = hook;408 409 node.OrchestrationPort.CloneParametersFromPort(KspSolverOrchestrationPort);410 node.EvaluationPort.CloneParametersFromPort(KspSolverEvaluationPort);411 node.EvaluationPort.ConnectedPort = KspSolverEvaluationPort;412 }413 #endregion414 120 } 415 121 }
Note: See TracChangeset
for help on using the changeset viewer.