Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.Knapsack/3.3/KnapsackProblem.cs @ 3789

Last change on this file since 3789 was 3789, checked in by abeham, 14 years ago

#893

  • Updated wiring of problem specific analyzers
File size: 15.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Drawing;
25using System.Linq;
26using HeuristicLab.Common;
27using HeuristicLab.Core;
28using HeuristicLab.Data;
29using HeuristicLab.Encodings.BinaryVectorEncoding;
30using HeuristicLab.Optimization;
31using HeuristicLab.Parameters;
32using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
33using HeuristicLab.PluginInfrastructure;
34using HeuristicLab.Problems.Knapsack.Analyzers;
35
36namespace HeuristicLab.Problems.Knapsack {
37  [Item("Knapsack Problem", "Represents a Knapsack Problem.")]
38  [Creatable("Problems")]
39  [StorableClass]
40  public sealed class KnapsackProblem : ParameterizedNamedItem, ISingleObjectiveProblem {
41    public override Image ItemImage {
42      get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Type; }
43    }
44
45    #region Parameter Properties
46    public ValueParameter<BoolValue> MaximizationParameter {
47      get { return (ValueParameter<BoolValue>)Parameters["Maximization"]; }
48    }
49    IParameter ISingleObjectiveProblem.MaximizationParameter {
50      get { return MaximizationParameter; }
51    }
52    public ValueParameter<IntValue> KnapsackCapacityParameter {
53      get { return (ValueParameter<IntValue>)Parameters["KnapsackCapacity"]; }
54    }
55    public ValueParameter<IntArray> WeightsParameter {
56      get { return (ValueParameter<IntArray>)Parameters["Weights"]; }
57    }
58    public ValueParameter<IntArray> ValuesParameter {
59      get { return (ValueParameter<IntArray>)Parameters["Values"]; }
60    }
61    public ValueParameter<DoubleValue> PenaltyParameter {
62      get { return (ValueParameter<DoubleValue>)Parameters["Penalty"]; }
63    }
64    public ValueParameter<IBinaryVectorCreator> SolutionCreatorParameter {
65      get { return (ValueParameter<IBinaryVectorCreator>)Parameters["SolutionCreator"]; }
66    }
67    IParameter IProblem.SolutionCreatorParameter {
68      get { return SolutionCreatorParameter; }
69    }
70    public ValueParameter<IKnapsackEvaluator> EvaluatorParameter {
71      get { return (ValueParameter<IKnapsackEvaluator>)Parameters["Evaluator"]; }
72    }
73    IParameter IProblem.EvaluatorParameter {
74      get { return EvaluatorParameter; }
75    }
76    public OptionalValueParameter<DoubleValue> BestKnownQualityParameter {
77      get { return (OptionalValueParameter<DoubleValue>)Parameters["BestKnownQuality"]; }
78    }
79    IParameter ISingleObjectiveProblem.BestKnownQualityParameter {
80      get { return BestKnownQualityParameter; }
81    }
82    public OptionalValueParameter<BinaryVector> BestKnownSolutionParameter {
83      get { return (OptionalValueParameter<BinaryVector>)Parameters["BestKnownSolution"]; }
84    }
85    #endregion
86
87    #region Properties
88    public IntValue KnapsackCapacity {
89      get { return KnapsackCapacityParameter.Value; }
90      set { KnapsackCapacityParameter.Value = value; }
91    }
92    public IntArray Weights {
93      get { return WeightsParameter.Value; }
94      set { WeightsParameter.Value = value; }
95    }
96    public IntArray Values {
97      get { return ValuesParameter.Value; }
98      set { ValuesParameter.Value = value; }
99    }
100    public DoubleValue Penalty {
101      get { return PenaltyParameter.Value; }
102      set { PenaltyParameter.Value = value; }
103    }
104    public IBinaryVectorCreator SolutionCreator {
105      get { return SolutionCreatorParameter.Value; }
106      set { SolutionCreatorParameter.Value = value; }
107    }
108    ISolutionCreator IProblem.SolutionCreator {
109      get { return SolutionCreatorParameter.Value; }
110    }
111    public IKnapsackEvaluator Evaluator {
112      get { return EvaluatorParameter.Value; }
113      set { EvaluatorParameter.Value = value; }
114    }
115    ISingleObjectiveEvaluator ISingleObjectiveProblem.Evaluator {
116      get { return EvaluatorParameter.Value; }
117    }
118    IEvaluator IProblem.Evaluator {
119      get { return EvaluatorParameter.Value; }
120    }
121    public DoubleValue BestKnownQuality {
122      get { return BestKnownQualityParameter.Value; }
123      set { BestKnownQualityParameter.Value = value; }
124    }
125    public BinaryVector BestKnownSolution {
126      get { return BestKnownSolutionParameter.Value; }
127      set { BestKnownSolutionParameter.Value = value; }
128    }
129    private List<IOperator> operators;
130    public IEnumerable<IOperator> Operators {
131      get { return operators.Cast<IOperator>(); }
132    }
133    private BestKnapsackSolutionAnalyzer BestKnapsackSolutionAnalyzer {
134      get { return operators.OfType<BestKnapsackSolutionAnalyzer>().FirstOrDefault(); }
135    }
136    #endregion
137
138    private void InitializeRandomKnapsackInstance() {
139      System.Random rand = new System.Random();
140
141      int itemCount = rand.Next(10, 100);
142      Weights = new IntArray(itemCount);
143      Values = new IntArray(itemCount);
144
145      double totalWeight = 0;
146
147      for (int i = 0; i < itemCount; i++ ) {
148        int value = rand.Next(1, 10);
149        int weight = rand.Next(1, 10);
150
151        Values[i] = value;
152        Weights[i] = weight;
153        totalWeight += weight;
154      }
155
156      int capacity = (int)Math.Round(0.7 * totalWeight);
157      KnapsackCapacity = new IntValue(capacity);
158    }
159
160    public KnapsackProblem()
161      : base() {
162      RandomBinaryVectorCreator creator = new RandomBinaryVectorCreator();
163      KnapsackEvaluator evaluator = new KnapsackEvaluator();
164
165      Parameters.Add(new ValueParameter<BoolValue>("Maximization", "Set to true as the Knapsack Problem is a maximization problem.", new BoolValue(true)));
166      Parameters.Add(new ValueParameter<IntValue>("KnapsackCapacity", "Capacity of the Knapsack.", new IntValue(0)));
167      Parameters.Add(new ValueParameter<IntArray>("Weights", "The weights of the items.", new IntArray(5)));
168      Parameters.Add(new ValueParameter<IntArray>("Values", "The values of the items.", new IntArray(5)));
169      Parameters.Add(new ValueParameter<DoubleValue>("Penalty", "The penalty value for each unit of overweight.", new DoubleValue(1)));
170      Parameters.Add(new ValueParameter<IBinaryVectorCreator>("SolutionCreator", "The operator which should be used to create new Knapsack solutions.", creator));
171      Parameters.Add(new ValueParameter<IKnapsackEvaluator>("Evaluator", "The operator which should be used to evaluate Knapsack solutions.", evaluator));
172      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this Knapsack instance."));
173      Parameters.Add(new OptionalValueParameter<BinaryVector>("BestKnownSolution", "The best known solution of this Knapsack instance."));
174
175      creator.BinaryVectorParameter.ActualName = "KnapsackSolution";
176
177      InitializeRandomKnapsackInstance();
178     
179      ParameterizeSolutionCreator();
180      ParameterizeEvaluator();
181
182      Initialize();
183    }
184
185    [StorableConstructor]
186    private KnapsackProblem(bool deserializing) : base() { }
187
188    public override IDeepCloneable Clone(Cloner cloner) {
189      KnapsackProblem clone = (KnapsackProblem)base.Clone(cloner);
190      clone.Initialize();
191      return clone;
192    }
193
194    #region Events
195    public event EventHandler SolutionCreatorChanged;
196    private void OnSolutionCreatorChanged() {
197      EventHandler handler = SolutionCreatorChanged;
198      if (handler != null) handler(this, EventArgs.Empty);
199    }
200    public event EventHandler EvaluatorChanged;
201    private void OnEvaluatorChanged() {
202      EventHandler handler = EvaluatorChanged;
203      if (handler != null) handler(this, EventArgs.Empty);
204    }
205    public event EventHandler OperatorsChanged;
206    private void OnOperatorsChanged() {
207      EventHandler handler = OperatorsChanged;
208      if (handler != null) handler(this, EventArgs.Empty);
209    }
210    public event EventHandler Reset;
211    private void OnReset() {
212      EventHandler handler = Reset;
213      if (handler != null) handler(this, EventArgs.Empty);
214    }
215
216    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
217      SolutionCreator.BinaryVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_BinaryVectorParameter_ActualNameChanged);
218      ParameterizeSolutionCreator();
219      ParameterizeEvaluator();
220      ParameterizeAnalyzer();
221      ParameterizeOperators();
222      OnSolutionCreatorChanged();
223    }
224    private void SolutionCreator_BinaryVectorParameter_ActualNameChanged(object sender, EventArgs e) {
225      ParameterizeEvaluator();
226      ParameterizeAnalyzer();
227      ParameterizeOperators();
228    }
229    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
230      ParameterizeEvaluator();
231      ParameterizeAnalyzer();
232      OnEvaluatorChanged();
233    }
234    void KnapsackCapacityParameter_ValueChanged(object sender, EventArgs e) {
235      ParameterizeEvaluator();
236      ParameterizeAnalyzer();
237    }
238    void WeightsParameter_ValueChanged(object sender, EventArgs e) {
239      ParameterizeEvaluator();
240      ParameterizeAnalyzer();
241      ParameterizeSolutionCreator();
242
243      WeightsParameter.Value.Reset += new EventHandler(WeightsValue_Reset);
244    }
245    void WeightsValue_Reset(object sender, EventArgs e) {
246      ParameterizeSolutionCreator();
247
248      if (WeightsParameter.Value != null && ValuesParameter.Value != null)
249        ((IStringConvertibleArray)ValuesParameter.Value).Length = WeightsParameter.Value.Length;
250    }
251    void ValuesParameter_ValueChanged(object sender, EventArgs e) {
252      ParameterizeEvaluator();
253      ParameterizeAnalyzer();
254      ParameterizeSolutionCreator();
255
256      ValuesParameter.Value.Reset += new EventHandler(ValuesValue_Reset);
257    }
258    void ValuesValue_Reset(object sender, EventArgs e) {
259      ParameterizeSolutionCreator();
260
261      if (WeightsParameter.Value != null && ValuesParameter.Value != null)
262        ((IStringConvertibleArray)WeightsParameter.Value).Length = ValuesParameter.Value.Length;
263    }
264    void PenaltyParameter_ValueChanged(object sender, EventArgs e) {
265      ParameterizeEvaluator();
266    }
267    void OneBitflipMoveParameter_ActualNameChanged(object sender, EventArgs e) {
268      string name = ((ILookupParameter<OneBitflipMove>)sender).ActualName;
269      foreach (IOneBitflipMoveOperator op in Operators.OfType<IOneBitflipMoveOperator>()) {
270        op.OneBitflipMoveParameter.ActualName = name;
271      }
272    }
273    #endregion
274
275    #region Helpers
276    [StorableHook(HookType.AfterDeserialization)]
277    private void Initialize() {
278      InitializeOperators();
279      SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
280      SolutionCreator.BinaryVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_BinaryVectorParameter_ActualNameChanged);
281      EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
282      KnapsackCapacityParameter.ValueChanged += new EventHandler(KnapsackCapacityParameter_ValueChanged);
283      WeightsParameter.ValueChanged += new EventHandler(WeightsParameter_ValueChanged);
284      WeightsParameter.Value.Reset += new EventHandler(WeightsValue_Reset);
285      ValuesParameter.ValueChanged += new EventHandler(ValuesParameter_ValueChanged);
286      ValuesParameter.Value.Reset += new EventHandler(ValuesValue_Reset);
287      PenaltyParameter.ValueChanged += new EventHandler(PenaltyParameter_ValueChanged);
288    }
289    private void ParameterizeSolutionCreator() {
290      if(SolutionCreator.LengthParameter.Value == null ||
291        SolutionCreator.LengthParameter.Value.Value != WeightsParameter.Value.Length)
292        SolutionCreator.LengthParameter.Value = new IntValue(WeightsParameter.Value.Length);
293    }
294    private void ParameterizeEvaluator() {
295      if (Evaluator is KnapsackEvaluator) {
296        KnapsackEvaluator knapsackEvaluator =
297          (KnapsackEvaluator)Evaluator;
298        knapsackEvaluator.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
299        knapsackEvaluator.KnapsackCapacityParameter.ActualName = KnapsackCapacityParameter.Name;
300        knapsackEvaluator.WeightsParameter.ActualName = WeightsParameter.Name;
301        knapsackEvaluator.ValuesParameter.ActualName = ValuesParameter.Name;
302        knapsackEvaluator.PenaltyParameter.ActualName = PenaltyParameter.Name;
303      }
304    }
305    private void ParameterizeAnalyzer() {
306      BestKnapsackSolutionAnalyzer.MaximizationParameter.ActualName = MaximizationParameter.Name;
307      BestKnapsackSolutionAnalyzer.BestKnownQualityParameter.ActualName = BestKnownQualityParameter.Name;
308      BestKnapsackSolutionAnalyzer.BestKnownSolutionParameter.ActualName = BestKnownSolutionParameter.Name;
309      BestKnapsackSolutionAnalyzer.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
310      BestKnapsackSolutionAnalyzer.KnapsackCapacityParameter.ActualName = KnapsackCapacityParameter.Name;
311      BestKnapsackSolutionAnalyzer.WeightsParameter.ActualName = WeightsParameter.Name;
312      BestKnapsackSolutionAnalyzer.ValuesParameter.ActualName = ValuesParameter.Name;
313      BestKnapsackSolutionAnalyzer.ResultsParameter.ActualName = "Results";
314    }
315    private void InitializeOperators() {
316      operators = new List<IOperator>();
317      operators.Add(new BestKnapsackSolutionAnalyzer());
318      ParameterizeAnalyzer();
319      foreach (IBinaryVectorOperator op in ApplicationManager.Manager.GetInstances<IBinaryVectorOperator>()) {
320        if (!(op is ISingleObjectiveMoveEvaluator) || (op is IKnapsackMoveEvaluator)) {
321          operators.Add(op);
322        }
323      }
324      ParameterizeOperators();
325      InitializeMoveGenerators();
326    }
327    private void InitializeMoveGenerators() {
328      foreach (IOneBitflipMoveOperator op in Operators.OfType<IOneBitflipMoveOperator>()) {
329        if (op is IMoveGenerator) {
330          op.OneBitflipMoveParameter.ActualNameChanged += new EventHandler(OneBitflipMoveParameter_ActualNameChanged);
331        }
332      }
333    }
334    private void ParameterizeOperators() {
335      foreach (IBinaryVectorCrossover op in Operators.OfType<IBinaryVectorCrossover>()) {
336        op.ParentsParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
337        op.ChildParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
338      }
339      foreach (IBinaryVectorManipulator op in Operators.OfType<IBinaryVectorManipulator>()) {
340        op.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
341      }
342      foreach (IBinaryVectorMoveOperator op in Operators.OfType<IBinaryVectorMoveOperator>()) {
343        op.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
344      }
345      foreach (IKnapsackMoveEvaluator op in Operators.OfType<IKnapsackMoveEvaluator>()) {
346        op.KnapsackCapacityParameter.ActualName = KnapsackCapacityParameter.Name;
347        op.PenaltyParameter.ActualName = PenaltyParameter.Name;
348        op.WeightsParameter.ActualName = WeightsParameter.Name;
349        op.ValuesParameter.ActualName = ValuesParameter.Name;
350      }
351    }
352    #endregion
353  }
354}
Note: See TracBrowser for help on using the repository browser.