Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 3667 was 3667, checked in by svonolfe, 14 years ago
  • Updated OneMax analyzer
  • Updated Knapsack analyzer
  • Fixed bug in OneMax and TF analyzer views

(#999)

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