Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2522_RefactorPluginInfrastructure/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/MultiDepotVRP/MDCVRP/MDCVRPProblemInstance.cs @ 15651

Last change on this file since 15651 was 12488, checked in by pfleck, 10 years ago

#2400

  • Interfaces for Capaciated-, PickupAndDelivery- and TimeWindowed-ProblemInstances now specify an additional penalty parameter to set the current penalty factor for the constraint relaxation.
  • The setter of the penalty-property in the ProblemInstances is removed.
  • A CurrentPenalty property is added for setting the adapted penalty value from the relaxation analyzers. These properties are explicitly implemented to "hide" the setter from the API, so that it wont be used unaware of the relaxation mechanics.
  • Hide the CurrentPenaltyParameters for same reasons to avoid setting it unwarily.
  • Added additional infos in the error message off the VRPInstances unit-test.
File size: 5.2 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using HeuristicLab.Common;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.Optimization;
29using HeuristicLab.Parameters;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31using HeuristicLab.PluginInfrastructure;
32using HeuristicLab.Problems.VehicleRouting.Interfaces;
33using HeuristicLab.Problems.VehicleRouting.Variants;
34
35namespace HeuristicLab.Problems.VehicleRouting.ProblemInstances {
36  [Item("MDCVRPProblemInstance", "Represents a multi depot CVRP instance.")]
37  [StorableClass]
38  public class MDCVRPProblemInstance : MultiDepotVRPProblemInstance, IHeterogenousCapacitatedProblemInstance {
39    protected IValueParameter<DoubleArray> CapacityParameter {
40      get { return (IValueParameter<DoubleArray>)Parameters["Capacity"]; }
41    }
42    protected IValueParameter<DoubleValue> OverloadPenaltyParameter {
43      get { return (IValueParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
44    }
45
46    public DoubleArray Capacity {
47      get { return CapacityParameter.Value; }
48      set { CapacityParameter.Value = value; }
49    }
50
51    protected IValueParameter<DoubleValue> CurrentOverloadPenaltyParameter {
52      get { return (IValueParameter<DoubleValue>)Parameters["CurrentOverloadPenalty"]; }
53    }
54
55    public DoubleValue OverloadPenalty {
56      get {
57        DoubleValue currentOverloadPenalty = CurrentOverloadPenaltyParameter.Value;
58        if (currentOverloadPenalty != null)
59          return currentOverloadPenalty;
60        else
61          return OverloadPenaltyParameter.Value;
62      }
63    }
64    DoubleValue ICapacitatedProblemInstance.CurrentOverloadPenalty {
65      get { return CurrentOverloadPenaltyParameter.Value; }
66      set { CurrentOverloadPenaltyParameter.Value = value; }
67    }
68
69    protected override IEnumerable<IOperator> GetOperators() {
70      return base.GetOperators()
71        .Where(o => o is IHeterogenousCapacitatedOperator).Cast<IOperator>();
72    }
73
74    protected override IEnumerable<IOperator> GetAnalyzers() {
75      return ApplicationManager.Manager.GetInstances<ICapacitatedOperator>()
76        .Where(o => o is IAnalyzer)
77        .Cast<IOperator>().Union(base.GetAnalyzers());
78    }
79
80    protected override IVRPEvaluator Evaluator {
81      get {
82        return new MDCVRPEvaluator();
83      }
84    }
85
86    [StorableConstructor]
87    protected MDCVRPProblemInstance(bool deserializing) : base(deserializing) { }
88
89    public MDCVRPProblemInstance() {
90      Parameters.Add(new ValueParameter<DoubleArray>("Capacity", "The capacity of each vehicle.", new DoubleArray()));
91      Parameters.Add(new ValueParameter<DoubleValue>("EvalOverloadPenalty", "The overload penalty considered in the evaluation.", new DoubleValue(100)));
92      Parameters.Add(new OptionalValueParameter<DoubleValue>("CurrentOverloadPenalty", "The current overload penalty considered in the evaluation.") { Hidden = true });
93
94      AttachEventHandlers();
95    }
96
97    public override IDeepCloneable Clone(Cloner cloner) {
98      return new MDCVRPProblemInstance(this, cloner);
99    }
100
101    protected MDCVRPProblemInstance(MDCVRPProblemInstance original, Cloner cloner)
102      : base(original, cloner) {
103      AttachEventHandlers();
104    }
105
106    [StorableHook(HookType.AfterDeserialization)]
107    private void AfterDeserialization() {
108      AttachEventHandlers();
109    }
110
111    private void AttachEventHandlers() {
112      CapacityParameter.ValueChanged += new EventHandler(CapacityParameter_ValueChanged);
113      OverloadPenaltyParameter.ValueChanged += new EventHandler(OverloadPenaltyParameter_ValueChanged);
114      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
115    }
116
117    public override void InitializeState() {
118      base.InitializeState();
119
120      CurrentOverloadPenaltyParameter.Value = null;
121    }
122
123    #region Event handlers
124    void CapacityParameter_ValueChanged(object sender, EventArgs e) {
125      EvalBestKnownSolution();
126    }
127    void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
128      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
129      EvalBestKnownSolution();
130    }
131    void OverloadPenalty_ValueChanged(object sender, EventArgs e) {
132      EvalBestKnownSolution();
133    }
134    #endregion
135  }
136}
Note: See TracBrowser for help on using the repository browser.