Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/ProblemInstances/SingleDepotVRP/CVRP/CVRPProblemInstance.cs @ 13578

Last change on this file since 13578 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.4 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("CVRPProblemInstance", "Represents a single depot CVRP instance.")]
37  [StorableClass]
38  public class CVRPProblemInstance : SingleDepotVRPProblemInstance, IHomogenousCapacitatedProblemInstance {
39    protected IValueParameter<DoubleValue> CapacityParameter {
40      get { return (IValueParameter<DoubleValue>)Parameters["Capacity"]; }
41    }
42    protected IValueParameter<DoubleValue> OverloadPenaltyParameter {
43      get { return (IValueParameter<DoubleValue>)Parameters["EvalOverloadPenalty"]; }
44    }
45
46    public DoubleValue 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 IHomogenousCapacitatedOperator).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 CVRPEvaluator();
83      }
84    }
85
86    [StorableConstructor]
87    protected CVRPProblemInstance(bool deserializing) : base(deserializing) { }
88
89    public CVRPProblemInstance() {
90      Parameters.Add(new ValueParameter<DoubleValue>("Capacity", "The capacity of each vehicle.", new DoubleValue(0)));
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 CVRPProblemInstance(this, cloner);
99    }
100
101    protected CVRPProblemInstance(CVRPProblemInstance 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      CapacityParameter.Value.ValueChanged += new EventHandler(Capacity_ValueChanged);
114      OverloadPenaltyParameter.ValueChanged += new EventHandler(OverloadPenaltyParameter_ValueChanged);
115      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
116    }
117
118    public override void InitializeState() {
119      base.InitializeState();
120
121      CurrentOverloadPenaltyParameter.Value = null;
122    }
123
124    #region Event handlers
125    void CapacityParameter_ValueChanged(object sender, EventArgs e) {
126      CapacityParameter.Value.ValueChanged += new EventHandler(Capacity_ValueChanged);
127      EvalBestKnownSolution();
128    }
129    void Capacity_ValueChanged(object sender, EventArgs e) {
130      EvalBestKnownSolution();
131    }
132    void OverloadPenaltyParameter_ValueChanged(object sender, EventArgs e) {
133      OverloadPenaltyParameter.Value.ValueChanged += new EventHandler(OverloadPenalty_ValueChanged);
134      EvalBestKnownSolution();
135    }
136    void OverloadPenalty_ValueChanged(object sender, EventArgs e) {
137      EvalBestKnownSolution();
138    }
139    #endregion
140  }
141}
Note: See TracBrowser for help on using the repository browser.